You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@netbeans.apache.org by GitBox <gi...@apache.org> on 2018/06/29 19:33:15 UTC

[GitHub] junichi11 closed pull request #615: Integrate existing patches

junichi11 closed pull request #615: Integrate existing patches
URL: https://github.com/apache/incubator-netbeans/pull/615
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/php.api.phpmodule/manifest.mf b/php.api.phpmodule/manifest.mf
index e35bbc6f1e..afcfdb0330 100644
--- a/php.api.phpmodule/manifest.mf
+++ b/php.api.phpmodule/manifest.mf
@@ -1,4 +1,4 @@
 Manifest-Version: 1.0
 OpenIDE-Module: org.netbeans.modules.php.api.phpmodule
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/php/api/phpmodule/resources/Bundle.properties
-OpenIDE-Module-Specification-Version: 2.60
+OpenIDE-Module-Specification-Version: 2.61
diff --git a/php.api.phpmodule/src/org/netbeans/modules/php/api/PhpVersion.java b/php.api.phpmodule/src/org/netbeans/modules/php/api/PhpVersion.java
index e1932df3cc..b9cbf38654 100644
--- a/php.api.phpmodule/src/org/netbeans/modules/php/api/PhpVersion.java
+++ b/php.api.phpmodule/src/org/netbeans/modules/php/api/PhpVersion.java
@@ -55,6 +55,7 @@
     "PhpVersion.PHP_56=PHP 5.6",
     "PhpVersion.PHP_70=PHP 7.0",
     "PhpVersion.PHP_71=PHP 7.1",
+    "PhpVersion.PHP_72=PHP 7.2",
 })
 public enum PhpVersion {
 
@@ -88,7 +89,12 @@
      * PHP 7.1.
      * @since 2.60
      */
-    PHP_71(Bundle.PhpVersion_PHP_71());
+    PHP_71(Bundle.PhpVersion_PHP_71()),
+    /**
+     * PHP 7.2.
+     * @since 2.61
+     */
+    PHP_72(Bundle.PhpVersion_PHP_72());
 
     private final String displayName;
     private final boolean namespaces;
diff --git a/php.dbgp/nbproject/project.xml b/php.dbgp/nbproject/project.xml
index 024352dce3..6560936c69 100644
--- a/php.dbgp/nbproject/project.xml
+++ b/php.dbgp/nbproject/project.xml
@@ -132,6 +132,15 @@ Contributor(s):
                         <specification-version>2.0</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.mimelookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.41</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.netbeans.modules.lexer</code-name-base>
                     <build-prerequisite/>
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BreakpointsReader.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BreakpointsReader.java
index 90eae9d0c2..3d0deaf53b 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BreakpointsReader.java
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BreakpointsReader.java
@@ -47,11 +47,8 @@
 import java.net.URL;
 import org.netbeans.api.debugger.Properties;
 import org.netbeans.modules.php.dbgp.breakpoints.FunctionBreakpoint.Type;
-import org.openide.cookies.LineCookie;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.URLMapper;
-import org.openide.loaders.DataObject;
-import org.openide.loaders.DataObjectNotFoundException;
 import org.openide.text.Line;
 
 /**
@@ -59,8 +56,7 @@
  * @author ads
  */
 public class BreakpointsReader implements Properties.Reader {
-    private static final String LINE_NUMBER = "lineNumber"; // NOI18N
-    private static final String URL = "url"; // NOI18N
+
     private static final String ENABED = "enabled"; // NOI18N
     private static final String FUNC_NAME = "functionName"; // NOI18N
     private static final String TYPE = "type"; // NOI18N
@@ -77,7 +73,7 @@
     @Override
     public Object read(String typeID, Properties properties) {
         if (typeID.equals(LineBreakpoint.class.getName())) {
-            Line line = getLine(properties.getString(URL, null), properties.getInt(LINE_NUMBER, 1));
+            Line line = getLine(properties.getString(LineBreakpoint.PROP_URL, null), properties.getInt(LineBreakpoint.PROP_LINE_NUMBER, 1));
             if (line == null) {
                 return null;
             }
@@ -86,6 +82,7 @@ public Object read(String typeID, Properties properties) {
                 breakpoint.disable();
             }
             breakpoint.setGroupName(properties.getString(GROUP_NAME, ""));
+            breakpoint.setCondition(properties.getString(LineBreakpoint.PROP_CONDITION, null));
             return breakpoint;
         } else if (typeID.equals(FunctionBreakpoint.class.getName())) {
             String func = properties.getString(FUNC_NAME, null);
@@ -109,10 +106,11 @@ public void write(Object object, Properties properties) {
         if (object instanceof LineBreakpoint) {
             LineBreakpoint breakpoint = (LineBreakpoint) object;
             FileObject fileObject = breakpoint.getLine().getLookup().lookup(FileObject.class);
-            properties.setString(URL, fileObject.toURL().toString());
-            properties.setInt(LINE_NUMBER, breakpoint.getLine().getLineNumber());
+            properties.setString(LineBreakpoint.PROP_URL, fileObject.toURL().toString());
+            properties.setInt(LineBreakpoint.PROP_LINE_NUMBER, breakpoint.getLine().getLineNumber());
             properties.setBoolean(ENABED, breakpoint.isEnabled());
             properties.setString(GROUP_NAME, breakpoint.getGroupName());
+            properties.setString(LineBreakpoint.PROP_CONDITION, breakpoint.getCondition());
         } else if (object instanceof FunctionBreakpoint) {
             FunctionBreakpoint breakpoint = (FunctionBreakpoint) object;
             String func = breakpoint.getFunction();
@@ -128,28 +126,7 @@ private Line getLine(String url, int lineNumber) {
         if (file == null) {
             return null;
         }
-        DataObject dataObject;
-        try {
-            dataObject = DataObject.find(file);
-        } catch (DataObjectNotFoundException ex) {
-            return null;
-        }
-        if (dataObject == null) {
-            return null;
-        }
-        LineCookie lineCookie = dataObject.getLookup().lookup(LineCookie.class);
-        if (lineCookie == null) {
-            return null;
-        }
-        Line.Set ls = lineCookie.getLineSet();
-        if (ls == null) {
-            return null;
-        }
-        try {
-            return ls.getCurrent(lineNumber);
-        } catch (IndexOutOfBoundsException e) {
-            return null;
-        }
+        return Utils.getLine(file, lineNumber);
     }
 
     private FileObject getFileObject(String url) {
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BrkptsViewActionProvider.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BrkptsViewActionProvider.java
index ba53a636d9..3e569e643b 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BrkptsViewActionProvider.java
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/BrkptsViewActionProvider.java
@@ -43,13 +43,25 @@
  */
 package org.netbeans.modules.php.dbgp.breakpoints;
 
+import java.awt.Dialog;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import javax.swing.Action;
-
+import org.netbeans.modules.php.dbgp.ui.DbgpLineBreakpointCustomizer;
+import org.netbeans.modules.php.dbgp.ui.DbgpLineBreakpointCustomizerPanel;
+import org.netbeans.spi.debugger.ui.Controller;
 import org.netbeans.spi.viewmodel.Models;
 import org.netbeans.spi.viewmodel.NodeActionsProvider;
 import org.netbeans.spi.viewmodel.NodeActionsProviderFilter;
 import org.netbeans.spi.viewmodel.UnknownTypeException;
+import org.openide.DialogDescriptor;
+import org.openide.DialogDisplayer;
+import org.openide.NotificationLineSupport;
+import org.openide.NotifyDescriptor;
 import org.openide.text.Line;
+import org.openide.util.HelpCtx;
 import org.openide.util.NbBundle;
 
 /**
@@ -63,10 +75,12 @@
     public Action[] getActions(NodeActionsProvider original, Object node) throws UnknownTypeException {
         Action[] actions = original.getActions(node);
         if (node instanceof LineBreakpoint) {
-            Action[] newActions = new Action[actions.length + 2];
+            Action[] newActions = new Action[actions.length + 4];
             newActions[0] = GO_TO_SOURCE_ACTION;
             newActions[1] = null;
             System.arraycopy(actions, 0, newActions, 2, actions.length);
+            newActions[newActions.length - 2] = null;
+            newActions[newActions.length - 1] = CUSTOMIZE_ACTION;
             actions = newActions;
         }
         return actions;
@@ -87,6 +101,64 @@ private static void goToSource(LineBreakpoint breakpoint) {
             line.show(Line.ShowOpenType.REUSE, Line.ShowVisibilityType.FOCUS);
         }
     }
+
+    @NbBundle.Messages("CTL_Breakpoint_Customizer_Title=Breakpoint Properties")
+    private static void customize(LineBreakpoint lb) {
+        DbgpLineBreakpointCustomizerPanel panel = DbgpLineBreakpointCustomizer.getCustomizerComponent(lb);
+        HelpCtx helpCtx = HelpCtx.findHelp(panel);
+        if (helpCtx == null) {
+            helpCtx = new HelpCtx("debug.add.breakpoint"); // NOI18N
+        }
+
+        Controller controller = panel.getController();
+        if (controller == null) {
+            return;
+        }
+
+        final Controller[] cPtr = new Controller[]{controller};
+        final DialogDescriptor[] descriptorPtr = new DialogDescriptor[1];
+        final Dialog[] dialogPtr = new Dialog[1];
+        final PropertyChangeListener propertyChangeListener = (PropertyChangeEvent e) -> {
+            if (e.getPropertyName().equals(NotifyDescriptor.PROP_ERROR_NOTIFICATION)) {
+                Object v = e.getNewValue();
+                String message = (v == null) ? null : v.toString();
+                descriptorPtr[0].getNotificationLineSupport().setErrorMessage(message);
+            } else if (e.getPropertyName().equals(Controller.PROP_VALID)) {
+                descriptorPtr[0].setValid(controller.isValid());
+            }
+        };
+        controller.addPropertyChangeListener(propertyChangeListener);
+        ActionListener buttonsActionListener = (ActionEvent e) -> {
+            if (descriptorPtr[0].getValue() == DialogDescriptor.OK_OPTION) {
+                boolean ok = cPtr[0].ok();
+                if (ok) {
+                    dialogPtr[0].setVisible(false);
+                    cPtr[0].removePropertyChangeListener(propertyChangeListener);
+                }
+            } else {
+                dialogPtr[0].setVisible(false);
+                cPtr[0].removePropertyChangeListener(propertyChangeListener);
+            }
+        };
+        DialogDescriptor descriptor = new DialogDescriptor(
+                panel,
+                Bundle.CTL_Breakpoint_Customizer_Title(),
+                true,
+                DialogDescriptor.OK_CANCEL_OPTION,
+                DialogDescriptor.OK_OPTION,
+                DialogDescriptor.DEFAULT_ALIGN,
+                helpCtx,
+                buttonsActionListener
+        );
+        descriptor.setClosingOptions(new Object[]{});
+        descriptor.createNotificationLineSupport();
+        Dialog d = DialogDisplayer.getDefault().createDialog(descriptor);
+        d.pack();
+        descriptorPtr[0] = descriptor;
+        dialogPtr[0] = d;
+        d.setVisible(true);
+    }
+
     private static final Action GO_TO_SOURCE_ACTION = Models.createAction(
             NbBundle.getMessage(BrkptsViewActionProvider.class, GO_TO_SOURCE_LABEL),
             new GoToSourcePerformer(),
@@ -106,4 +178,24 @@ public void perform(Object[] nodes) {
 
     }
 
+    @NbBundle.Messages("CTL_Breakpoint_Customize_Label=Properties")
+    private static final Action CUSTOMIZE_ACTION = Models.createAction(
+            Bundle.CTL_Breakpoint_Customize_Label(),
+            new CustomizePerformer(),
+            Models.MULTISELECTION_TYPE_EXACTLY_ONE
+    );
+
+    private static class CustomizePerformer implements Models.ActionPerformer {
+
+        @Override
+        public boolean isEnabled(Object node) {
+            return true;
+        }
+
+        @Override
+        public void perform(Object[] nodes) {
+            customize((LineBreakpoint) nodes[0]);
+        }
+    }
+
 }
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/DbgpLineBreakpointType.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/DbgpLineBreakpointType.java
new file mode 100644
index 0000000000..52ee3c984d
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/DbgpLineBreakpointType.java
@@ -0,0 +1,115 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.dbgp.breakpoints;
+
+import javax.swing.JComponent;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import org.netbeans.api.editor.EditorRegistry;
+import org.netbeans.api.editor.document.LineDocumentUtils;
+import org.netbeans.editor.BaseDocument;
+import org.netbeans.modules.editor.NbEditorUtilities;
+import org.netbeans.modules.php.api.util.FileUtils;
+import org.netbeans.modules.php.dbgp.ui.DbgpLineBreakpointCustomizerPanel;
+import org.netbeans.spi.debugger.ui.BreakpointType;
+import org.netbeans.spi.debugger.ui.Controller;
+import org.openide.filesystems.FileObject;
+import org.openide.text.Line;
+import org.openide.util.NbBundle;
+
+@NbBundle.Messages({
+    "DbgpLineBreakpointType.CategoryDisplayName=PHP",
+    "DbgpLineBreakpointType.TypeDisplayName=Line"
+})
+@BreakpointType.Registration(displayName = "#DbgpLineBreakpointType.TypeDisplayName")
+public class DbgpLineBreakpointType extends BreakpointType {
+
+    private Controller controller;
+
+    @Override
+    public String getCategoryDisplayName() {
+        return Bundle.DbgpLineBreakpointType_CategoryDisplayName();
+    }
+
+    @Override
+    public String getTypeDisplayName() {
+        return Bundle.DbgpLineBreakpointType_TypeDisplayName();
+    }
+
+    @Override
+    public JComponent getCustomizer() {
+        JTextComponent lastFocusedComponent = EditorRegistry.lastFocusedComponent();
+        Line line;
+        if (lastFocusedComponent != null) {
+            FileObject fileObject = NbEditorUtilities.getFileObject(lastFocusedComponent.getDocument());
+            int caretPosition = lastFocusedComponent.getCaretPosition();
+            try {
+                int lineNumber = LineDocumentUtils.getLineIndex((BaseDocument) lastFocusedComponent.getDocument(), caretPosition);
+                line = Utils.getLine(fileObject, lineNumber);
+            } catch (BadLocationException ex) {
+                line = null;
+            }
+        } else {
+            line = null;
+        }
+        DbgpLineBreakpointCustomizerPanel customizer = new DbgpLineBreakpointCustomizerPanel(line);
+        controller = customizer.getController();
+        return customizer;
+    }
+
+    @Override
+    public Controller getController() {
+        return controller;
+    }
+
+    @Override
+    public boolean isDefault() {
+        JTextComponent lastFocusedComponent = EditorRegistry.lastFocusedComponent();
+        if (lastFocusedComponent == null) {
+            return false;
+        }
+        FileObject fileObject = NbEditorUtilities.getFileObject(lastFocusedComponent.getDocument());
+        if (fileObject == null) {
+            return false;
+        }
+        return FileUtils.isPhpFile(fileObject);
+    }
+
+}
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpoint.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpoint.java
index 9a9672b56a..64372a7113 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpoint.java
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpoint.java
@@ -61,6 +61,7 @@
 import org.netbeans.editor.BaseDocument;
 import org.netbeans.editor.Utilities;
 import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.spi.support.CancelSupport;
 import org.netbeans.modules.parsing.api.ParserManager;
 import org.netbeans.modules.parsing.api.ResultIterator;
 import org.netbeans.modules.parsing.api.Source;
@@ -79,6 +80,7 @@
 import org.openide.filesystems.FileChangeListener;
 import org.openide.filesystems.FileEvent;
 import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileRenameEvent;
 import org.openide.loaders.DataObject;
 import org.openide.text.DataEditorSupport;
 import org.openide.text.Line;
@@ -87,17 +89,26 @@
 import org.openide.util.WeakListeners;
 
 /**
+ * If this class name is changed, {@link LineBreakpointBeanInfo} class name must
+ * be changed.
  *
  * @author ads
  */
 public class LineBreakpoint extends AbstractBreakpoint {
+
     private static final Logger LOGGER = Logger.getLogger(LineBreakpoint.class.getName());
     private static final RequestProcessor RP = new RequestProcessor(LineBreakpoint.class);
+    public static final String PROP_URL = "url"; // NOI18N
+    public static final String PROP_LINE_NUMBER = "lineNumber"; // NOI18N
+    public static final String PROP_CONDITION = "condition"; // NOI18N
+
     private final Line myLine;
     private final FileRemoveListener myListener;
     private FileChangeListener myWeakListener;
     private final String myFileUrl;
     private final Future<Boolean> isValidFuture;
+    // @GuardedBy("this")
+    private String condition;
 
     public LineBreakpoint(Line line) {
         myLine = line;
@@ -188,6 +199,24 @@ public String getFileUrl() {
         return myFileUrl;
     }
 
+    public synchronized final String getCondition() {
+        return condition;
+    }
+
+    public synchronized final void setCondition(String condition) {
+        String oldCondition = this.condition;
+        if ((condition != null && condition.equals(oldCondition))
+                || (condition == null && oldCondition == null)) {
+            return;
+        }
+        this.condition = condition;
+        firePropertyChange(PROP_CONDITION, oldCondition, condition);
+    }
+
+    public synchronized final boolean isConditional() {
+        return condition != null && !condition.isEmpty();
+    }
+
     @Override
     public int isTemp() {
         return 0;
@@ -215,6 +244,11 @@ public GroupProperties getGroupProperties() {
         return new PhpGroupProperties();
     }
 
+    void fireLineNumberChanged() {
+        int lineNumber = getLine().getLineNumber();
+        firePropertyChange(PROP_LINE_NUMBER, null, lineNumber);
+    }
+
     //~ Inner classes
 
     private final class PhpGroupProperties extends GroupProperties {
@@ -277,6 +311,12 @@ public void fileDeleted(FileEvent arg0) {
                     LineBreakpoint.this);
         }
 
+        @Override
+        public void fileRenamed(FileRenameEvent fe) {
+            FileObject renamedFo = fe.getFile();
+            firePropertyChange(PROP_URL, myFileUrl, renamedFo.toURL().toString());
+        }
+
     }
 
     private static final class StatementVisitor extends DefaultVisitor {
@@ -291,6 +331,9 @@ private StatementVisitor(int contentStart, int contentEnd) {
 
         @Override
         public void scan(ASTNode node) {
+            if (CancelSupport.getDefault().isCancelled()) {
+                return;
+            }
             if (node != null) {
                 OffsetRange nodeRange = new OffsetRange(node.getStartOffset(), node.getEndOffset());
                 if (node instanceof Statement && nodeRange.containsInclusive(contentStart) && nodeRange.containsInclusive(contentEnd)) {
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpointBeanInfo.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpointBeanInfo.java
new file mode 100644
index 0000000000..866c47a4de
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/LineBreakpointBeanInfo.java
@@ -0,0 +1,67 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.dbgp.breakpoints;
+
+import java.beans.BeanDescriptor;
+import java.beans.SimpleBeanInfo;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.openide.util.Lookup;
+
+/**
+ * Don't change this class name. If it is changed, {@link LineBreakpoint} class name
+ * must be changed.
+ */
+public class LineBreakpointBeanInfo extends SimpleBeanInfo {
+
+    private static final Logger LOGGER = Logger.getLogger(LineBreakpointBeanInfo.class.getName());
+
+    @Override
+    public BeanDescriptor getBeanDescriptor() {
+        Class customizer = null;
+        try {
+            customizer = Class.forName("org.netbeans.modules.php.dbgp.ui.DbgpLineBreakpointCustomizer", // NOI18N
+                    true, Lookup.getDefault().lookup(ClassLoader.class));
+        } catch (ClassNotFoundException cnfex) {
+            LOGGER.log(Level.WARNING, "No BP customizer", cnfex); // NOI18N
+        }
+        return new BeanDescriptor(LineBreakpoint.class, customizer);
+    }
+}
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/UpdatePropertiesOnSaveTask.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/UpdatePropertiesOnSaveTask.java
new file mode 100644
index 0000000000..bdf7c6c390
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/UpdatePropertiesOnSaveTask.java
@@ -0,0 +1,99 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.dbgp.breakpoints;
+
+import javax.swing.text.Document;
+import org.netbeans.api.debugger.Breakpoint;
+import org.netbeans.api.debugger.DebuggerManager;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.modules.editor.NbEditorUtilities;
+import org.netbeans.modules.php.api.util.FileUtils;
+import org.netbeans.spi.editor.document.OnSaveTask;
+import org.openide.filesystems.FileObject;
+
+/**
+ * Save line number on save.
+ */
+public class UpdatePropertiesOnSaveTask implements OnSaveTask {
+
+    private final Context context;
+
+    private UpdatePropertiesOnSaveTask(Context context) {
+        this.context = context;
+    }
+
+    @Override
+    public void performTask() {
+        Document document = context.getDocument();
+        FileObject fileObject = NbEditorUtilities.getFileObject(document);
+        if (fileObject == null) {
+            return;
+        }
+        String fileUrl = fileObject.toURL().toString();
+        DebuggerManager manager = DebuggerManager.getDebuggerManager();
+        for (Breakpoint breakpoint : manager.getBreakpoints()) {
+            if (breakpoint instanceof LineBreakpoint) {
+                LineBreakpoint lineBreakpoint = (LineBreakpoint) breakpoint;
+                if (fileUrl.equals(lineBreakpoint.getFileUrl())) {
+                    lineBreakpoint.fireLineNumberChanged();
+                }
+            }
+        }
+    }
+
+    @Override
+    public void runLocked(Runnable run) {
+        run.run();
+    }
+
+    @Override
+    public boolean cancel() {
+        return true;
+    }
+
+    @MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = OnSaveTask.Factory.class, position = 1100)
+    public static final class FactoryImpl implements Factory {
+
+        @Override
+        public OnSaveTask createTask(Context context) {
+            return new UpdatePropertiesOnSaveTask(context);
+        }
+    }
+}
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/Utils.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/Utils.java
index e96c1f7078..bc581bf558 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/Utils.java
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/breakpoints/Utils.java
@@ -46,6 +46,7 @@
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.debugger.Breakpoint;
 import org.netbeans.api.debugger.DebuggerManager;
 import org.netbeans.api.options.OptionsDisplayer;
@@ -80,6 +81,12 @@ public static void setLineFactory(LineFactory lineFactory) {
         Utils.lineFactory = lineFactory;
     }
 
+    /**
+     * Get the current line.
+     *
+     * @return the current line if the file is php, otherwise {@code null}.
+     */
+    @CheckForNull
     public static Line getCurrentLine() {
         FileObject fileObject = EditorContextDispatcher.getDefault().getCurrentFile();
 
@@ -90,6 +97,44 @@ public static Line getCurrentLine() {
         return EditorContextDispatcher.getDefault().getCurrentLine();
     }
 
+    /**
+     * Get the Line from FileObject.
+     *
+     * @param file the FileObject
+     * @param lineNumber the line number
+     * @return the line if it is found with the file and the line number,
+     * otherwise {@code null}
+     */
+    @CheckForNull
+    public static Line getLine(FileObject file, int lineNumber) {
+        if (file == null || lineNumber < 0) {
+            return null;
+        }
+
+        DataObject dataObject;
+        try {
+            dataObject = DataObject.find(file);
+        } catch (DataObjectNotFoundException ex) {
+            return null;
+        }
+        if (dataObject == null) {
+            return null;
+        }
+        LineCookie lineCookie = dataObject.getLookup().lookup(LineCookie.class);
+        if (lineCookie == null) {
+            return null;
+        }
+        Line.Set ls = lineCookie.getLineSet();
+        if (ls == null) {
+            return null;
+        }
+        try {
+            return ls.getCurrent(lineNumber);
+        } catch (IndexOutOfBoundsException e) {
+            return null;
+        }
+    }
+
     public static BrkpntSetCommand getCommand(DebugSession session, SessionId id, AbstractBreakpoint breakpoint) {
         if (!breakpoint.isSessionRelated(session)) {
             return null;
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntCommandBuilder.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntCommandBuilder.java
index cffa970567..863d4c6977 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntCommandBuilder.java
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntCommandBuilder.java
@@ -55,10 +55,15 @@
  *
  */
 public final class BrkpntCommandBuilder {
+
     private BrkpntCommandBuilder() {
     }
 
     public static BrkpntSetCommand buildLineBreakpoint(SessionId id, String transactionId, FileObject localFile, int lineNumber) {
+        return buildLineBreakpoint(id, transactionId, localFile, lineNumber, null);
+    }
+
+    public static BrkpntSetCommand buildLineBreakpoint(SessionId id, String transactionId, FileObject localFile, int lineNumber, String condition) {
         if (localFile == null) {
             // #251806
             return null;
@@ -71,13 +76,14 @@ public static BrkpntSetCommand buildLineBreakpoint(SessionId id, String transact
         command.setType(Types.LINE);
         command.setFile(uri);
         command.setLineNumber(lineNumber);
+        command.setExpression(condition);
         return command;
     }
 
     public static BrkpntSetCommand buildLineBreakpoint(SessionId id, String transactionId, LineBreakpoint breakpoint) {
         Line line = breakpoint.getLine();
         FileObject fileObject = line.getLookup().lookup(FileObject.class);
-        BrkpntSetCommand command = buildLineBreakpoint(id, transactionId, fileObject, line.getLineNumber());
+        BrkpntSetCommand command = buildLineBreakpoint(id, transactionId, fileObject, line.getLineNumber(), breakpoint.getCondition());
         if (command != null) {
             command.setBreakpoint(breakpoint);
         }
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntSetCommand.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntSetCommand.java
index c941e43e0c..2d0282a41f 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntSetCommand.java
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/packets/BrkpntSetCommand.java
@@ -158,7 +158,7 @@ public void setLineNumber(int line) {
     }
 
     public void setExpression(String expression) {
-        myException = expression;
+        myExpression = expression;
     }
 
     public void setTemporary(boolean isTemp) {
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/Bundle.properties b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/Bundle.properties
index 2f4350788b..3db71a3fe8 100644
--- a/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/Bundle.properties
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/Bundle.properties
@@ -41,6 +41,7 @@
 # made subject to such option by the copyright holder.
 
 LBL_Settings=Settings
+LBL_Condition=Condition
 LBL_MethodName=&Method Name:
 LBL_StopOn=&Stop On:
 A11_SettingsName=Settings
@@ -88,3 +89,9 @@ LocalFilterPanel.mySuperglobal.AccessibleContext.accessibleDescription=Enable fo
 LocalFilterPanel.myResource.AccessibleContext.accessibleDescription=Enable for resource
 LocalFilterPanel.myNull.AccessibleContext.accessibleDescription=Enable for null type
 LocalFilterPanel.mySelectLbl.AccessibleContext.accessibleName=Select types to show
+DbgpLineBreakpointCustomizerPanel.conditionCheckBox.text=&Condition:
+DbgpLineBreakpointCustomizerPanel.lineNumberTextField.text=
+DbgpLineBreakpointCustomizerPanel.fileTextField.text=
+DbgpLineBreakpointCustomizerPanel.lineNumberLabel.text=&Line Number:
+DbgpLineBreakpointCustomizerPanel.fileLabel.text=&File:
+DbgpLineBreakpointCustomizerPanel.conditionComboBox.toolTipText=Breakpoint is hit when this condition evaluates to true.
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/ControllerProvider.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/ControllerProvider.java
new file mode 100644
index 0000000000..a1622c3fe9
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/ControllerProvider.java
@@ -0,0 +1,47 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.dbgp.ui;
+
+import org.netbeans.spi.debugger.ui.Controller;
+
+public interface ControllerProvider {
+
+    Controller getController();
+}
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizer.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizer.java
new file mode 100644
index 0000000000..63943cdc83
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizer.java
@@ -0,0 +1,97 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.dbgp.ui;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.beans.Customizer;
+import javax.swing.JPanel;
+import org.netbeans.modules.php.dbgp.breakpoints.LineBreakpoint;
+import org.netbeans.spi.debugger.ui.Controller;
+import org.openide.util.NbBundle;
+
+public class DbgpLineBreakpointCustomizer extends JPanel implements Customizer, Controller {
+
+    private static final long serialVersionUID = 3626744241527549679L;
+
+    private LineBreakpoint b;
+    private DbgpLineBreakpointCustomizerPanel c;
+
+    public DbgpLineBreakpointCustomizer() {
+    }
+
+    @NbBundle.Messages("ACSD_Breakpoint_Customizer_Dialog=Customize this breakpoint's properties")
+    public static DbgpLineBreakpointCustomizerPanel getCustomizerComponent(LineBreakpoint lineBreakpoint) {
+        DbgpLineBreakpointCustomizerPanel panel;
+        panel = new DbgpLineBreakpointCustomizerPanel(lineBreakpoint);
+        panel.getAccessibleContext().setAccessibleDescription(Bundle.ACSD_Breakpoint_Customizer_Dialog());
+        return panel;
+    }
+
+    @Override
+    public void setObject(Object bean) {
+        if (!(bean instanceof LineBreakpoint)) {
+            throw new IllegalArgumentException(bean.toString());
+        }
+        this.b = (LineBreakpoint) bean;
+        init(b);
+    }
+
+    private void init(LineBreakpoint b) {
+        c = getCustomizerComponent(b);
+        setLayout(new GridBagLayout());
+        GridBagConstraints gbc = new GridBagConstraints();
+        gbc.fill = GridBagConstraints.BOTH;
+        gbc.weightx = 1.0;
+        gbc.weighty = 1.0;
+        add(c, gbc);
+    }
+
+    @Override
+    public boolean ok() {
+        return c.getController().ok();
+    }
+
+    @Override
+    public boolean cancel() {
+        return c.getController().cancel();
+    }
+
+}
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.form b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.form
new file mode 100644
index 0000000000..52943b3d9a
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.form
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="settingsPanel" max="32767" attributes="0"/>
+          <Component id="conditionPanel" alignment="0" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <Component id="settingsPanel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="conditionPanel" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="settingsPanel">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="Settings">
+              <ResourceString PropertyName="titleX" bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="LBL_Settings" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </TitledBorder>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="lineNumberLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="fileLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="fileTextField" max="32767" attributes="0"/>
+                      <Component id="lineNumberTextField" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="fileLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="fileTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="lineNumberLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="lineNumberTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="fileLabel">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="DbgpLineBreakpointCustomizerPanel.fileLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="lineNumberLabel">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="DbgpLineBreakpointCustomizerPanel.lineNumberLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="fileTextField">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="DbgpLineBreakpointCustomizerPanel.fileTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JTextField" name="lineNumberTextField">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="DbgpLineBreakpointCustomizerPanel.lineNumberTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="conditionPanel">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="Condition">
+              <ResourceString PropertyName="titleX" bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="LBL_Condition" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </TitledBorder>
+          </Border>
+        </Property>
+      </Properties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Component id="conditionCheckBox" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Component id="conditionComboBox" pref="281" max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="conditionCheckBox" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="conditionComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="32767" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JCheckBox" name="conditionCheckBox">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="DbgpLineBreakpointCustomizerPanel.conditionCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="conditionCheckBoxActionPerformed"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JComboBox" name="conditionComboBox">
+          <Properties>
+            <Property name="editable" type="boolean" value="true"/>
+            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+              <StringArray count="0"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/netbeans/modules/php/dbgp/ui/Bundle.properties" key="DbgpLineBreakpointCustomizerPanel.conditionComboBox.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;String&gt;"/>
+          </AuxValues>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java
new file mode 100644
index 0000000000..f173003720
--- /dev/null
+++ b/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java
@@ -0,0 +1,466 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.dbgp.ui;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.File;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import org.netbeans.api.debugger.DebuggerManager;
+import org.netbeans.api.debugger.Properties;
+import org.netbeans.modules.php.dbgp.breakpoints.LineBreakpoint;
+import org.netbeans.modules.php.dbgp.breakpoints.Utils;
+import org.netbeans.spi.debugger.ui.Controller;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.text.Line;
+import org.openide.util.NbBundle;
+
+public class DbgpLineBreakpointCustomizerPanel extends JPanel implements ControllerProvider {
+
+    private static final int MAX_SAVED_CONDITIONS = 10;
+    private static final String BP_CONDITIONS = "BPConditions"; // NOI18N
+    private static final String DEBUGGER_PHP = "debugger.php"; // NOI18N
+    private static final long serialVersionUID = 6364512868561614302L;
+
+    private final LineBreakpoint lineBreakpoint;
+    private final Controller controller;
+    private boolean createBreakpoint;
+
+    private static LineBreakpoint createLineBreakpoint() {
+        Line currentLine = Utils.getCurrentLine();
+        return createLineBreakpoint(currentLine);
+    }
+
+    private static LineBreakpoint createLineBreakpoint(Line line) {
+        if (line != null) {
+            return new LineBreakpoint(line);
+        }
+        return null;
+    }
+
+    public DbgpLineBreakpointCustomizerPanel() {
+        this(createLineBreakpoint(), true);
+        createBreakpoint = true;
+    }
+
+    public DbgpLineBreakpointCustomizerPanel(Line line) {
+        this(createLineBreakpoint(line), true);
+        createBreakpoint = true;
+    }
+
+    public DbgpLineBreakpointCustomizerPanel(LineBreakpoint lineBreakpoint) {
+        this(lineBreakpoint, false);
+    }
+
+    private DbgpLineBreakpointCustomizerPanel(LineBreakpoint lineBreakpoint, boolean isEditable) {
+        this.lineBreakpoint = lineBreakpoint;
+        controller = createController();
+        initComponents();
+
+        DocumentListener defaultDocumentListener = new DocumentListener() {
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                processUpdate();
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {
+                processUpdate();
+            }
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {
+                processUpdate();
+            }
+
+            private void processUpdate() {
+                ((CustomizerController) controller).firePropertyChange();
+            }
+        };
+        fileTextField.setEditable(isEditable);
+        fileTextField.getDocument().addDocumentListener(defaultDocumentListener);
+        lineNumberTextField.setEditable(isEditable);
+        lineNumberTextField.getDocument().addDocumentListener(defaultDocumentListener);
+        Object[] conditions = getSavedConditions();
+        conditionComboBox.setModel(new DefaultComboBoxModel(conditions));
+
+        if (lineBreakpoint != null) {
+            Line line = lineBreakpoint.getLine();
+            FileObject fo = line.getLookup().lookup(FileObject.class);
+            updateComponents(fo, line.getLineNumber() + 1, lineBreakpoint.getCondition());
+        }
+    }
+
+    private void updateComponents(FileObject fileObject, int lineNumber, String condition) {
+        assert SwingUtilities.isEventDispatchThread();
+        if (fileObject != null) {
+            File file = FileUtil.toFile(fileObject);
+            if (file != null) {
+                fileTextField.setText(file.getAbsolutePath());
+            } else {
+                fileTextField.setText(fileObject.toURL().toExternalForm());
+            }
+        }
+
+        lineNumberTextField.setText(Integer.toString(lineNumber));
+
+        if (condition != null && !condition.isEmpty()) {
+            conditionCheckBox.setSelected(true);
+            conditionComboBox.setEnabled(true);
+            conditionComboBox.getEditor().setItem(condition);
+        } else {
+            conditionCheckBox.setSelected(false);
+            conditionComboBox.setEnabled(false);
+        }
+    }
+
+    private static Object[] getSavedConditions() {
+        return Properties.getDefault()
+                .getProperties(DEBUGGER_PHP)
+                .getArray(BP_CONDITIONS, new Object[0]);
+    }
+
+    private static void saveCondition(String condition) {
+        Object[] savedConditions = getSavedConditions();
+        Object[] conditions = null;
+        boolean containsCondition = false;
+        for (int i = 0; i < savedConditions.length; i++) {
+            Object c = savedConditions[i];
+            if (condition.equals(c)) {
+                containsCondition = true;
+                conditions = savedConditions;
+                if (i > 0) {
+                    System.arraycopy(conditions, 0, conditions, 1, i);
+                    conditions[0] = condition;
+                }
+                break;
+            }
+        }
+        if (!containsCondition) {
+            if (savedConditions.length < MAX_SAVED_CONDITIONS) {
+                conditions = new Object[savedConditions.length + 1];
+                conditions[0] = condition;
+                System.arraycopy(savedConditions, 0, conditions, 1, savedConditions.length);
+            } else {
+                conditions = savedConditions;
+                System.arraycopy(conditions, 0, conditions, 1, conditions.length - 1);
+                conditions[0] = condition;
+            }
+        }
+        Properties.getDefault()
+                .getProperties(DEBUGGER_PHP)
+                .setArray(BP_CONDITIONS, conditions);
+    }
+
+    private Controller createController() {
+        return new CustomizerController();
+    }
+
+    @Override
+    public Controller getController() {
+        return controller;
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        settingsPanel = new javax.swing.JPanel();
+        fileLabel = new javax.swing.JLabel();
+        lineNumberLabel = new javax.swing.JLabel();
+        fileTextField = new javax.swing.JTextField();
+        lineNumberTextField = new javax.swing.JTextField();
+        conditionPanel = new javax.swing.JPanel();
+        conditionCheckBox = new javax.swing.JCheckBox();
+        conditionComboBox = new javax.swing.JComboBox<>();
+
+        settingsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "LBL_Settings"))); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(fileLabel, org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "DbgpLineBreakpointCustomizerPanel.fileLabel.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(lineNumberLabel, org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "DbgpLineBreakpointCustomizerPanel.lineNumberLabel.text")); // NOI18N
+
+        fileTextField.setText(org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "DbgpLineBreakpointCustomizerPanel.fileTextField.text")); // NOI18N
+
+        lineNumberTextField.setText(org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "DbgpLineBreakpointCustomizerPanel.lineNumberTextField.text")); // NOI18N
+
+        javax.swing.GroupLayout settingsPanelLayout = new javax.swing.GroupLayout(settingsPanel);
+        settingsPanel.setLayout(settingsPanelLayout);
+        settingsPanelLayout.setHorizontalGroup(
+            settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(settingsPanelLayout.createSequentialGroup()
+                .addGroup(settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(lineNumberLabel)
+                    .addComponent(fileLabel))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(fileTextField)
+                    .addComponent(lineNumberTextField)))
+        );
+        settingsPanelLayout.setVerticalGroup(
+            settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(settingsPanelLayout.createSequentialGroup()
+                .addGroup(settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(fileLabel)
+                    .addComponent(fileTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lineNumberLabel)
+                    .addComponent(lineNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+        );
+
+        conditionPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "LBL_Condition"))); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(conditionCheckBox, org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "DbgpLineBreakpointCustomizerPanel.conditionCheckBox.text")); // NOI18N
+        conditionCheckBox.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                conditionCheckBoxActionPerformed(evt);
+            }
+        });
+
+        conditionComboBox.setEditable(true);
+        conditionComboBox.setToolTipText(org.openide.util.NbBundle.getMessage(DbgpLineBreakpointCustomizerPanel.class, "DbgpLineBreakpointCustomizerPanel.conditionComboBox.toolTipText")); // NOI18N
+
+        javax.swing.GroupLayout conditionPanelLayout = new javax.swing.GroupLayout(conditionPanel);
+        conditionPanel.setLayout(conditionPanelLayout);
+        conditionPanelLayout.setHorizontalGroup(
+            conditionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(conditionPanelLayout.createSequentialGroup()
+                .addComponent(conditionCheckBox)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addComponent(conditionComboBox, 0, 281, Short.MAX_VALUE))
+        );
+        conditionPanelLayout.setVerticalGroup(
+            conditionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(conditionPanelLayout.createSequentialGroup()
+                .addGap(0, 0, 0)
+                .addGroup(conditionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(conditionCheckBox)
+                    .addComponent(conditionComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+            .addComponent(conditionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addComponent(settingsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(conditionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void conditionCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_conditionCheckBoxActionPerformed
+        conditionComboBox.setEnabled(conditionCheckBox.isSelected());
+        if (conditionCheckBox.isSelected()) {
+            conditionComboBox.requestFocusInWindow();
+        }
+    }//GEN-LAST:event_conditionCheckBoxActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JCheckBox conditionCheckBox;
+    private javax.swing.JComboBox<String> conditionComboBox;
+    private javax.swing.JPanel conditionPanel;
+    private javax.swing.JLabel fileLabel;
+    private javax.swing.JTextField fileTextField;
+    private javax.swing.JLabel lineNumberLabel;
+    private javax.swing.JTextField lineNumberTextField;
+    private javax.swing.JPanel settingsPanel;
+    // End of variables declaration//GEN-END:variables
+
+    //~ Inner classes
+    private class CustomizerController implements Controller {
+
+        private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
+        private String errorMessage;
+
+        @Override
+        public boolean ok() {
+            if (!isValid()) {
+                final String message = getErrorMessage();
+                if (message != null) {
+                    if (SwingUtilities.isEventDispatchThread()) {
+                        showMessageDialog(message);
+                    } else {
+                        SwingUtilities.invokeLater(() -> {
+                            showMessageDialog(message);
+                        });
+                    }
+                }
+                return false;
+            }
+
+            String condition = null;
+            if (conditionCheckBox.isSelected()) {
+                condition = conditionComboBox.getSelectedItem().toString().trim();
+            }
+
+            if (createBreakpoint) {
+                String fileName = fileTextField.getText();
+                String lineNumberString = lineNumberTextField.getText();
+                if (fileName == null) {
+                    return false;
+                }
+                File file = new File(fileName.trim());
+                FileObject fileObject = FileUtil.toFileObject(file);
+                if (fileObject == null) {
+                    return false;
+                }
+                Line line = Utils.getLine(fileObject, Integer.parseInt(lineNumberString) - 1);
+                LineBreakpoint lb = createLineBreakpoint(line);
+                setCondition(lb, condition);
+                DebuggerManager.getDebuggerManager().addBreakpoint(lb);
+            } else {
+                setCondition(lineBreakpoint, condition);
+            }
+
+            return true;
+        }
+
+        private void setCondition(LineBreakpoint lb, String condition) {
+            if (condition != null && !condition.isEmpty()) {
+                lb.setCondition(condition);
+                saveCondition(condition);
+            } else {
+                lb.setCondition(null);
+            }
+        }
+
+        @Override
+        public boolean cancel() {
+            return true;
+        }
+
+        @NbBundle.Messages({
+            "CustomizerController.invalid.file=Existing file must be set.",
+            "CustomizerController.invalid.line=Valid line number must be set."
+        })
+        @Override
+        public boolean isValid() {
+            boolean isValid = true;
+            // file
+            String fileName = fileTextField.getText();
+            if (fileName == null || fileName.trim().length() == 0) {
+                setErrorMessage(Bundle.CustomizerController_invalid_file());
+                return false;
+            }
+            File file = new File(fileName.trim());
+            if (!file.exists()) {
+                setErrorMessage(Bundle.CustomizerController_invalid_file());
+                return false;
+            }
+            FileObject fileObject = FileUtil.toFileObject(file);
+            if (fileObject == null) {
+                setErrorMessage(Bundle.CustomizerController_invalid_file());
+                return false;
+            }
+
+            // line number
+            String lineNumberString = lineNumberTextField.getText();
+            if (lineNumberString == null || lineNumberString.trim().length() == 0) {
+                setErrorMessage(Bundle.CustomizerController_invalid_line());
+                return false;
+            }
+            try {
+                int lineNumber = Integer.parseInt(lineNumberTextField.getText());
+                if (lineNumber <= 0) {
+                    setErrorMessage(Bundle.CustomizerController_invalid_line());
+                    return false;
+                }
+            } catch (NumberFormatException nfe) {
+                setErrorMessage(Bundle.CustomizerController_invalid_line());
+                isValid = false;
+            }
+
+            if (isValid) {
+                setErrorMessage(null);
+            }
+            return isValid;
+        }
+
+        @Override
+        public void addPropertyChangeListener(PropertyChangeListener l) {
+            propertyChangeSupport.addPropertyChangeListener(l);
+        }
+
+        @Override
+        public void removePropertyChangeListener(PropertyChangeListener l) {
+            propertyChangeSupport.removePropertyChangeListener(l);
+        }
+
+        void firePropertyChange() {
+            propertyChangeSupport.firePropertyChange(Controller.PROP_VALID, null, null);
+        }
+
+        void setErrorMessage(String message) {
+            errorMessage = message;
+            propertyChangeSupport.firePropertyChange(NotifyDescriptor.PROP_ERROR_NOTIFICATION, null, message);
+        }
+
+        String getErrorMessage() {
+            return errorMessage;
+        }
+
+        private void showMessageDialog(String message) {
+            NotifyDescriptor descr = new NotifyDescriptor.Message(message);
+            DialogDisplayer.getDefault().notify(descr);
+        }
+
+    }
+
+}
diff --git a/php.editor/nbproject/project.properties b/php.editor/nbproject/project.properties
index 955752fbe2..df024ed256 100644
--- a/php.editor/nbproject/project.properties
+++ b/php.editor/nbproject/project.properties
@@ -41,7 +41,7 @@ build.compiler=extJavac
 nbjavac.ignore.missing.enclosing=**/CUP$ASTPHP5Parser$actions.class
 javac.compilerargs=-J-Xmx512m
 nbm.needs.restart=true
-spec.version.base=1.75.0
+spec.version.base=1.76.0
 release.external/predefined_vars.zip=docs/predefined_vars.zip
 sigtest.gen.fail.on.error=false
 
diff --git a/php.editor/nbproject/project.xml b/php.editor/nbproject/project.xml
index d242a054b4..51092d79ab 100644
--- a/php.editor/nbproject/project.xml
+++ b/php.editor/nbproject/project.xml
@@ -323,7 +323,7 @@ Contributor(s):
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <specification-version>2.60</specification-version>
+                        <specification-version>2.61</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/php.editor/src/org/netbeans/modules/php/editor/api/ElementQuery.java b/php.editor/src/org/netbeans/modules/php/editor/api/ElementQuery.java
index 84f483a6f9..1f3ebb0770 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/api/ElementQuery.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/api/ElementQuery.java
@@ -242,6 +242,8 @@ public boolean isFileScope() {
 
         Set<TypeMemberElement> getAccessibleTypeMembers(TypeElement typeElement, TypeElement calledFromEnclosingType);
 
+        Set<TypeMemberElement> getAccessibleMixinTypeMembers(TypeElement typeElement, TypeElement calledFromEnclosingType);
+
         /**
          * @param typeElement
          * @param insideEnclosingType false means that private, protected elements are filtered. True
diff --git a/php.editor/src/org/netbeans/modules/php/editor/api/elements/AliasedClass.java b/php.editor/src/org/netbeans/modules/php/editor/api/elements/AliasedClass.java
index d8f879cf7f..15a47eb7a8 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/api/elements/AliasedClass.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/api/elements/AliasedClass.java
@@ -85,6 +85,11 @@ private ClassElement getClassElement() {
         return Collections.emptyList();
     }
 
+    @Override
+    public Collection<QualifiedName> getFQMixinClassNames() {
+        return getClassElement().getFQMixinClassNames();
+    }
+
     @Override
     public Collection<QualifiedName> getUsedTraits() {
         return getClassElement().getUsedTraits();
diff --git a/php.editor/src/org/netbeans/modules/php/editor/api/elements/ClassElement.java b/php.editor/src/org/netbeans/modules/php/editor/api/elements/ClassElement.java
index 49efa93eae..e2ca43b5ed 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/api/elements/ClassElement.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/api/elements/ClassElement.java
@@ -56,6 +56,7 @@
     @CheckForNull
     QualifiedName getSuperClassName();
     Collection<QualifiedName> getPossibleFQSuperClassNames();
+    Collection<QualifiedName> getFQMixinClassNames();
     boolean isFinal();
     boolean isAbstract();
     boolean isAnonymous();
diff --git a/php.editor/src/org/netbeans/modules/php/editor/completion/CompletionContextFinder.java b/php.editor/src/org/netbeans/modules/php/editor/completion/CompletionContextFinder.java
index d3cf079ac4..30b7b05657 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/completion/CompletionContextFinder.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/completion/CompletionContextFinder.java
@@ -990,7 +990,8 @@ private static boolean isType(Token<PHPTokenId> token) {
                 || id.equals(PHPTokenId.PHP_TYPE_FLOAT)
                 || id.equals(PHPTokenId.PHP_TYPE_INT)
                 || id.equals(PHPTokenId.PHP_TYPE_STRING)
-                || id.equals(PHPTokenId.PHP_TYPE_VOID);
+                || id.equals(PHPTokenId.PHP_TYPE_VOID)
+                || id.equals(PHPTokenId.PHP_TYPE_OBJECT);
     }
 
     private static boolean isComma(Token<PHPTokenId> token) {
diff --git a/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java b/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java
index 9e8555faf6..48c402359e 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java
@@ -125,6 +125,7 @@
 import org.netbeans.modules.php.editor.model.impl.Type;
 import org.netbeans.modules.php.editor.model.impl.VariousUtils;
 import org.netbeans.modules.php.editor.NavUtils;
+import org.netbeans.modules.php.editor.api.elements.TypeMemberElement;
 import org.netbeans.modules.php.editor.options.CodeCompletionPanel.VariablesScope;
 import org.netbeans.modules.php.editor.options.OptionsUtils;
 import org.netbeans.modules.php.editor.parser.PHPParseResult;
@@ -1183,7 +1184,17 @@ private void autoCompleteClassMembers(
                             ElementFilter.forKind(PhpElementKind.TYPE_CONSTANT),
                             ElementFilter.forName(NameKind.caseInsensitivePrefix(request.prefix)),
                             ElementFilter.forInstanceOf(TypeConstantElement.class));
-                    for (final PhpElement phpElement : request.index.getAccessibleTypeMembers(typeScope, enclosingType)) {
+                    HashSet<TypeMemberElement> accessibleTypeMembers = new HashSet<>();
+                    accessibleTypeMembers.addAll(request.index.getAccessibleTypeMembers(typeScope, enclosingType));
+                    // for @mixin tag #241740
+                    if (typeScope instanceof ClassElement) {
+                        ClassElement classElement = (ClassElement) typeScope;
+                        if (!classElement.getFQMixinClassNames().isEmpty()) {
+                            // XXX currently, only when mixins are used directly in the class. should support all cases?
+                            accessibleTypeMembers.addAll(request.index.getAccessibleMixinTypeMembers(typeScope, enclosingType));
+                        }
+                    }
+                    for (final PhpElement phpElement : accessibleTypeMembers) {
                         if (CancelSupport.getDefault().isCancelled()) {
                             return;
                         }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java b/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
index 38a481010f..6cbc93d24e 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
@@ -52,6 +52,7 @@
 import java.util.concurrent.TimeoutException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.regex.Pattern;
 import javax.swing.text.Document;
 import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.lexer.Token;
@@ -256,8 +257,11 @@ public void run(ResultIterator resultIterator) throws Exception {
     private static class ReferenceSpanFinder {
 
         private static final int RECURSION_LIMIT = 100;
-        private int recursionCounter = 0;
+        // e.g.  @var VarType $variable 
+        private static final Pattern INLINE_PHP_VAR_COMMENT_PATTERN = Pattern.compile("^[ \t]*@var[ \t]+.+[ \t]+\\$.+$"); // NOI18N
         private static final Logger LOGGER = Logger.getLogger(DeclarationFinderImpl.class.getName());
+
+        private int recursionCounter = 0;
         private final Model model;
 
         public ReferenceSpanFinder(final Model model) {
@@ -294,6 +298,13 @@ public OffsetRange getReferenceSpan(TokenSequence<PHPTokenId> ts, final int care
                         }
                     }
                 } else if (id.equals(PHPTokenId.PHPDOC_COMMENT)) {
+                    String tokenText = token.text().toString();
+                    if (INLINE_PHP_VAR_COMMENT_PATTERN.matcher(tokenText).matches()) {
+                        OffsetRange offsetRange = getVarCommentOffsetRange(ts, tokenText, caretOffset);
+                        if (offsetRange != null) {
+                            return offsetRange;
+                        }
+                    }
                     PHPDocCommentParser docParser = new PHPDocCommentParser();
                     PHPDocBlock docBlock = docParser.parse(ts.offset() - 3, ts.offset() + token.length(), token.text().toString());
                     ASTNode[] hierarchy = Utils.getNodeHierarchyAtOffset(docBlock, caretOffset);
@@ -349,30 +360,10 @@ public OffsetRange getReferenceSpan(TokenSequence<PHPTokenId> ts, final int care
                         }
                     }
                 } else if (id.equals(PHPTokenId.PHP_COMMENT) && token.text() != null) {
-                    String text = token.text().toString();
-                    final String dollaredVar = "@var";
-                    if (text.contains(dollaredVar)) {
-                        String[] segments = text.split("\\s");
-                        for (int i = 0; i < segments.length; i++) {
-                            String seg = segments[i];
-                            if (seg.equals(dollaredVar) && segments.length > i + 2) {
-                                for (int j = 1; j <= 2; j++) {
-                                    seg = segments[i + j];
-                                    if (seg != null && seg.trim().length() > 0) {
-                                        int indexOf = text.indexOf(seg);
-                                        assert indexOf != -1;
-                                        indexOf += ts.offset();
-                                        OffsetRange range = new OffsetRange(indexOf, indexOf + seg.length());
-                                        if (range.containsInclusive(caretOffset)) {
-                                            return range;
-                                        }
-                                    }
-                                }
-                                return OffsetRange.NONE;
-                            }
-                        }
+                    OffsetRange offsetRange = getVarCommentOffsetRange(ts, token.text().toString(), caretOffset);
+                    if (offsetRange != null) {
+                        return offsetRange;
                     }
-
                 }
             }
             if (caretOffset == startTSOffset) {
@@ -388,6 +379,33 @@ public OffsetRange getReferenceSpan(TokenSequence<PHPTokenId> ts, final int care
             return OffsetRange.NONE;
         }
 
+        @CheckForNull
+        private OffsetRange getVarCommentOffsetRange(TokenSequence<PHPTokenId> ts, String text, int caretOffset) {
+            final String dollaredVar = "@var"; // NOI18N
+            if (text.contains(dollaredVar)) {
+                String[] segments = text.split("[ \t]+"); // NOI18N
+                for (int i = 0; i < segments.length; i++) {
+                    String seg = segments[i];
+                    if (seg.equals(dollaredVar) && segments.length > i + 2) {
+                        for (int j = 1; j <= 2; j++) {
+                            seg = segments[i + j];
+                            if (seg != null && seg.trim().length() > 0) {
+                                int indexOf = text.indexOf(seg);
+                                assert indexOf != -1;
+                                indexOf += ts.offset();
+                                OffsetRange range = new OffsetRange(indexOf, indexOf + seg.length());
+                                if (range.containsInclusive(caretOffset)) {
+                                    return range;
+                                }
+                            }
+                        }
+                        return OffsetRange.NONE;
+                    }
+                }
+            }
+            return null;
+        }
+
         private void logRecursion(TokenSequence<PHPTokenId> ts) {
             CharSequence tokenText = null;
             if (ts != null) {
diff --git a/php.editor/src/org/netbeans/modules/php/editor/csl/FoldingScanner.java b/php.editor/src/org/netbeans/modules/php/editor/csl/FoldingScanner.java
index e5cd107fa0..0abd33a751 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/csl/FoldingScanner.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/csl/FoldingScanner.java
@@ -51,16 +51,23 @@
 import javax.swing.text.Document;
 import org.netbeans.api.editor.fold.FoldTemplate;
 import org.netbeans.api.editor.fold.FoldType;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.editor.BaseDocument;
 import org.netbeans.modules.csl.api.OffsetRange;
 import org.netbeans.modules.csl.spi.ParserResult;
 import org.netbeans.modules.parsing.api.Source;
+import org.netbeans.modules.php.editor.lexer.LexUtilities;
+import org.netbeans.modules.php.editor.lexer.PHPTokenId;
 import org.netbeans.modules.php.editor.model.FileScope;
 import org.netbeans.modules.php.editor.model.FunctionScope;
+import org.netbeans.modules.php.editor.model.GroupUseScope;
 import org.netbeans.modules.php.editor.model.MethodScope;
 import org.netbeans.modules.php.editor.model.Model;
 import org.netbeans.modules.php.editor.model.ModelElement;
 import org.netbeans.modules.php.editor.model.Scope;
 import org.netbeans.modules.php.editor.model.TypeScope;
+import org.netbeans.modules.php.editor.model.UseScope;
 import org.netbeans.modules.php.editor.parser.PHPParseResult;
 import org.netbeans.modules.php.editor.parser.api.Utils;
 import org.netbeans.modules.php.editor.parser.astnodes.ASTError;
@@ -126,6 +133,25 @@
             "array",
             Bundle.FT_Arrays(), new FoldTemplate(0, 0, "[...]")); // NOI18N
 
+    @NbBundle.Messages("FT_Use=Use statements")
+    public static final FoldType TYPE_USE = FoldType.IMPORT.derive(
+            "use", // NOI18N
+            Bundle.FT_Use(),
+            new FoldTemplate(0, 0, "...") // NOI18N
+    );
+
+    /**
+     * PHP tags (&lt;?php...?&gt; blocks).
+     *
+     * <b>NOTE:</b> &lt;?=...?&gt; blocks are not folded.
+     */
+    @NbBundle.Messages("FT_PHPTag=<?php ?> blocks")
+    public static final FoldType TYPE_PHPTAG = FoldType.CODE_BLOCK.derive(
+            "phptag", // NOI18N
+            Bundle.FT_PHPTag(),
+            new FoldTemplate(0, 0, "...") // NOI18N
+    );
+
     private static final String LAST_CORRECT_FOLDING_PROPERTY = "LAST_CORRECT_FOLDING_PROPERY"; //NOI18N
 
     public static FoldingScanner create() {
@@ -166,6 +192,7 @@ private FoldingScanner() {
             Source source = phpParseResult.getSnapshot().getSource();
             assert source != null : "source was null";
             Document doc = source.getDocument(false);
+            processPHPTags(folds, doc);
             setFoldingProperty(doc, folds);
             return folds;
         }
@@ -210,7 +237,56 @@ private void processComments(Map<String, List<OffsetRange>> folds, List<Comment>
         }
     }
 
+    private void processPHPTags(Map<String, List<OffsetRange>> folds, Document document) {
+        if (document instanceof BaseDocument) {
+            BaseDocument doc = (BaseDocument) document;
+            doc.readLock();
+            try {
+                TokenSequence<PHPTokenId> ts = LexUtilities.getPHPTokenSequence(doc, 0);
+                if (ts == null) {
+                    return;
+                }
+                ts.move(0);
+                int startOffset = -1;
+                int endOffset = -1;
+                int shortTagBalance = 0; // for <?= ... ?>
+                while (ts.moveNext()) {
+                    Token<PHPTokenId> token = ts.token();
+                    if (token != null) {
+                        PHPTokenId id = token.id();
+                        switch (id) {
+                            case PHP_OPENTAG:
+                                startOffset = ts.offset() + token.length();
+                                break;
+                            case PHP_CLOSETAG:
+                                if (shortTagBalance == 0) {
+                                    assert startOffset != -1;
+                                    endOffset = ts.offset();
+                                    getRanges(folds, TYPE_PHPTAG).add(new OffsetRange(startOffset, endOffset));
+                                } else {
+                                    shortTagBalance--;
+                                }
+                                break;
+                            case T_OPEN_TAG_WITH_ECHO:
+                                shortTagBalance++;
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                }
+            } finally {
+                doc.readUnlock();
+            }
+        }
+    }
+
     private void processScopes(Map<String, List<OffsetRange>> folds, List<Scope> scopes) {
+        processUseScopes(folds, scopes);
+        processTypeAndFunctionScopes(folds, scopes);
+    }
+
+    private void processTypeAndFunctionScopes(Map<String, List<OffsetRange>> folds, List<Scope> scopes) {
         for (Scope scope : scopes) {
             OffsetRange offsetRange = scope.getBlockRange();
             if (offsetRange == null || offsetRange.getLength() <= 1) {
@@ -226,6 +302,40 @@ private void processScopes(Map<String, List<OffsetRange>> folds, List<Scope> sco
         }
     }
 
+    private void processUseScopes(Map<String, List<OffsetRange>> folds, List<Scope> scopes) {
+        List<Scope> allScopes = new ArrayList<>(scopes);
+        allScopes.sort((o1, o2) -> Integer.compare(o1.getOffset(), o2.getOffset()));
+        int startOffset = -1;
+        OffsetRange lastOffsetRange = OffsetRange.NONE;
+        for (Scope scope : allScopes) {
+            boolean isPartOfGroupUse = false;
+            if (scope instanceof UseScope) {
+                UseScope useScope = (UseScope) scope;
+                isPartOfGroupUse = useScope.isPartOfGroupUse();
+            }
+            if (scope instanceof UseScope || scope instanceof GroupUseScope) {
+                if (!isPartOfGroupUse) {
+                    lastOffsetRange = scope.getNameRange();
+                    if (startOffset == -1) {
+                        startOffset = lastOffsetRange.getStart();
+                    }
+                }
+            } else {
+                // +1 : ";"
+                // XXX ";" may not be the next char
+                addUseScope(startOffset, lastOffsetRange.getEnd() + 1, folds);
+                startOffset = -1;
+            }
+        }
+        addUseScope(startOffset, lastOffsetRange.getEnd() + 1, folds);
+    }
+
+    private void addUseScope(int startOffset, int endOffset, Map<String, List<OffsetRange>> folds) {
+        if (startOffset != -1) {
+            getRanges(folds, TYPE_USE).add(new OffsetRange(startOffset, endOffset));
+        }
+    }
+
     private OffsetRange createOffsetRange(ASTNode node, int startShift) {
         return new OffsetRange(node.getStartOffset() + startShift, node.getEndOffset());
     }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/csl/PHPFoldingProvider.java b/php.editor/src/org/netbeans/modules/php/editor/csl/PHPFoldingProvider.java
index e57569e060..9366ce0dc6 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/csl/PHPFoldingProvider.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/csl/PHPFoldingProvider.java
@@ -45,15 +45,16 @@
 import java.util.Collection;
 import org.netbeans.api.editor.fold.FoldType;
 import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.modules.php.api.util.FileUtils;
 import org.netbeans.spi.editor.fold.FoldTypeProvider;
 
 /**
  *
  * @author sdedic
  */
-@MimeRegistration(mimeType = "text/x-php5", service = FoldTypeProvider.class, position = 1000)
+@MimeRegistration(mimeType = FileUtils.PHP_MIME_TYPE, service = FoldTypeProvider.class, position = 1000)
 public class PHPFoldingProvider implements FoldTypeProvider {
-    private static final Collection<FoldType> TYPES = new ArrayList<>(6);
+    private static final Collection<FoldType> TYPES = new ArrayList<>(8);
 
     static {
         TYPES.add(FoldingScanner.TYPE_CLASS);
@@ -62,6 +63,8 @@
         TYPES.add(FoldingScanner.TYPE_COMMENT);
         TYPES.add(FoldingScanner.TYPE_PHPDOC);
         TYPES.add(FoldingScanner.TYPE_ARRAY);
+        TYPES.add(FoldingScanner.TYPE_USE);
+        TYPES.add(FoldingScanner.TYPE_PHPTAG);
     }
 
     @Override
diff --git a/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java b/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java
index 792ef90c30..2dee06120c 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/elements/ClassElementImpl.java
@@ -72,8 +72,9 @@
     public static final String IDX_FIELD = PHPIndexer.FIELD_CLASS;
 
     private final QualifiedName superClass;
-    private Collection<QualifiedName> possibleFQSuperClassNames;
-    private Collection<QualifiedName> usedTraits;
+    private final Collection<QualifiedName> possibleFQSuperClassNames;
+    private final Collection<QualifiedName> fqMixinClassNames;
+    private final Collection<QualifiedName> usedTraits;
 
     private ClassElementImpl(
             final QualifiedName qualifiedName,
@@ -86,11 +87,13 @@ private ClassElementImpl(
             final Collection<QualifiedName> usedTraits,
             final String fileUrl,
             final ElementQuery elementQuery,
-            final boolean isDeprecated) {
+            final boolean isDeprecated,
+            final Collection<QualifiedName> fqMixinClassNames) {
         super(qualifiedName, offset, ifaceNames, fqSuperInterfaces, flags, fileUrl, elementQuery, isDeprecated);
         this.superClass = superClsName;
         this.possibleFQSuperClassNames = possibleFQSuperClassNames;
         this.usedTraits = usedTraits;
+        this.fqMixinClassNames = fqMixinClassNames;
     }
 
     public static Set<ClassElement> fromSignature(final IndexQueryImpl indexScopeQuery, final IndexResult indexResult) {
@@ -120,7 +123,7 @@ private static ClassElement fromSignature(final NameKind query,
                     signParser.getSuperClassName(), signParser.getPossibleFQSuperClassName(),
                     signParser.getSuperInterfaces(), signParser.getFQSuperInterfaces(), signParser.getFlags(),
                     signParser.getUsedTraits(), signParser.getFileUrl(), indexScopeQuery,
-                    signParser.isDeprecated());
+                    signParser.isDeprecated(), signParser.getFQMixinClassNames());
         }
         return retval;
     }
@@ -130,11 +133,13 @@ public static ClassElement fromNode(final NamespaceElement namespace, final Clas
         Parameters.notNull("fileQuery", fileQuery);
         ClassDeclarationInfo info = ClassDeclarationInfo.create(node);
         final QualifiedName fullyQualifiedName = namespace != null ? namespace.getFullyQualifiedName() : QualifiedName.createForDefaultNamespaceName();
+        // XXX mixin
         return new ClassElementImpl(
                 fullyQualifiedName.append(info.getName()), info.getRange().getStart(),
                 info.getSuperClassName(), Collections.<QualifiedName>emptySet(), info.getInterfaceNames(),
                 Collections.<QualifiedName>emptySet(), info.getAccessModifiers().toFlags(), info.getUsedTraits(),
-                fileQuery.getURL().toExternalForm(), fileQuery, VariousUtils.isDeprecatedFromPHPDoc(fileQuery.getResult().getProgram(), node));
+                fileQuery.getURL().toExternalForm(), fileQuery, VariousUtils.isDeprecatedFromPHPDoc(fileQuery.getResult().getProgram(), node),
+                Collections.<QualifiedName>emptySet());
     }
 
     public static ClassElement fromFrameworks(final PhpClass clz, final ElementQuery elementQuery) {
@@ -143,7 +148,8 @@ public static ClassElement fromFrameworks(final PhpClass clz, final ElementQuery
         String fullyQualifiedName = clz.getFullyQualifiedName();
         ClassElementImpl retval = new ClassElementImpl(QualifiedName.create(fullyQualifiedName == null ? clz.getName() : fullyQualifiedName),
                 clz.getOffset(), null, Collections.<QualifiedName>emptySet(), Collections.<QualifiedName>emptySet(),
-                Collections.<QualifiedName>emptySet(), PhpModifiers.NO_FLAGS, Collections.<QualifiedName>emptySet(), null, elementQuery, false);
+                Collections.<QualifiedName>emptySet(), PhpModifiers.NO_FLAGS, Collections.<QualifiedName>emptySet(), null, elementQuery, false,
+                Collections.<QualifiedName>emptySet());
         retval.setFileObject(clz.getFile());
         return retval;
     }
@@ -168,6 +174,11 @@ public QualifiedName getSuperClassName() {
         return this.possibleFQSuperClassNames;
     }
 
+    @Override
+    public Collection<QualifiedName> getFQMixinClassNames() {
+        return Collections.unmodifiableCollection(fqMixinClassNames);
+    }
+
     @Override
     public String getSignature() {
         StringBuilder sb = new StringBuilder();
@@ -214,6 +225,15 @@ public String getSignature() {
         sb.append(";"); //NOI18N
         sb.append(isDeprecated() ? 1 : 0).append(";"); //NOI18N
         sb.append(getFilenameUrl()).append(Separator.SEMICOLON);
+        StringBuilder mixinSb = new StringBuilder();
+        fqMixinClassNames.forEach((mixinClassName) -> {
+            if (mixinSb.length() > 0) {
+                mixinSb.append(Separator.COMMA);
+            }
+            mixinSb.append(mixinClassName.toString());
+        });
+        sb.append(mixinSb.toString());
+        sb.append(Separator.SEMICOLON);
         checkClassSignature(sb);
         return sb.toString();
     }
@@ -393,5 +413,15 @@ boolean isDeprecated() {
         String getFileUrl() {
             return signature.string(9);
         }
+
+        public Collection<QualifiedName> getFQMixinClassNames() {
+            Collection<QualifiedName> retval = new HashSet<>();
+            String mixins = signature.string(10);
+            final String[] mixinNames = mixins.split(Separator.COMMA.toString());
+            for (String mixinName : mixinNames) {
+                retval.add(QualifiedName.create(mixinName));
+            }
+            return retval;
+        }
     }
 }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java b/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java
index ff8bb7f622..b93eaacbb4 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java
@@ -1039,41 +1039,15 @@ private static void addAllUsedTraits(final Set<TypeElement> traits, TraitedEleme
             EnumSet<PhpElementKind> typeKinds, EnumSet<PhpElementKind> memberKinds) {
         final Set<TypeMemberElement> directTypes = new LinkedHashSet<>();
         if (typeKinds.contains(PhpElementKind.CLASS) && (typeElement instanceof ClassElement)) {
-            final Set<TypeMemberElement> classTypes = new LinkedHashSet<>();
+            ClassElement classElement = (ClassElement) typeElement;
             QualifiedName superClassName;
-            Collection<QualifiedName> possibleFQSuperClassNames = ((ClassElement) typeElement).getPossibleFQSuperClassNames();
+            Collection<QualifiedName> possibleFQSuperClassNames = classElement.getPossibleFQSuperClassNames();
             if (possibleFQSuperClassNames.size() == 1) {
                 superClassName = possibleFQSuperClassNames.iterator().next();
             } else {
-                superClassName = ((ClassElement) typeElement).getSuperClassName();
-            }
-            if (superClassName != null) {
-                classTypes.addAll(extendedQuery.getFields(NameKind.exact(superClassName), NameKind.empty()));
-                classTypes.addAll(extendedQuery.getMethods(NameKind.exact(superClassName), NameKind.empty()));
-                classTypes.addAll(extendedQuery.getTypeConstants(NameKind.exact(superClassName), NameKind.empty()));
-                if (memberKinds.size() != 1) {
-                    classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(getTypeMembers(NameKind.exact(superClassName), NameKind.empty())));
-                } else {
-                    switch(memberKinds.iterator().next()) {
-                        case METHOD:
-                            classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(
-                                    getMethodsImpl(NameKind.exact(superClassName), NameKind.empty(), EnumSet.of(PhpElementKind.CLASS))));
-                            break;
-                        case FIELD:
-                            classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(getFields(NameKind.exact(superClassName), NameKind.empty())));
-                            break;
-                        case TYPE_CONSTANT:
-                            classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(
-                                    getTypeConstantsImpl(NameKind.exact(superClassName), NameKind.empty(), EnumSet.of(PhpElementKind.CLASS))));
-                            break;
-                        default:
-                            //no-op
-                    }
-                }
-                if (classTypes.isEmpty()) {
-                    insertEmptyElement(classTypes, getClasses(NameKind.exact(superClassName)));
-                }
+                superClassName = classElement.getSuperClassName();
             }
+            Set<TypeMemberElement> classTypes = getDirectInheritedClassTypes(superClassName, memberKinds, typeElement);
             directTypes.addAll(classTypes);
         }
         if (typeKinds.contains(PhpElementKind.IFACE)) {
@@ -1140,6 +1114,51 @@ private static void addAllUsedTraits(final Set<TypeElement> traits, TraitedEleme
         return directTypes;
     }
 
+    private Set<TypeMemberElement> getDirectMixinTypeMembers(final TypeElement typeElement,
+            EnumSet<PhpElementKind> typeKinds, EnumSet<PhpElementKind> memberKinds) {
+        final Set<TypeMemberElement> directTypes = new LinkedHashSet<>();
+        if (typeKinds.contains(PhpElementKind.CLASS) && (typeElement instanceof ClassElement)) {
+            ClassElement classElement = (ClassElement) typeElement;
+            Collection<QualifiedName> mixinNames = classElement.getFQMixinClassNames();
+            mixinNames.stream()
+                    .map(mixinName -> getDirectInheritedClassTypes(mixinName, memberKinds, typeElement))
+                    .forEach(classTypes -> directTypes.addAll(classTypes));
+        }
+        return directTypes;
+    }
+
+    private Set<TypeMemberElement> getDirectInheritedClassTypes(QualifiedName superClassName, EnumSet<PhpElementKind> memberKinds, final TypeElement typeElement) {
+        final Set<TypeMemberElement> classTypes = new LinkedHashSet<>();
+        if (superClassName != null) {
+            classTypes.addAll(extendedQuery.getFields(NameKind.exact(superClassName), NameKind.empty()));
+            classTypes.addAll(extendedQuery.getMethods(NameKind.exact(superClassName), NameKind.empty()));
+            classTypes.addAll(extendedQuery.getTypeConstants(NameKind.exact(superClassName), NameKind.empty()));
+            if (memberKinds.size() != 1) {
+                classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(getTypeMembers(NameKind.exact(superClassName), NameKind.empty())));
+            } else {
+                switch (memberKinds.iterator().next()) {
+                    case METHOD:
+                        classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(
+                                getMethodsImpl(NameKind.exact(superClassName), NameKind.empty(), EnumSet.of(PhpElementKind.CLASS))));
+                        break;
+                    case FIELD:
+                        classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(getFields(NameKind.exact(superClassName), NameKind.empty())));
+                        break;
+                    case TYPE_CONSTANT:
+                        classTypes.addAll(ElementFilter.forFiles(typeElement.getFileObject()).prefer(
+                                getTypeConstantsImpl(NameKind.exact(superClassName), NameKind.empty(), EnumSet.of(PhpElementKind.CLASS))));
+                        break;
+                    default:
+                    //no-op
+                }
+            }
+            if (classTypes.isEmpty()) {
+                insertEmptyElement(classTypes, getClasses(NameKind.exact(superClassName)));
+            }
+        }
+        return classTypes;
+    }
+
     private void insertEmptyElement(final Set<TypeMemberElement> where, final Set<? extends TypeElement> exactTypeName) {
         TypeElement exactType = ModelUtils.getFirst(exactTypeName);
         if (exactType != null) {
@@ -1243,6 +1262,17 @@ private void insertEmptyElement(final Set<TypeMemberElement> where, final Set<?
                 new LinkedHashSet<>(getDeclaredTypeMembers(typeElement)), typeKinds, memberKinds);
     }
 
+    private Set<TypeMemberElement> getAllMixinTypeMembers(TypeElement typeElement) {
+        final EnumSet<PhpElementKind> typeKinds = EnumSet.of(PhpElementKind.CLASS);
+        final EnumSet<PhpElementKind> memberKinds = EnumSet.of(
+                PhpElementKind.METHOD,
+                PhpElementKind.FIELD,
+                PhpElementKind.TYPE_CONSTANT
+        );
+        return getMixinTypeMembers(typeElement, new LinkedHashSet<>(),
+                new LinkedHashSet<>(getDeclaredTypeMembers(typeElement)), typeKinds, memberKinds);
+    }
+
     @Override
     public Set<TypeMemberElement> getInheritedTypeMembers(final TypeElement typeElement) {
         final EnumSet<PhpElementKind> typeKinds = EnumSet.of(
@@ -1263,6 +1293,14 @@ private void insertEmptyElement(final Set<TypeMemberElement> where, final Set<?
     public Set<TypeMemberElement> getAccessibleTypeMembers(TypeElement typeElement, TypeElement calledFromEnclosingType) {
         final long start = (LOG.isLoggable(Level.FINE)) ? System.currentTimeMillis() : 0;
         final Set<TypeMemberElement> allTypeMembers = getAllTypeMembers(typeElement);
+        Set<TypeMemberElement> retval = getAccessibleTypeMembers(typeElement, calledFromEnclosingType, allTypeMembers);
+        if (LOG.isLoggable(Level.FINE)) {
+            logQueryTime("Set<TypeMemberElement> getAccessibleTypeMembers", NameKind.exact(typeElement.getFullyQualifiedName()), start); //NOI18N
+        }
+        return Collections.unmodifiableSet(retval);
+    }
+
+    private Set<TypeMemberElement> getAccessibleTypeMembers(TypeElement typeElement, TypeElement calledFromEnclosingType, final Set<TypeMemberElement> allTypeMembers) {
         Collection<TypeElement> subTypes = Collections.emptySet();
         if (calledFromEnclosingType != null) {
             if (typeElement instanceof TraitElement
@@ -1275,8 +1313,16 @@ private void insertEmptyElement(final Set<TypeMemberElement> where, final Set<?
         retval.addAll(filterForAccessible.filter(allTypeMembers));
         ElementFilter allOf = ElementFilter.allOf(ElementFilter.forVirtualExtensions(), ElementFilter.forMembersOfTypeName(typeElement));
         retval.addAll(allOf.filter(allTypeMembers));
+        return retval;
+    }
+
+    @Override
+    public Set<TypeMemberElement> getAccessibleMixinTypeMembers(TypeElement typeElement, TypeElement calledFromEnclosingType) {
+        final long start = (LOG.isLoggable(Level.FINE)) ? System.currentTimeMillis() : 0;
+        final Set<TypeMemberElement> allTypeMembers = getAllMixinTypeMembers(typeElement);
+        Set<TypeMemberElement> retval = getAccessibleTypeMembers(typeElement, calledFromEnclosingType, allTypeMembers);
         if (LOG.isLoggable(Level.FINE)) {
-            logQueryTime("Set<PhpElement> getAccessibleTypeMembers", NameKind.exact(typeElement.getFullyQualifiedName()), start); //NOI18N
+            logQueryTime("Set<TypeMemberElement> getAccessibleMixinTypeMembers", NameKind.exact(typeElement.getFullyQualifiedName()), start); // NOI18N
         }
         return Collections.unmodifiableSet(retval);
     }
@@ -1293,6 +1339,18 @@ private void insertEmptyElement(final Set<TypeMemberElement> where, final Set<?
         return forPrefereMethodImplementation(retval).filter(retval);
     }
 
+    private Set<TypeMemberElement> getMixinTypeMembers(final TypeElement typeElement, final Set<TypeElement> recursionPrevention,
+            Set<TypeMemberElement> retval, EnumSet<PhpElementKind> typeKinds, EnumSet<PhpElementKind> memberKinds) {
+        if (recursionPrevention.add(typeElement)) {
+            final Set<TypeMemberElement> typeMembers = getDirectMixinTypeMembers(typeElement, typeKinds, memberKinds);
+            retval.addAll(forEmptyElements().filter(forComparingNonAbstractNameKinds(retval).reverseFilter(typeMembers)));
+            Set<TypeElement> types = toTypes(typeMembers);
+            types.addAll(getDirectInheritedTypes(typeElement));
+            types.forEach(type -> retval.addAll(getMixinTypeMembers(type, recursionPrevention, retval, typeKinds, memberKinds)));
+        }
+        return forPrefereMethodImplementation(retval).filter(retval);
+    }
+
     @Override
     public Set<MethodElement> getAllMethods(final Exact typeQuery, final NameKind methodQuery) {
         Set<MethodElement> retval = new HashSet<>();
diff --git a/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java b/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java
index 6faf3ba00c..04b2b7d9e7 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java
@@ -1713,15 +1713,15 @@ public void visit(GroupUseStatementPart node) {
                 formatTokens.add(new FormatToken.IndentToken(ts.offset(), options.indentSize));
                 if (items.isEmpty()) {
                     addFormatToken(formatTokens);
+                    formatTokens.add(new FormatToken(FormatToken.Kind.WHITESPACE_AFTER_GROUP_USE_LEFT_BRACE, ts.offset() + ts.token().text().length()));
                     break;
                 }
             }
             addFormatToken(formatTokens);
         }
 
-        formatTokens.add(new FormatToken(FormatToken.Kind.WHITESPACE_AFTER_GROUP_USE_LEFT_BRACE, ts.offset()));
-
         if (!items.isEmpty()) {
+            formatTokens.add(new FormatToken(FormatToken.Kind.WHITESPACE_AFTER_GROUP_USE_LEFT_BRACE, ts.offset()));
             ts.movePrevious();
             addListOfNodes(items, FormatToken.Kind.WHITESPACE_IN_GROUP_USE_LIST);
         }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/indent/TokenFormatter.java b/php.editor/src/org/netbeans/modules/php/editor/indent/TokenFormatter.java
index 3de7396ac8..b119776631 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/indent/TokenFormatter.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/indent/TokenFormatter.java
@@ -577,11 +577,7 @@ public void run() {
                                             countSpaces = indent;
                                         }
                                         if (templateEdit) {
-                                            // #262205 don't add spaces if existing spaces have new lines
-                                            if (oldText == null) {
-                                                newLines = 0;
-                                                countSpaces = 0;
-                                            } else {
+                                            if (oldText != null) {
                                                 ws = countExistingWS(oldText);
                                                 newLines = ws.lines;
                                                 countSpaces = ws.spaces;
diff --git a/php.editor/src/org/netbeans/modules/php/editor/index/PHPIndexer.java b/php.editor/src/org/netbeans/modules/php/editor/index/PHPIndexer.java
index 578a57f780..39099de680 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/index/PHPIndexer.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/index/PHPIndexer.java
@@ -239,7 +239,7 @@ private void addSignature(final IdentifierSignature signature) {
     public static final class Factory extends EmbeddingIndexerFactory {
 
         public static final String NAME = "php"; // NOI18N
-        public static final int VERSION = 27;
+        public static final int VERSION = 28;
 
         @Override
         public EmbeddingIndexer createIndexer(final Indexable indexable, final Snapshot snapshot) {
diff --git a/php.editor/src/org/netbeans/modules/php/editor/lexer/PHP5ColoringLexer.java b/php.editor/src/org/netbeans/modules/php/editor/lexer/PHP5ColoringLexer.java
index 0c3e9ed4af..ce3b75e341 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/lexer/PHP5ColoringLexer.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/lexer/PHP5ColoringLexer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 17/05/01 14:58 */
+/* The following code was generated by JFlex 1.4.3 on 17/07/11 14:07 */
 
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
@@ -53,7 +53,7 @@
 /**
  * This class is a scanner generated by
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 17/05/01 14:58 from the specification file
+ * on 17/07/11 14:07 from the specification file
  * <tt>/home/junichi11/hg/web-main/php.editor/tools/Php5ColoringScanner.flex</tt>
  */
 public class PHP5ColoringLexer {
@@ -103,16 +103,16 @@
    * Translates characters to character classes
    */
   private static final String ZZ_CMAP_PACKED =
-    "\11\0\1\16\1\15\2\0\1\21\22\0\1\16\1\32\1\23\1\121"+
-    "\1\22\1\36\1\37\1\103\1\104\1\70\1\34\1\31\1\105\1\4"+
-    "\1\2\1\35\1\5\1\11\10\1\1\112\1\20\1\33\1\27\1\30"+
-    "\1\43\1\42\1\46\1\10\1\73\1\50\1\3\1\7\1\100\1\102"+
-    "\1\74\1\114\1\111\1\77\1\107\1\47\1\44\1\75\1\116\1\45"+
-    "\1\72\1\76\1\101\1\113\1\110\1\6\1\106\1\13\1\120\1\24"+
-    "\1\17\1\41\1\115\1\25\1\57\1\63\1\67\1\65\1\66\1\54"+
-    "\1\62\1\102\1\51\1\114\1\111\1\55\1\107\1\52\1\56\1\71"+
-    "\1\116\1\61\1\60\1\53\1\101\1\64\1\110\1\6\1\106\1\13"+
-    "\1\26\1\40\1\117\1\42\53\13\1\13\12\13\1\13\4\13\1\13"+
+    "\11\0\1\16\1\15\2\0\1\21\22\0\1\16\1\32\1\23\1\122"+
+    "\1\22\1\36\1\37\1\104\1\105\1\71\1\34\1\31\1\106\1\4"+
+    "\1\2\1\35\1\5\1\11\10\1\1\113\1\20\1\33\1\27\1\30"+
+    "\1\43\1\42\1\46\1\10\1\74\1\50\1\3\1\7\1\101\1\103"+
+    "\1\75\1\115\1\112\1\100\1\110\1\47\1\44\1\76\1\117\1\45"+
+    "\1\73\1\77\1\102\1\114\1\111\1\6\1\107\1\13\1\121\1\24"+
+    "\1\17\1\41\1\116\1\25\1\57\1\63\1\70\1\65\1\66\1\54"+
+    "\1\62\1\103\1\51\1\67\1\112\1\55\1\110\1\52\1\56\1\72"+
+    "\1\117\1\61\1\60\1\53\1\102\1\64\1\111\1\6\1\107\1\13"+
+    "\1\26\1\40\1\120\1\42\53\13\1\13\12\13\1\13\4\13\1\13"+
     "\5\13\27\13\1\13\37\13\1\13\10\13\u01c2\12\4\0\14\12\16\0"+
     "\5\12\7\0\1\12\1\0\1\12\201\0\5\12\1\0\2\12\2\0"+
     "\4\12\10\0\1\12\1\0\3\12\1\0\1\12\1\0\24\12\1\0"+
@@ -206,7 +206,7 @@
   private static final String ZZ_ACTION_PACKED_0 =
     "\25\0\2\1\1\2\1\3\1\4\1\5\1\6\1\3"+
     "\4\5\1\7\1\4\1\10\1\4\1\11\1\12\1\13"+
-    "\1\14\14\6\1\4\22\5\1\2\1\4\1\15\2\5"+
+    "\1\14\14\6\1\4\23\5\1\2\1\4\1\15\2\5"+
     "\1\4\2\5\1\16\1\17\1\20\1\21\1\22\2\21"+
     "\1\20\3\21\3\23\1\24\1\23\4\21\1\2\1\21"+
     "\2\25\3\2\1\0\1\2\2\26\1\2\1\27\1\30"+
@@ -215,41 +215,41 @@
     "\1\43\1\44\1\0\1\3\2\0\6\5\1\45\2\0"+
     "\4\5\1\0\1\5\1\0\1\46\2\0\1\21\2\0"+
     "\2\6\1\0\1\47\1\50\1\51\1\52\4\5\1\53"+
-    "\4\5\1\54\1\5\1\55\32\5\13\0\2\5\1\56"+
+    "\4\5\1\54\1\5\1\55\33\5\13\0\2\5\1\56"+
     "\1\5\3\0\2\57\2\60\1\61\1\62\1\60\3\0"+
     "\1\57\2\60\1\63\1\64\3\0\1\21\2\0\1\65"+
     "\2\0\1\66\7\0\1\67\2\0\1\70\1\0\1\71"+
     "\2\0\1\72\1\57\1\0\1\73\1\0\1\74\1\75"+
     "\1\36\1\76\1\77\3\0\7\5\2\3\1\100\3\5"+
     "\1\0\1\5\3\0\4\5\1\101\4\5\1\102\3\5"+
-    "\1\103\5\5\1\104\12\5\1\105\14\5\1\106\12\0"+
+    "\1\103\5\5\1\104\13\5\1\105\14\5\1\106\12\0"+
     "\12\5\3\107\1\110\1\0\1\111\1\0\1\112\1\21"+
     "\1\0\1\113\1\0\1\113\1\0\1\114\1\115\1\36"+
     "\2\0\1\116\6\5\1\117\1\120\1\121\6\5\4\0"+
-    "\1\122\5\5\1\123\11\5\1\124\2\5\1\125\1\126"+
-    "\3\5\1\127\1\5\1\130\1\131\4\5\1\132\10\5"+
-    "\12\0\13\5\1\110\1\0\1\36\1\133\1\0\3\5"+
-    "\1\134\3\5\1\135\1\5\1\136\1\137\1\5\1\140"+
-    "\2\141\3\0\3\5\1\142\10\5\1\143\1\5\1\144"+
-    "\1\145\1\146\5\5\1\147\1\150\1\5\1\151\1\152"+
-    "\1\5\1\153\3\5\1\154\10\0\1\155\1\0\1\156"+
-    "\1\157\11\5\1\36\1\0\1\5\1\160\3\5\1\161"+
-    "\3\5\3\0\1\162\13\5\1\163\1\164\1\165\1\166"+
-    "\4\5\1\167\1\170\5\0\11\5\1\36\1\1\1\171"+
-    "\4\5\1\172\1\173\1\5\2\174\1\0\1\175\2\5"+
-    "\1\176\1\177\3\5\1\200\5\5\1\201\3\0\3\5"+
-    "\1\202\5\5\1\36\1\0\3\5\1\203\1\204\1\0"+
-    "\1\5\1\205\5\5\1\206\1\5\1\207\1\210\1\5"+
-    "\1\0\1\211\3\5\1\212\3\5\1\36\1\0\2\5"+
-    "\1\213\1\42\1\5\1\214\1\215\1\216\3\5\1\217"+
-    "\1\0\2\5\1\220\1\221\2\5\1\36\1\0\1\222"+
-    "\1\223\1\5\1\224\1\5\1\225\1\226\3\5\1\227"+
-    "\1\36\1\0\5\5\1\0\1\230\1\231\1\232\2\5"+
-    "\1\0\1\233\1\5\1\0\1\5\1\0\1\234\14\0"+
-    "\1\235\1\0";
+    "\1\122\5\5\1\123\11\5\1\124\2\5\1\125\1\5"+
+    "\1\126\3\5\1\127\1\5\1\130\1\131\4\5\1\132"+
+    "\10\5\12\0\13\5\1\110\1\0\1\36\1\133\1\0"+
+    "\3\5\1\134\3\5\1\135\1\5\1\136\1\137\1\5"+
+    "\1\140\2\141\3\0\3\5\1\142\10\5\1\143\1\5"+
+    "\1\144\1\145\1\146\6\5\1\147\1\150\1\5\1\151"+
+    "\1\152\1\5\1\153\3\5\1\154\10\0\1\155\1\0"+
+    "\1\156\1\157\11\5\1\36\1\0\1\5\1\160\3\5"+
+    "\1\161\3\5\3\0\1\162\13\5\1\163\1\164\1\165"+
+    "\1\166\1\167\4\5\1\170\1\171\5\0\11\5\1\36"+
+    "\1\1\1\172\4\5\1\173\1\174\1\5\2\175\1\0"+
+    "\1\176\2\5\1\177\1\200\3\5\1\201\5\5\1\202"+
+    "\3\0\3\5\1\203\5\5\1\36\1\0\3\5\1\204"+
+    "\1\205\1\0\1\5\1\206\5\5\1\207\1\5\1\210"+
+    "\1\211\1\5\1\0\1\212\3\5\1\213\3\5\1\36"+
+    "\1\0\2\5\1\214\1\42\1\5\1\215\1\216\1\217"+
+    "\3\5\1\220\1\0\2\5\1\221\1\222\2\5\1\36"+
+    "\1\0\1\223\1\224\1\5\1\225\1\5\1\226\1\227"+
+    "\3\5\1\230\1\36\1\0\5\5\1\0\1\231\1\232"+
+    "\1\233\2\5\1\0\1\234\1\5\1\0\1\5\1\0"+
+    "\1\235\14\0\1\236\1\0";
 
   private static int [] zzUnpackAction() {
-    int [] result = new int[729];
+    int [] result = new int[735];
     int offset = 0;
     offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
     return result;
@@ -274,101 +274,101 @@ private static int zzUnpackAction(String packed, int offset, int [] result) {
   private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
 
   private static final String ZZ_ROWMAP_PACKED_0 =
-    "\0\0\0\122\0\244\0\366\0\u0148\0\u019a\0\u01ec\0\u023e"+
-    "\0\u0290\0\u02e2\0\u0334\0\u0386\0\u03d8\0\u042a\0\u047c\0\u04ce"+
-    "\0\u0520\0\u0572\0\u05c4\0\u0616\0\u0668\0\u06ba\0\u070c\0\u075e"+
-    "\0\u07b0\0\u0802\0\u0854\0\u08a6\0\u08f8\0\u094a\0\u099c\0\u09ee"+
-    "\0\u0a40\0\u0a92\0\u075e\0\u075e\0\u0ae4\0\u0b36\0\u075e\0\u075e"+
-    "\0\u075e\0\u0b88\0\u0bda\0\u0c2c\0\u0c7e\0\u0cd0\0\u0d22\0\u0d74"+
-    "\0\u0dc6\0\u0e18\0\u0e6a\0\u0ebc\0\u075e\0\u0f0e\0\u0f60\0\u0fb2"+
-    "\0\u1004\0\u1056\0\u10a8\0\u10fa\0\u114c\0\u119e\0\u11f0\0\u1242"+
-    "\0\u1294\0\u12e6\0\u1338\0\u138a\0\u13dc\0\u142e\0\u1480\0\u14d2"+
-    "\0\u1524\0\u1576\0\u075e\0\u15c8\0\u161a\0\u166c\0\u16be\0\u1710"+
-    "\0\u075e\0\u075e\0\u1762\0\u17b4\0\u075e\0\u1806\0\u1858\0\u18aa"+
-    "\0\u18fc\0\u194e\0\u19a0\0\u075e\0\u19f2\0\u1a44\0\u1a96\0\u1ae8"+
-    "\0\u1b3a\0\u1b8c\0\u1bde\0\u1c30\0\u1c82\0\u1a44\0\u075e\0\u1cd4"+
-    "\0\u1d26\0\u1d78\0\u1dca\0\u1e1c\0\u1e1c\0\u075e\0\u1e6e\0\u1ec0"+
-    "\0\u075e\0\u1f12\0\u1f64\0\u075e\0\u075e\0\u1fb6\0\u2008\0\u075e"+
-    "\0\u205a\0\u075e\0\u20ac\0\u075e\0\u20fe\0\u2150\0\u21a2\0\u21f4"+
-    "\0\u2246\0\u075e\0\u2298\0\u22ea\0\u233c\0\u238e\0\u075e\0\u23e0"+
-    "\0\u0668\0\u2432\0\u2484\0\u24d6\0\u2528\0\u257a\0\u25cc\0\u261e"+
-    "\0\u2670\0\u26c2\0\u2714\0\u2766\0\u27b8\0\u280a\0\u075e\0\u285c"+
-    "\0\u28ae\0\u2900\0\u2952\0\u29a4\0\u29f6\0\u2a48\0\u2a9a\0\u1524"+
-    "\0\u2aec\0\u0b36\0\u2b3e\0\u075e\0\u2b90\0\u2be2\0\u2c34\0\u2c86"+
-    "\0\u2cd8\0\u2d2a\0\u2d7c\0\u2dce\0\u0a40\0\u2e20\0\u2e72\0\u2ec4"+
-    "\0\u2f16\0\u0a40\0\u2f68\0\u2fba\0\u300c\0\u305e\0\u0a40\0\u30b0"+
-    "\0\u0a40\0\u3102\0\u3154\0\u31a6\0\u31f8\0\u324a\0\u329c\0\u32ee"+
-    "\0\u3340\0\u3392\0\u33e4\0\u3436\0\u3488\0\u34da\0\u352c\0\u357e"+
-    "\0\u35d0\0\u3622\0\u3674\0\u36c6\0\u3718\0\u376a\0\u37bc\0\u380e"+
-    "\0\u3860\0\u38b2\0\u3904\0\u3956\0\u39a8\0\u39fa\0\u1576\0\u3a4c"+
-    "\0\u3a9e\0\u3af0\0\u3b42\0\u3b94\0\u3be6\0\u3c38\0\u3c8a\0\u3cdc"+
-    "\0\u075e\0\u3d2e\0\u3d80\0\u1806\0\u3dd2\0\u3e24\0\u3e76\0\u3d80"+
-    "\0\u075e\0\u075e\0\u075e\0\u3dd2\0\u3ec8\0\u194e\0\u3f1a\0\u3f6c"+
-    "\0\u3ec8\0\u3f1a\0\u075e\0\u075e\0\u3fbe\0\u4010\0\u4062\0\u40b4"+
-    "\0\u4106\0\u1cd4\0\u075e\0\u4158\0\u1d26\0\u075e\0\u41aa\0\u1d78"+
-    "\0\u1dca\0\u41fc\0\u424e\0\u42a0\0\u1e6e\0\u075e\0\u42f2\0\u1ec0"+
-    "\0\u075e\0\u4344\0\u075e\0\u1fb6\0\u4396\0\u075e\0\u43e8\0\u443a"+
-    "\0\u075e\0\u448c\0\u075e\0\u075e\0\u44de\0\u4530\0\u075e\0\u4582"+
-    "\0\u45d4\0\u2008\0\u4626\0\u4678\0\u46ca\0\u471c\0\u476e\0\u47c0"+
-    "\0\u4812\0\u285c\0\u28ae\0\u4864\0\u48b6\0\u4908\0\u495a\0\u49ac"+
-    "\0\u49fe\0\u4a50\0\u4aa2\0\u4af4\0\u4b46\0\u4b98\0\u4bea\0\u4c3c"+
-    "\0\u0a40\0\u4c8e\0\u4ce0\0\u4d32\0\u4d84\0\u0a40\0\u4dd6\0\u4e28"+
-    "\0\u4e7a\0\u4dd6\0\u4ecc\0\u4f1e\0\u4f70\0\u4fc2\0\u5014\0\u0a40"+
-    "\0\u5066\0\u50b8\0\u510a\0\u515c\0\u51ae\0\u5200\0\u5252\0\u52a4"+
-    "\0\u52f6\0\u5348\0\u0a40\0\u539a\0\u53ec\0\u543e\0\u5490\0\u54e2"+
-    "\0\u5534\0\u5586\0\u55d8\0\u562a\0\u567c\0\u56ce\0\u5720\0\u0a40"+
-    "\0\u5772\0\u57c4\0\u5816\0\u5868\0\u58ba\0\u590c\0\u595e\0\u59b0"+
-    "\0\u5a02\0\u5a54\0\u5aa6\0\u5af8\0\u5b4a\0\u5b9c\0\u5bee\0\u5c40"+
-    "\0\u5c92\0\u5ce4\0\u5d36\0\u5d88\0\u075e\0\u1762\0\u18aa\0\u5dda"+
-    "\0\u5e2c\0\u075e\0\u5e7e\0\u075e\0\u5ed0\0\u5f22\0\u075e\0\u5f74"+
-    "\0\u1e1c\0\u5fc6\0\u075e\0\u075e\0\u6018\0\u606a\0\u60bc\0\u0a40"+
-    "\0\u610e\0\u6160\0\u61b2\0\u6204\0\u6256\0\u62a8\0\u62fa\0\u0a40"+
-    "\0\u0a40\0\u634c\0\u639e\0\u63f0\0\u6442\0\u6494\0\u64e6\0\u6538"+
-    "\0\u658a\0\u65dc\0\u662e\0\u4af4\0\u6680\0\u66d2\0\u6724\0\u6776"+
-    "\0\u67c8\0\u0a40\0\u681a\0\u686c\0\u68be\0\u6910\0\u6962\0\u69b4"+
-    "\0\u6a06\0\u6a58\0\u6aaa\0\u0a40\0\u6afc\0\u6b4e\0\u0a40\0\u0a40"+
-    "\0\u6ba0\0\u6bf2\0\u6c44\0\u0a40\0\u6c96\0\u0a40\0\u0a40\0\u6ce8"+
-    "\0\u6d3a\0\u6d8c\0\u6dde\0\u0a40\0\u6e30\0\u6e82\0\u6ed4\0\u6f26"+
-    "\0\u6f78\0\u6fca\0\u701c\0\u706e\0\u70c0\0\u7112\0\u7164\0\u71b6"+
-    "\0\u7208\0\u725a\0\u72ac\0\u72fe\0\u7350\0\u73a2\0\u73f4\0\u7446"+
-    "\0\u7498\0\u74ea\0\u753c\0\u758e\0\u75e0\0\u7632\0\u7684\0\u76d6"+
-    "\0\u7728\0\u075e\0\u777a\0\u77cc\0\u075e\0\u781e\0\u7870\0\u78c2"+
-    "\0\u7914\0\u0a40\0\u7966\0\u79b8\0\u7a0a\0\u0a40\0\u7a5c\0\u0a40"+
-    "\0\u7aae\0\u7b00\0\u0a40\0\u075e\0\u7b52\0\u7ba4\0\u7bf6\0\u7c48"+
-    "\0\u7c9a\0\u7cec\0\u7d3e\0\u0a40\0\u7d90\0\u7de2\0\u7e34\0\u7e86"+
-    "\0\u7ed8\0\u7f2a\0\u7f7c\0\u7fce\0\u0a40\0\u8020\0\u0a40\0\u0a40"+
-    "\0\u0a40\0\u8072\0\u80c4\0\u8116\0\u8168\0\u81ba\0\u0a40\0\u0a40"+
-    "\0\u820c\0\u0a40\0\u0a40\0\u825e\0\u0a40\0\u82b0\0\u8302\0\u8354"+
-    "\0\u0a40\0\u83a6\0\u83f8\0\u844a\0\u849c\0\u84ee\0\u8540\0\u8592"+
-    "\0\u85e4\0\u075e\0\u8636\0\u8688\0\u0a40\0\u86da\0\u872c\0\u877e"+
-    "\0\u87d0\0\u8822\0\u8874\0\u88c6\0\u8918\0\u896a\0\u89bc\0\u8a0e"+
-    "\0\u8a60\0\u8ab2\0\u8b04\0\u8b56\0\u8ba8\0\u0a40\0\u8bfa\0\u8c4c"+
-    "\0\u8c9e\0\u8cf0\0\u8d42\0\u8d94\0\u0a40\0\u8de6\0\u8e38\0\u8e8a"+
-    "\0\u8edc\0\u8f2e\0\u8f80\0\u8fd2\0\u9024\0\u9076\0\u90c8\0\u911a"+
-    "\0\u0a40\0\u0a40\0\u0a40\0\u0a40\0\u916c\0\u91be\0\u9210\0\u9262"+
-    "\0\u0a40\0\u0a40\0\u92b4\0\u9306\0\u9358\0\u93aa\0\u93fc\0\u944e"+
-    "\0\u94a0\0\u94f2\0\u9544\0\u9596\0\u95e8\0\u963a\0\u968c\0\u96de"+
-    "\0\u9730\0\u9782\0\u0a40\0\u97d4\0\u9826\0\u9878\0\u98ca\0\u0a40"+
-    "\0\u0a40\0\u991c\0\u075e\0\u996e\0\u99c0\0\u9a12\0\u9a64\0\u9ab6"+
-    "\0\u0a40\0\u0a40\0\u9b08\0\u9b5a\0\u9bac\0\u9bfe\0\u9c50\0\u9ca2"+
-    "\0\u9cf4\0\u9d46\0\u9d98\0\u0a40\0\u9dea\0\u9e3c\0\u9e8e\0\u9ee0"+
-    "\0\u9f32\0\u9f84\0\u0a40\0\u9fd6\0\ua028\0\ua07a\0\ua0cc\0\ua11e"+
-    "\0\ua170\0\ua1c2\0\ua214\0\ua266\0\ua2b8\0\u0a40\0\u0a40\0\ua30a"+
-    "\0\ua35c\0\u0a40\0\ua3ae\0\ua400\0\ua452\0\ua4a4\0\ua4f6\0\u0a40"+
-    "\0\ua548\0\u0a40\0\u0a40\0\ua59a\0\ua5ec\0\u0a40\0\ua63e\0\ua690"+
-    "\0\ua6e2\0\u0a40\0\ua734\0\ua786\0\ua7d8\0\ua82a\0\ua87c\0\ua8ce"+
-    "\0\ua920\0\u0a40\0\ua972\0\ua9c4\0\u0a40\0\u0a40\0\u0a40\0\uaa16"+
-    "\0\uaa68\0\uaaba\0\u0a40\0\uab0c\0\uab5e\0\uabb0\0\u0a40\0\u0a40"+
-    "\0\uac02\0\uac54\0\uaca6\0\uacf8\0\u0a40\0\u0a40\0\uad4a\0\u0a40"+
-    "\0\uad9c\0\u0a40\0\u075e\0\uadee\0\uae40\0\uae92\0\u0a40\0\ua972"+
-    "\0\uaee4\0\uaf36\0\uaf88\0\uafda\0\ub02c\0\ub07e\0\ub0d0\0\u0a40"+
-    "\0\u0a40\0\u0a40\0\ub122\0\ub174\0\ub1c6\0\u0a40\0\ub218\0\ub26a"+
-    "\0\ub2bc\0\ub30e\0\u0a40\0\ub360\0\ub3b2\0\ub404\0\ub456\0\ub4a8"+
-    "\0\ub4fa\0\ub54c\0\ub59e\0\ub5f0\0\ub642\0\ub694\0\ub6e6\0\u075e"+
-    "\0\ub738";
+    "\0\0\0\123\0\246\0\371\0\u014c\0\u019f\0\u01f2\0\u0245"+
+    "\0\u0298\0\u02eb\0\u033e\0\u0391\0\u03e4\0\u0437\0\u048a\0\u04dd"+
+    "\0\u0530\0\u0583\0\u05d6\0\u0629\0\u067c\0\u06cf\0\u0722\0\u0775"+
+    "\0\u07c8\0\u081b\0\u086e\0\u08c1\0\u0914\0\u0967\0\u09ba\0\u0a0d"+
+    "\0\u0a60\0\u0ab3\0\u0775\0\u0775\0\u0b06\0\u0b59\0\u0775\0\u0775"+
+    "\0\u0775\0\u0bac\0\u0bff\0\u0c52\0\u0ca5\0\u0cf8\0\u0d4b\0\u0d9e"+
+    "\0\u0df1\0\u0e44\0\u0e97\0\u0eea\0\u0775\0\u0f3d\0\u0f90\0\u0fe3"+
+    "\0\u1036\0\u1089\0\u10dc\0\u112f\0\u1182\0\u11d5\0\u1228\0\u127b"+
+    "\0\u12ce\0\u1321\0\u1374\0\u13c7\0\u141a\0\u146d\0\u14c0\0\u1513"+
+    "\0\u1566\0\u15b9\0\u160c\0\u0775\0\u165f\0\u16b2\0\u1705\0\u1758"+
+    "\0\u17ab\0\u0775\0\u0775\0\u17fe\0\u1851\0\u0775\0\u18a4\0\u18f7"+
+    "\0\u194a\0\u199d\0\u19f0\0\u1a43\0\u0775\0\u1a96\0\u1ae9\0\u1b3c"+
+    "\0\u1b8f\0\u1be2\0\u1c35\0\u1c88\0\u1cdb\0\u1d2e\0\u1ae9\0\u0775"+
+    "\0\u1d81\0\u1dd4\0\u1e27\0\u1e7a\0\u1ecd\0\u1ecd\0\u0775\0\u1f20"+
+    "\0\u1f73\0\u0775\0\u1fc6\0\u2019\0\u0775\0\u0775\0\u206c\0\u20bf"+
+    "\0\u0775\0\u2112\0\u0775\0\u2165\0\u0775\0\u21b8\0\u220b\0\u225e"+
+    "\0\u22b1\0\u2304\0\u0775\0\u2357\0\u23aa\0\u23fd\0\u2450\0\u0775"+
+    "\0\u24a3\0\u067c\0\u24f6\0\u2549\0\u259c\0\u25ef\0\u2642\0\u2695"+
+    "\0\u26e8\0\u273b\0\u278e\0\u27e1\0\u2834\0\u2887\0\u28da\0\u0775"+
+    "\0\u292d\0\u2980\0\u29d3\0\u2a26\0\u2a79\0\u2acc\0\u2b1f\0\u2b72"+
+    "\0\u15b9\0\u2bc5\0\u0b59\0\u2c18\0\u0775\0\u2c6b\0\u2cbe\0\u2d11"+
+    "\0\u2d64\0\u2db7\0\u2e0a\0\u2e5d\0\u2eb0\0\u0a60\0\u2f03\0\u2f56"+
+    "\0\u2fa9\0\u2ffc\0\u0a60\0\u304f\0\u30a2\0\u30f5\0\u3148\0\u0a60"+
+    "\0\u319b\0\u0a60\0\u31ee\0\u3241\0\u3294\0\u32e7\0\u333a\0\u338d"+
+    "\0\u33e0\0\u3433\0\u3486\0\u34d9\0\u352c\0\u357f\0\u35d2\0\u3625"+
+    "\0\u3678\0\u36cb\0\u371e\0\u3771\0\u37c4\0\u3817\0\u386a\0\u38bd"+
+    "\0\u3910\0\u3963\0\u39b6\0\u3a09\0\u3a5c\0\u3aaf\0\u3b02\0\u3b55"+
+    "\0\u160c\0\u3ba8\0\u3bfb\0\u3c4e\0\u3ca1\0\u3cf4\0\u3d47\0\u3d9a"+
+    "\0\u3ded\0\u3e40\0\u0775\0\u3e93\0\u3ee6\0\u18a4\0\u3f39\0\u3f8c"+
+    "\0\u3fdf\0\u3ee6\0\u0775\0\u0775\0\u0775\0\u3f39\0\u4032\0\u19f0"+
+    "\0\u4085\0\u40d8\0\u4032\0\u4085\0\u0775\0\u0775\0\u412b\0\u417e"+
+    "\0\u41d1\0\u4224\0\u4277\0\u1d81\0\u0775\0\u42ca\0\u1dd4\0\u0775"+
+    "\0\u431d\0\u1e27\0\u1e7a\0\u4370\0\u43c3\0\u4416\0\u1f20\0\u0775"+
+    "\0\u4469\0\u1f73\0\u0775\0\u44bc\0\u0775\0\u206c\0\u450f\0\u0775"+
+    "\0\u4562\0\u45b5\0\u0775\0\u4608\0\u0775\0\u0775\0\u465b\0\u46ae"+
+    "\0\u0775\0\u4701\0\u4754\0\u20bf\0\u47a7\0\u47fa\0\u484d\0\u48a0"+
+    "\0\u48f3\0\u4946\0\u4999\0\u292d\0\u2980\0\u49ec\0\u4a3f\0\u4a92"+
+    "\0\u4ae5\0\u4b38\0\u4b8b\0\u4bde\0\u4c31\0\u4c84\0\u4cd7\0\u4d2a"+
+    "\0\u4d7d\0\u4dd0\0\u0a60\0\u4e23\0\u4e76\0\u4ec9\0\u4f1c\0\u0a60"+
+    "\0\u4f6f\0\u4fc2\0\u5015\0\u4f6f\0\u5068\0\u50bb\0\u510e\0\u5161"+
+    "\0\u51b4\0\u0a60\0\u5207\0\u525a\0\u52ad\0\u5300\0\u5353\0\u53a6"+
+    "\0\u53f9\0\u544c\0\u549f\0\u54f2\0\u5545\0\u0a60\0\u5598\0\u55eb"+
+    "\0\u563e\0\u5691\0\u56e4\0\u5737\0\u578a\0\u57dd\0\u5830\0\u5883"+
+    "\0\u58d6\0\u5929\0\u0a60\0\u597c\0\u59cf\0\u5a22\0\u5a75\0\u5ac8"+
+    "\0\u5b1b\0\u5b6e\0\u5bc1\0\u5c14\0\u5c67\0\u5cba\0\u5d0d\0\u5d60"+
+    "\0\u5db3\0\u5e06\0\u5e59\0\u5eac\0\u5eff\0\u5f52\0\u5fa5\0\u0775"+
+    "\0\u17fe\0\u194a\0\u5ff8\0\u604b\0\u0775\0\u609e\0\u0775\0\u60f1"+
+    "\0\u6144\0\u0775\0\u6197\0\u1ecd\0\u61ea\0\u0775\0\u0775\0\u623d"+
+    "\0\u6290\0\u62e3\0\u0a60\0\u6336\0\u6389\0\u63dc\0\u642f\0\u6482"+
+    "\0\u64d5\0\u6528\0\u0a60\0\u0a60\0\u657b\0\u65ce\0\u6621\0\u6674"+
+    "\0\u66c7\0\u671a\0\u676d\0\u67c0\0\u6813\0\u6866\0\u4c84\0\u68b9"+
+    "\0\u690c\0\u695f\0\u69b2\0\u6a05\0\u0a60\0\u6a58\0\u6aab\0\u6afe"+
+    "\0\u6b51\0\u6ba4\0\u6bf7\0\u6c4a\0\u6c9d\0\u6cf0\0\u0a60\0\u6d43"+
+    "\0\u6d96\0\u0a60\0\u6de9\0\u0a60\0\u6e3c\0\u6e8f\0\u6ee2\0\u0a60"+
+    "\0\u6f35\0\u0a60\0\u0a60\0\u6f88\0\u6fdb\0\u702e\0\u7081\0\u0a60"+
+    "\0\u70d4\0\u7127\0\u717a\0\u71cd\0\u7220\0\u7273\0\u72c6\0\u7319"+
+    "\0\u736c\0\u73bf\0\u7412\0\u7465\0\u74b8\0\u750b\0\u755e\0\u75b1"+
+    "\0\u7604\0\u7657\0\u76aa\0\u76fd\0\u7750\0\u77a3\0\u77f6\0\u7849"+
+    "\0\u789c\0\u78ef\0\u7942\0\u7995\0\u79e8\0\u0775\0\u7a3b\0\u7a8e"+
+    "\0\u0775\0\u7ae1\0\u7b34\0\u7b87\0\u7bda\0\u0a60\0\u7c2d\0\u7c80"+
+    "\0\u7cd3\0\u0a60\0\u7d26\0\u0a60\0\u7d79\0\u7dcc\0\u0a60\0\u0775"+
+    "\0\u7e1f\0\u7e72\0\u7ec5\0\u7f18\0\u7f6b\0\u7fbe\0\u8011\0\u0a60"+
+    "\0\u8064\0\u80b7\0\u810a\0\u815d\0\u81b0\0\u8203\0\u8256\0\u82a9"+
+    "\0\u0a60\0\u82fc\0\u0a60\0\u0a60\0\u0a60\0\u834f\0\u83a2\0\u83f5"+
+    "\0\u8448\0\u849b\0\u84ee\0\u0a60\0\u0a60\0\u8541\0\u0a60\0\u0a60"+
+    "\0\u8594\0\u0a60\0\u85e7\0\u863a\0\u868d\0\u0a60\0\u86e0\0\u8733"+
+    "\0\u8786\0\u87d9\0\u882c\0\u887f\0\u88d2\0\u8925\0\u0775\0\u8978"+
+    "\0\u89cb\0\u0a60\0\u8a1e\0\u8a71\0\u8ac4\0\u8b17\0\u8b6a\0\u8bbd"+
+    "\0\u8c10\0\u8c63\0\u8cb6\0\u8d09\0\u8d5c\0\u8daf\0\u8e02\0\u8e55"+
+    "\0\u8ea8\0\u8efb\0\u0a60\0\u8f4e\0\u8fa1\0\u8ff4\0\u9047\0\u909a"+
+    "\0\u90ed\0\u0a60\0\u9140\0\u9193\0\u91e6\0\u9239\0\u928c\0\u92df"+
+    "\0\u9332\0\u9385\0\u93d8\0\u942b\0\u947e\0\u0a60\0\u0a60\0\u0a60"+
+    "\0\u0a60\0\u0a60\0\u94d1\0\u9524\0\u9577\0\u95ca\0\u0a60\0\u0a60"+
+    "\0\u961d\0\u9670\0\u96c3\0\u9716\0\u9769\0\u97bc\0\u980f\0\u9862"+
+    "\0\u98b5\0\u9908\0\u995b\0\u99ae\0\u9a01\0\u9a54\0\u9aa7\0\u9afa"+
+    "\0\u0a60\0\u9b4d\0\u9ba0\0\u9bf3\0\u9c46\0\u0a60\0\u0a60\0\u9c99"+
+    "\0\u0775\0\u9cec\0\u9d3f\0\u9d92\0\u9de5\0\u9e38\0\u0a60\0\u0a60"+
+    "\0\u9e8b\0\u9ede\0\u9f31\0\u9f84\0\u9fd7\0\ua02a\0\ua07d\0\ua0d0"+
+    "\0\ua123\0\u0a60\0\ua176\0\ua1c9\0\ua21c\0\ua26f\0\ua2c2\0\ua315"+
+    "\0\u0a60\0\ua368\0\ua3bb\0\ua40e\0\ua461\0\ua4b4\0\ua507\0\ua55a"+
+    "\0\ua5ad\0\ua600\0\ua653\0\u0a60\0\u0a60\0\ua6a6\0\ua6f9\0\u0a60"+
+    "\0\ua74c\0\ua79f\0\ua7f2\0\ua845\0\ua898\0\u0a60\0\ua8eb\0\u0a60"+
+    "\0\u0a60\0\ua93e\0\ua991\0\u0a60\0\ua9e4\0\uaa37\0\uaa8a\0\u0a60"+
+    "\0\uaadd\0\uab30\0\uab83\0\uabd6\0\uac29\0\uac7c\0\uaccf\0\u0a60"+
+    "\0\uad22\0\uad75\0\u0a60\0\u0a60\0\u0a60\0\uadc8\0\uae1b\0\uae6e"+
+    "\0\u0a60\0\uaec1\0\uaf14\0\uaf67\0\u0a60\0\u0a60\0\uafba\0\ub00d"+
+    "\0\ub060\0\ub0b3\0\u0a60\0\u0a60\0\ub106\0\u0a60\0\ub159\0\u0a60"+
+    "\0\u0775\0\ub1ac\0\ub1ff\0\ub252\0\u0a60\0\uad22\0\ub2a5\0\ub2f8"+
+    "\0\ub34b\0\ub39e\0\ub3f1\0\ub444\0\ub497\0\u0a60\0\u0a60\0\u0a60"+
+    "\0\ub4ea\0\ub53d\0\ub590\0\u0a60\0\ub5e3\0\ub636\0\ub689\0\ub6dc"+
+    "\0\u0a60\0\ub72f\0\ub782\0\ub7d5\0\ub828\0\ub87b\0\ub8ce\0\ub921"+
+    "\0\ub974\0\ub9c7\0\uba1a\0\uba6d\0\ubac0\0\u0775\0\ubb13";
 
   private static int [] zzUnpackRowMap() {
-    int [] result = new int[729];
+    int [] result = new int[735];
     int offset = 0;
     offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
     return result;
@@ -391,989 +391,1000 @@ private static int zzUnpackRowMap(String packed, int offset, int [] result) {
   private static final int [] ZZ_TRANS = zzUnpackTrans();
 
   private static final String ZZ_TRANS_PACKED_0 =
-    "\33\26\1\27\66\26\1\30\1\31\1\32\1\33\1\34"+
+    "\33\26\1\27\67\26\1\30\1\31\1\32\1\33\1\34"+
     "\1\35\1\36\1\37\1\40\1\31\2\41\1\30\2\42"+
     "\1\43\1\44\1\42\1\45\1\46\1\47\1\50\1\51"+
     "\1\52\1\53\1\54\1\55\1\56\1\57\1\60\1\61"+
     "\1\62\1\63\1\64\1\65\1\66\1\67\1\70\1\71"+
-    "\1\72\1\73\1\74\1\72\1\75\1\76\1\77\1\67"+
-    "\1\71\1\100\1\70\1\101\1\102\1\103\1\73\1\33"+
-    "\1\104\1\43\1\105\1\106\1\104\1\107\1\105\1\75"+
-    "\1\77\1\101\1\110\1\41\1\111\1\112\1\113\1\114"+
-    "\1\41\1\115\1\41\1\116\1\117\1\41\1\120\1\41"+
-    "\1\121\1\43\1\122\22\123\1\124\1\125\1\126\1\123"+
-    "\1\127\73\123\22\130\1\131\1\130\1\132\1\125\1\133"+
-    "\73\130\4\134\1\135\21\134\1\136\76\134\1\137\2\134"+
-    "\3\137\1\134\2\137\1\134\2\42\2\134\1\42\22\134"+
-    "\24\137\1\134\12\137\3\134\4\137\1\140\4\137\3\134"+
-    "\15\141\1\142\3\141\1\143\1\144\1\141\1\145\1\141"+
-    "\1\146\73\141\3\147\1\150\2\147\3\150\1\147\2\150"+
-    "\30\147\24\150\1\147\12\150\3\147\4\150\1\147\4\150"+
-    "\3\147\3\30\1\151\2\30\3\151\1\30\2\151\1\30"+
-    "\1\0\26\30\24\151\1\30\12\151\3\30\4\151\1\30"+
-    "\4\151\3\30\3\152\1\153\2\152\3\153\2\152\1\153"+
-    "\1\152\1\154\3\152\1\155\22\152\24\153\1\152\12\153"+
-    "\3\152\4\153\1\152\4\153\3\152\3\156\1\157\2\156"+
-    "\3\157\1\156\2\157\30\156\24\157\1\156\12\157\3\156"+
-    "\4\157\1\156\4\157\3\156\3\30\1\160\2\30\3\160"+
-    "\1\30\2\160\1\30\1\0\26\30\24\160\1\30\12\160"+
-    "\3\30\4\160\1\30\4\160\3\30\3\161\1\162\1\163"+
-    "\1\161\3\162\1\161\2\162\1\161\2\42\2\161\1\42"+
-    "\22\161\24\162\1\161\12\162\3\161\4\162\1\161\4\162"+
-    "\6\161\1\162\2\161\3\162\1\161\2\162\1\161\2\42"+
-    "\2\161\1\42\22\161\24\162\1\161\12\162\1\161\1\164"+
-    "\1\161\4\162\1\161\4\162\3\161\3\165\1\166\2\165"+
-    "\3\166\1\165\2\166\1\165\2\42\2\165\1\42\22\165"+
-    "\24\166\1\165\12\166\3\165\4\166\1\165\4\166\3\165"+
-    "\1\30\1\167\1\170\1\41\1\30\1\171\3\41\1\167"+
-    "\2\41\1\30\2\172\1\164\1\170\1\172\1\173\1\170"+
-    "\1\172\2\170\6\30\1\170\5\30\1\170\24\41\1\170"+
-    "\12\41\1\172\2\170\4\41\1\170\4\41\1\170\1\174"+
-    "\1\172\34\175\1\176\65\175\34\177\1\200\65\177\15\201"+
-    "\1\202\3\201\1\203\11\201\1\204\2\201\1\205\4\201"+
-    "\1\206\56\201\15\207\2\210\2\207\1\210\100\207\122\211"+
-    "\33\26\1\212\121\26\1\0\2\26\1\213\4\26\1\214"+
-    "\5\26\1\0\1\26\1\0\4\26\1\215\1\0\5\26"+
-    "\3\0\12\26\1\0\15\26\123\0\1\31\1\216\1\217"+
-    "\1\0\1\31\3\0\1\31\54\0\1\217\34\0\1\216"+
-    "\1\220\2\0\1\216\3\0\1\216\15\0\1\65\73\0"+
-    "\1\41\1\0\1\41\1\0\1\41\1\221\6\41\27\0"+
-    "\3\41\1\222\2\41\1\222\2\41\1\223\6\41\1\224"+
-    "\2\41\1\225\1\0\2\41\1\225\3\41\1\223\3\41"+
-    "\3\0\1\41\1\226\2\41\1\0\1\224\3\41\7\0"+
-    "\1\65\22\0\1\65\1\227\72\0\1\31\1\216\1\217"+
-    "\1\0\1\31\1\230\1\0\1\231\1\31\51\0\1\231"+
-    "\2\0\1\217\34\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\67\11\41\1\67\11\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\1\232\1\41\1\233\2\41\1\234\4\41"+
-    "\1\232\1\233\10\41\1\0\3\41\1\234\4\41\1\235"+
-    "\1\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\6\0\1\46\7\0\1\236\10\0"+
-    "\1\41\1\237\13\41\1\237\6\41\1\0\12\41\1\240"+
-    "\2\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\12\41\3\0\4\41"+
-    "\1\0\4\41\20\0\2\42\2\0\1\42\103\0\1\241"+
-    "\2\0\3\241\1\0\2\241\30\0\24\241\1\0\12\241"+
-    "\3\0\4\241\1\0\4\241\3\0\22\242\1\243\1\244"+
-    "\1\245\1\242\1\246\73\242\27\0\1\64\1\65\120\0"+
-    "\1\65\1\64\120\0\1\65\1\0\1\65\117\0\1\64"+
-    "\121\0\1\247\1\65\2\0\1\250\1\0\1\251\113\0"+
-    "\1\65\4\0\1\64\114\0\1\65\4\0\1\252\1\122"+
-    "\113\0\1\65\1\253\120\0\1\65\7\0\1\65\111\0"+
-    "\1\65\10\0\1\65\110\0\1\65\122\0\1\254\12\0"+
-    "\1\65\57\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\41\1\255\13\41\1\255\6\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\256\1\0"+
-    "\10\41\27\0\22\41\1\256\1\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\3\41\1\257\4\41\27\0\1\41\1\260\1\41\1\261"+
-    "\2\41\1\261\5\41\1\262\1\260\1\41\1\257\4\41"+
-    "\1\0\1\41\1\262\10\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\263\1\0\10\41\27\0\2\41"+
-    "\1\264\10\41\1\264\6\41\1\263\1\41\1\0\10\41"+
-    "\1\265\1\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\266\1\0\10\41\27\0\1\267\4\41\1\270"+
-    "\4\41\1\267\7\41\1\266\1\41\1\0\3\41\1\270"+
-    "\6\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\2\41\1\271\5\41\27\0\3\41\1\272"+
-    "\2\41\1\273\1\274\1\271\3\41\1\275\7\41\1\0"+
-    "\1\41\1\275\10\41\3\0\1\41\1\276\2\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\41\1\277\13\41\1\277\6\41\1\0\11\41\1\300"+
+    "\1\72\1\73\1\74\1\72\1\75\1\76\1\77\1\100"+
+    "\1\71\1\101\1\70\1\102\1\103\1\104\1\73\1\33"+
+    "\1\41\1\105\1\43\1\106\1\107\1\105\1\110\1\106"+
+    "\1\75\1\77\1\102\1\111\1\41\1\112\1\113\1\114"+
+    "\1\115\1\41\1\116\1\41\1\117\1\120\1\41\1\121"+
+    "\1\41\1\122\1\43\1\123\22\124\1\125\1\126\1\127"+
+    "\1\124\1\130\74\124\22\131\1\132\1\131\1\133\1\126"+
+    "\1\134\74\131\4\135\1\136\21\135\1\137\77\135\1\140"+
+    "\2\135\3\140\1\135\2\140\1\135\2\42\2\135\1\42"+
+    "\22\135\25\140\1\135\12\140\3\135\4\140\1\141\4\140"+
+    "\3\135\15\142\1\143\3\142\1\144\1\145\1\142\1\146"+
+    "\1\142\1\147\74\142\3\150\1\151\2\150\3\151\1\150"+
+    "\2\151\30\150\25\151\1\150\12\151\3\150\4\151\1\150"+
+    "\4\151\3\150\3\30\1\152\2\30\3\152\1\30\2\152"+
+    "\1\30\1\0\26\30\25\152\1\30\12\152\3\30\4\152"+
+    "\1\30\4\152\3\30\3\153\1\154\2\153\3\154\2\153"+
+    "\1\154\1\153\1\155\3\153\1\156\22\153\25\154\1\153"+
+    "\12\154\3\153\4\154\1\153\4\154\3\153\3\157\1\160"+
+    "\2\157\3\160\1\157\2\160\30\157\25\160\1\157\12\160"+
+    "\3\157\4\160\1\157\4\160\3\157\3\30\1\161\2\30"+
+    "\3\161\1\30\2\161\1\30\1\0\26\30\25\161\1\30"+
+    "\12\161\3\30\4\161\1\30\4\161\3\30\3\162\1\163"+
+    "\1\164\1\162\3\163\1\162\2\163\1\162\2\42\2\162"+
+    "\1\42\22\162\25\163\1\162\12\163\3\162\4\163\1\162"+
+    "\4\163\6\162\1\163\2\162\3\163\1\162\2\163\1\162"+
+    "\2\42\2\162\1\42\22\162\25\163\1\162\12\163\1\162"+
+    "\1\165\1\162\4\163\1\162\4\163\3\162\3\166\1\167"+
+    "\2\166\3\167\1\166\2\167\1\166\2\42\2\166\1\42"+
+    "\22\166\25\167\1\166\12\167\3\166\4\167\1\166\4\167"+
+    "\3\166\1\30\1\170\1\171\1\41\1\30\1\172\3\41"+
+    "\1\170\2\41\1\30\2\173\1\165\1\171\1\173\1\174"+
+    "\1\171\1\173\2\171\6\30\1\171\5\30\1\171\25\41"+
+    "\1\171\12\41\1\173\2\171\4\41\1\171\4\41\1\171"+
+    "\1\175\1\173\34\176\1\177\66\176\34\200\1\201\66\200"+
+    "\15\202\1\203\3\202\1\204\11\202\1\205\2\202\1\206"+
+    "\4\202\1\207\57\202\15\210\2\211\2\210\1\211\101\210"+
+    "\123\212\33\26\1\213\122\26\1\0\2\26\1\214\4\26"+
+    "\1\215\5\26\1\0\1\26\1\0\4\26\1\216\1\0"+
+    "\6\26\3\0\12\26\1\0\15\26\124\0\1\31\1\217"+
+    "\1\220\1\0\1\31\3\0\1\31\54\0\1\220\35\0"+
+    "\1\217\1\221\2\0\1\217\3\0\1\217\15\0\1\65"+
+    "\74\0\1\41\1\0\1\41\1\0\1\41\1\222\6\41"+
+    "\27\0\3\41\1\223\2\41\1\223\2\41\1\224\6\41"+
+    "\1\225\3\41\1\226\1\0\2\41\1\226\3\41\1\224"+
+    "\3\41\3\0\1\41\1\227\2\41\1\0\1\225\3\41"+
+    "\7\0\1\65\22\0\1\65\1\230\73\0\1\31\1\217"+
+    "\1\220\1\0\1\31\1\231\1\0\1\232\1\31\51\0"+
+    "\1\232\2\0\1\220\35\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\1\67\11\41\1\67\12\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\1\232\1\41\1\233\2\41\1\234"+
-    "\3\41\1\301\1\232\1\233\10\41\1\0\3\41\1\234"+
-    "\4\41\1\235\1\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\5\41\1\302"+
-    "\16\41\1\0\3\41\1\302\6\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\303\1\0\10\41\27\0"+
-    "\7\41\1\304\12\41\1\303\1\41\1\0\5\41\1\305"+
-    "\4\41\3\0\2\41\1\306\1\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\1\307\10\41"+
-    "\1\310\1\307\11\41\1\0\6\41\1\310\3\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\6\0\1\46\7\0\1\236\10\0\1\41\1\237"+
-    "\10\41\1\311\2\41\1\237\6\41\1\0\12\41\1\240"+
-    "\2\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\2\41\1\312\7\41\1\313\1\312"+
-    "\10\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\1\314\1\41"+
-    "\1\315\6\41\1\316\1\314\1\315\10\41\1\0\6\41"+
-    "\1\316\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\1\41\1\317\1\320"+
-    "\10\41\1\320\1\41\1\317\6\41\1\0\10\41\1\321"+
-    "\1\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\303\1\0\10\41\27\0\7\41\1\305\12\41\1\303"+
-    "\1\41\1\0\5\41\1\305\4\41\3\0\2\41\1\306"+
-    "\1\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\2\41\1\271\5\41\27\0\3\41\1\272\2\41\1\272"+
-    "\1\41\1\271\3\41\1\275\7\41\1\0\1\41\1\275"+
-    "\10\41\3\0\1\41\1\276\2\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\3\41\1\322"+
-    "\2\41\1\322\5\41\1\323\7\41\1\0\1\41\1\323"+
-    "\10\41\3\0\4\41\1\0\4\41\3\0\24\240\1\324"+
-    "\56\240\1\244\16\240\7\0\1\325\1\326\5\0\1\327"+
-    "\25\0\1\330\1\331\1\332\1\0\1\333\1\334\2\0"+
-    "\1\325\1\0\1\330\1\332\1\335\1\331\1\0\1\326"+
-    "\1\0\1\333\4\0\1\335\1\0\1\334\4\0\1\336"+
-    "\21\0\1\41\1\0\1\41\1\0\10\41\27\0\5\41"+
-    "\1\337\16\41\1\0\3\41\1\337\6\41\3\0\4\41"+
+    "\1\0\10\41\27\0\1\233\1\41\1\234\2\41\1\235"+
+    "\4\41\1\233\1\234\11\41\1\0\3\41\1\235\4\41"+
+    "\1\236\1\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\6\0\1\46\7\0\1\237"+
+    "\10\0\1\41\1\240\13\41\1\240\7\41\1\0\12\41"+
+    "\1\241\2\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\20\0\2\42\2\0\1\42\104\0"+
+    "\1\242\2\0\3\242\1\0\2\242\30\0\25\242\1\0"+
+    "\12\242\3\0\4\242\1\0\4\242\3\0\22\243\1\244"+
+    "\1\245\1\246\1\243\1\247\74\243\27\0\1\64\1\65"+
+    "\121\0\1\65\1\64\121\0\1\65\1\0\1\65\120\0"+
+    "\1\64\122\0\1\250\1\65\2\0\1\251\1\0\1\252"+
+    "\114\0\1\65\4\0\1\64\115\0\1\65\4\0\1\253"+
+    "\1\123\114\0\1\65\1\254\121\0\1\65\7\0\1\65"+
+    "\112\0\1\65\10\0\1\65\111\0\1\65\123\0\1\255"+
+    "\12\0\1\65\60\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\1\41\1\256\13\41\1\256\7\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\257"+
+    "\1\0\10\41\27\0\22\41\1\257\2\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\3\41\1\260\4\41\27\0\1\41\1\261\1\41"+
+    "\1\262\2\41\1\262\5\41\1\263\1\261\1\41\1\260"+
+    "\5\41\1\0\1\41\1\263\10\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\264\1\0\10\41\27\0"+
+    "\2\41\1\265\10\41\1\265\6\41\1\264\2\41\1\0"+
+    "\10\41\1\266\1\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\267\1\0\10\41\27\0\1\270\4\41"+
+    "\1\271\4\41\1\270\7\41\1\267\2\41\1\0\3\41"+
+    "\1\271\6\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\2\41\1\272\5\41\27\0\3\41"+
+    "\1\273\2\41\1\274\1\275\1\272\3\41\1\276\10\41"+
+    "\1\0\1\41\1\276\10\41\3\0\1\41\1\277\2\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\11\41\1\340\3\0\4\41\1\0"+
-    "\4\41\115\0\1\341\10\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\2\41\1\312\10\41\1\312\10\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\24\41\1\0\12\41\3\0"+
-    "\4\41\1\0\2\41\1\342\1\41\3\0\22\123\1\343"+
-    "\1\0\1\344\1\123\1\345\76\123\1\346\2\123\3\346"+
-    "\1\123\1\347\1\346\6\123\1\350\1\351\1\344\1\123"+
-    "\1\352\15\123\24\346\1\123\12\346\3\123\4\346\1\123"+
-    "\4\346\147\123\1\353\1\351\1\344\1\123\1\354\73\123"+
-    "\22\130\1\355\1\130\1\356\1\0\1\357\76\130\1\346"+
-    "\2\130\3\346\1\130\1\360\1\346\6\130\1\361\1\130"+
-    "\1\356\1\351\1\352\15\130\24\346\1\130\12\346\3\130"+
-    "\4\346\1\130\4\346\147\130\1\353\1\130\1\356\1\351"+
-    "\1\362\73\130\30\0\1\363\113\0\1\353\100\0\1\137"+
-    "\1\0\1\137\1\0\10\137\27\0\24\137\1\0\12\137"+
-    "\3\0\4\137\1\0\4\137\115\0\1\364\7\0\15\141"+
-    "\1\0\3\141\1\0\1\365\1\141\1\366\1\141\1\367"+
-    "\76\141\1\370\2\141\3\370\1\141\2\370\1\141\1\0"+
-    "\3\141\1\0\1\365\1\141\1\366\1\141\1\367\15\141"+
-    "\24\370\1\141\12\370\3\141\4\370\1\141\4\370\6\141"+
-    "\1\370\2\141\3\370\1\141\2\370\1\141\1\371\3\141"+
-    "\1\0\1\365\1\141\1\366\1\141\1\367\15\141\24\370"+
-    "\1\141\12\370\3\141\4\370\1\141\4\370\3\141\3\0"+
-    "\1\346\2\0\3\346\1\0\2\346\12\0\1\352\15\0"+
-    "\24\346\1\0\12\346\3\0\4\346\1\0\4\346\3\0"+
-    "\122\141\1\0\1\372\1\0\1\372\1\0\10\372\1\373"+
-    "\2\0\1\374\1\373\22\0\24\372\1\0\12\372\3\0"+
-    "\4\372\1\0\4\372\4\0\1\375\1\0\1\375\1\0"+
-    "\10\375\1\376\2\0\1\377\1\376\22\0\24\375\1\0"+
-    "\12\375\3\0\4\375\1\0\4\375\3\0\15\u0100\1\154"+
-    "\3\u0100\1\154\101\u0100\1\u0101\1\u0100\1\u0101\1\u0100\5\u0101"+
-    "\1\u0100\1\u0101\1\u0100\1\0\2\u0100\1\u0102\1\0\22\u0100"+
-    "\24\u0101\1\u0100\12\u0101\3\u0100\4\u0101\1\u0100\4\u0101\6\u0100"+
-    "\1\u0103\2\u0100\3\u0103\1\u0100\1\u0104\1\u0103\1\u0100\1\154"+
-    "\3\u0100\1\154\22\u0100\24\u0103\1\u0100\12\u0103\3\u0100\4\u0103"+
-    "\1\u0100\4\u0103\3\u0100\1\0\1\u0105\1\0\1\u0105\1\0"+
-    "\10\u0105\1\u0106\2\0\1\u0107\1\u0106\22\0\24\u0105\1\0"+
-    "\12\u0105\3\0\4\u0105\1\0\4\u0105\4\0\1\u0108\1\0"+
-    "\1\u0108\1\0\10\u0108\1\u0109\2\0\1\u010a\1\u0109\22\0"+
-    "\24\u0108\1\0\12\u0108\3\0\4\u0108\1\0\4\u0108\4\0"+
-    "\1\162\1\0\1\162\1\0\10\162\27\0\24\162\1\0"+
-    "\12\162\3\0\4\162\1\0\4\162\33\0\1\u010b\72\0"+
-    "\1\u010c\1\0\1\u010c\1\0\10\u010c\2\u010d\2\0\1\u010d"+
-    "\5\0\1\u010e\14\0\24\u010c\1\0\12\u010c\3\0\4\u010c"+
-    "\1\0\4\u010c\4\0\1\167\3\0\1\167\3\0\1\167"+
-    "\111\0\1\167\3\0\1\167\1\230\2\0\1\167\113\0"+
-    "\1\u010f\2\0\3\u010f\1\0\2\u010f\30\0\24\u010f\1\0"+
-    "\12\u010f\3\0\4\u010f\1\0\4\u010f\3\0\34\175\1\u0110"+
-    "\121\175\1\u0110\1\u0111\64\175\34\177\1\u0112\121\177\1\u0112"+
-    "\1\u0113\64\177\15\201\1\202\3\201\1\202\14\201\1\202"+
-    "\4\201\1\202\56\201\15\0\1\u0114\104\0\15\201\1\202"+
-    "\3\201\1\202\13\201\1\u0115\1\202\4\201\1\202\56\201"+
-    "\30\0\1\u0116\121\0\1\254\106\0\2\210\2\0\1\210"+
-    "\100\0\33\26\1\0\2\26\1\0\4\26\1\0\5\26"+
-    "\1\0\1\26\1\0\4\26\2\0\5\26\3\0\12\26"+
-    "\1\0\15\26\27\0\1\u0117\121\0\1\u0117\41\0\1\u0118"+
-    "\3\0\1\u0118\113\0\1\u0119\3\0\1\u0119\27\0\1\216"+
-    "\1\0\1\217\1\0\1\216\3\0\1\216\54\0\1\217"+
-    "\34\0\1\167\2\0\1\u011a\1\167\3\0\1\167\17\0"+
-    "\1\u011a\72\0\1\65\120\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\5\41\1\u011b\1\41\1\u011c\14\41\1\0"+
-    "\3\41\1\u011b\1\41\1\u011c\4\41\3\0\4\41\1\0"+
+    "\27\0\1\41\1\300\13\41\1\300\7\41\1\0\11\41"+
+    "\1\301\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\1\233\1\41\1\234\2\41"+
+    "\1\235\3\41\1\302\1\233\1\234\11\41\1\0\3\41"+
+    "\1\235\4\41\1\236\1\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\5\41"+
+    "\1\303\17\41\1\0\3\41\1\303\6\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\1\41\1\256\13\41\1\256\1\41\1\304\5\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\305\1\0\10\41\27\0\7\41\1\306\12\41"+
+    "\1\305\2\41\1\0\5\41\1\307\4\41\3\0\2\41"+
+    "\1\310\1\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\1\311\10\41\1\312\1\311\12\41"+
+    "\1\0\6\41\1\312\3\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\6\0\1\46"+
+    "\7\0\1\237\10\0\1\41\1\240\10\41\1\313\2\41"+
+    "\1\240\7\41\1\0\12\41\1\241\2\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\4\41\1\u011d\14\41\1\u011d\2\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\14\41\1\u011e\7\41\1\0\1\41\1\u011e"+
-    "\10\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\2\41\1\u011f\10\41\1\u011f"+
-    "\10\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\11\41\1\u0120\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\1\u0121"+
-    "\3\41\1\u0121\5\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\u0122\1\0\1\u0122\1\0\1\u0122\1\0\3\u0122\34\0"+
-    "\1\u0122\1\0\1\u0122\3\0\1\u0122\2\0\1\u0122\3\0"+
-    "\1\u0122\1\0\3\u0122\3\0\1\u0122\33\0\1\u0123\3\0"+
-    "\1\u0123\111\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\41\1\u0124\13\41\1\u0124\6\41\1\0\12\41\3\0"+
+    "\2\41\1\314\7\41\1\315\1\314\11\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\1\316\1\41\1\317\6\41\1\320"+
+    "\1\316\1\317\11\41\1\0\6\41\1\320\3\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\11\41\1\u0125\12\41\1\0\6\41\1\u0125"+
-    "\3\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\3\41\1\u0126\2\41\1\u0126"+
-    "\15\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\3\41\1\u0127"+
-    "\2\41\1\u0127\15\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\36\0\1\u0128\67\0\1\41\1\0\1\u0129\1\0"+
-    "\10\41\27\0\22\41\1\u0129\1\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\241\1\0\1\241\1\0"+
-    "\10\241\27\0\24\241\1\0\12\241\3\0\4\241\1\0"+
-    "\4\241\3\0\3\242\1\0\2\242\3\0\2\242\1\0"+
-    "\6\242\1\243\1\244\1\245\1\242\1\0\15\242\24\0"+
-    "\1\242\12\0\3\242\4\0\1\242\4\0\147\242\1\0"+
-    "\1\244\1\245\1\242\1\246\73\242\30\0\1\65\120\0"+
-    "\1\65\3\0\1\u012a\146\0\1\u012b\11\0\1\u012b\63\0"+
-    "\1\u012c\102\0\2\253\2\0\1\253\115\0\2\254\2\0"+
-    "\1\254\101\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\7\41\1\u012d\14\41\1\0\5\41\1\u012d\4\41\3\0"+
-    "\4\41\1\0\3\41\1\u012e\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\14\41\1\u012f\7\41\1\0\1\41"+
-    "\1\u012f\10\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\1\41\1\u0130\13\41"+
-    "\1\u0130\6\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\4\41"+
-    "\1\255\14\41\1\255\2\41\1\0\12\41\3\0\4\41"+
+    "\10\41\27\0\1\41\1\321\1\322\10\41\1\322\1\41"+
+    "\1\321\7\41\1\0\10\41\1\323\1\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\305\1\0\10\41"+
+    "\27\0\7\41\1\307\12\41\1\305\2\41\1\0\5\41"+
+    "\1\307\4\41\3\0\2\41\1\310\1\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\2\41\1\272\5\41"+
+    "\27\0\3\41\1\273\2\41\1\273\1\41\1\272\3\41"+
+    "\1\276\10\41\1\0\1\41\1\276\10\41\3\0\1\41"+
+    "\1\277\2\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\3\41\1\324\2\41\1\324\5\41"+
+    "\1\325\10\41\1\0\1\41\1\325\10\41\3\0\4\41"+
+    "\1\0\4\41\3\0\24\241\1\326\57\241\1\245\16\241"+
+    "\7\0\1\327\1\330\5\0\1\331\25\0\1\332\1\333"+
+    "\1\334\1\0\1\335\1\336\2\0\1\327\1\0\1\332"+
+    "\1\334\1\337\1\333\1\0\1\330\1\0\1\335\5\0"+
+    "\1\337\1\0\1\336\4\0\1\340\21\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\5\41\1\341\17\41\1\0"+
+    "\3\41\1\341\6\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\25\41\1\0"+
+    "\11\41\1\342\3\0\4\41\1\0\4\41\116\0\1\343"+
+    "\10\0\1\41\1\0\1\41\1\0\10\41\27\0\2\41"+
+    "\1\314\10\41\1\314\11\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\12\41\3\0\2\41\1\u0131\1\41"+
+    "\27\0\25\41\1\0\12\41\3\0\4\41\1\0\2\41"+
+    "\1\344\1\41\3\0\22\124\1\345\1\0\1\346\1\124"+
+    "\1\347\77\124\1\350\2\124\3\350\1\124\1\351\1\350"+
+    "\6\124\1\352\1\353\1\346\1\124\1\354\15\124\25\350"+
+    "\1\124\12\350\3\124\4\350\1\124\4\350\150\124\1\355"+
+    "\1\353\1\346\1\124\1\356\74\124\22\131\1\357\1\131"+
+    "\1\360\1\0\1\361\77\131\1\350\2\131\3\350\1\131"+
+    "\1\362\1\350\6\131\1\363\1\131\1\360\1\353\1\354"+
+    "\15\131\25\350\1\131\12\350\3\131\4\350\1\131\4\350"+
+    "\150\131\1\355\1\131\1\360\1\353\1\364\74\131\30\0"+
+    "\1\365\114\0\1\355\101\0\1\140\1\0\1\140\1\0"+
+    "\10\140\27\0\25\140\1\0\12\140\3\0\4\140\1\0"+
+    "\4\140\116\0\1\366\7\0\15\142\1\0\3\142\1\0"+
+    "\1\367\1\142\1\370\1\142\1\371\77\142\1\372\2\142"+
+    "\3\372\1\142\2\372\1\142\1\0\3\142\1\0\1\367"+
+    "\1\142\1\370\1\142\1\371\15\142\25\372\1\142\12\372"+
+    "\3\142\4\372\1\142\4\372\6\142\1\372\2\142\3\372"+
+    "\1\142\2\372\1\142\1\373\3\142\1\0\1\367\1\142"+
+    "\1\370\1\142\1\371\15\142\25\372\1\142\12\372\3\142"+
+    "\4\372\1\142\4\372\3\142\3\0\1\350\2\0\3\350"+
+    "\1\0\2\350\12\0\1\354\15\0\25\350\1\0\12\350"+
+    "\3\0\4\350\1\0\4\350\3\0\123\142\1\0\1\374"+
+    "\1\0\1\374\1\0\10\374\1\375\2\0\1\376\1\375"+
+    "\22\0\25\374\1\0\12\374\3\0\4\374\1\0\4\374"+
+    "\4\0\1\377\1\0\1\377\1\0\10\377\1\u0100\2\0"+
+    "\1\u0101\1\u0100\22\0\25\377\1\0\12\377\3\0\4\377"+
+    "\1\0\4\377\3\0\15\u0102\1\155\3\u0102\1\155\102\u0102"+
+    "\1\u0103\1\u0102\1\u0103\1\u0102\5\u0103\1\u0102\1\u0103\1\u0102"+
+    "\1\0\2\u0102\1\u0104\1\0\22\u0102\25\u0103\1\u0102\12\u0103"+
+    "\3\u0102\4\u0103\1\u0102\4\u0103\6\u0102\1\u0105\2\u0102\3\u0105"+
+    "\1\u0102\1\u0106\1\u0105\1\u0102\1\155\3\u0102\1\155\22\u0102"+
+    "\25\u0105\1\u0102\12\u0105\3\u0102\4\u0105\1\u0102\4\u0105\3\u0102"+
+    "\1\0\1\u0107\1\0\1\u0107\1\0\10\u0107\1\u0108\2\0"+
+    "\1\u0109\1\u0108\22\0\25\u0107\1\0\12\u0107\3\0\4\u0107"+
+    "\1\0\4\u0107\4\0\1\u010a\1\0\1\u010a\1\0\10\u010a"+
+    "\1\u010b\2\0\1\u010c\1\u010b\22\0\25\u010a\1\0\12\u010a"+
+    "\3\0\4\u010a\1\0\4\u010a\4\0\1\163\1\0\1\163"+
+    "\1\0\10\163\27\0\25\163\1\0\12\163\3\0\4\163"+
+    "\1\0\4\163\33\0\1\u010d\73\0\1\u010e\1\0\1\u010e"+
+    "\1\0\10\u010e\2\u010f\2\0\1\u010f\5\0\1\u0110\14\0"+
+    "\25\u010e\1\0\12\u010e\3\0\4\u010e\1\0\4\u010e\4\0"+
+    "\1\170\3\0\1\170\3\0\1\170\112\0\1\170\3\0"+
+    "\1\170\1\231\2\0\1\170\114\0\1\u0111\2\0\3\u0111"+
+    "\1\0\2\u0111\30\0\25\u0111\1\0\12\u0111\3\0\4\u0111"+
+    "\1\0\4\u0111\3\0\34\176\1\u0112\122\176\1\u0112\1\u0113"+
+    "\65\176\34\200\1\u0114\122\200\1\u0114\1\u0115\65\200\15\202"+
+    "\1\203\3\202\1\203\14\202\1\203\4\202\1\203\57\202"+
+    "\15\0\1\u0116\105\0\15\202\1\203\3\202\1\203\13\202"+
+    "\1\u0117\1\203\4\202\1\203\57\202\30\0\1\u0118\122\0"+
+    "\1\255\107\0\2\211\2\0\1\211\101\0\33\26\1\0"+
+    "\2\26\1\0\4\26\1\0\5\26\1\0\1\26\1\0"+
+    "\4\26\2\0\6\26\3\0\12\26\1\0\15\26\27\0"+
+    "\1\u0119\122\0\1\u0119\42\0\1\u011a\3\0\1\u011a\114\0"+
+    "\1\u011b\3\0\1\u011b\27\0\1\217\1\0\1\220\1\0"+
+    "\1\217\3\0\1\217\54\0\1\220\35\0\1\170\2\0"+
+    "\1\u011c\1\170\3\0\1\170\17\0\1\u011c\73\0\1\65"+
+    "\121\0\1\41\1\0\1\41\1\0\10\41\27\0\5\41"+
+    "\1\u011d\1\41\1\u011e\15\41\1\0\3\41\1\u011d\1\41"+
+    "\1\u011e\4\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\4\41\1\u011f\14\41"+
+    "\1\u011f\3\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\14\41"+
+    "\1\u0120\10\41\1\0\1\41\1\u0120\10\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\12\41\3\0\1\41\1\u0132\2\41"+
+    "\27\0\2\41\1\u0121\10\41\1\u0121\11\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\25\41\1\0\11\41\1\u0122\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\25\41\1\0\1\u0123\3\41\1\u0123\5\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\u0124\1\0\1\u0124"+
+    "\1\0\1\u0124\1\0\3\u0124\34\0\1\u0124\1\0\1\u0124"+
+    "\3\0\1\u0124\2\0\1\u0124\3\0\1\u0124\1\0\2\u0124"+
+    "\1\0\1\u0124\3\0\1\u0124\33\0\1\u0125\3\0\1\u0125"+
+    "\112\0\1\41\1\0\1\41\1\0\10\41\27\0\1\41"+
+    "\1\u0126\13\41\1\u0126\7\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\11\41\1\u0133\12\41\1\0\6\41\1\u0133\3\41"+
+    "\27\0\11\41\1\u0127\13\41\1\0\6\41\1\u0127\3\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\2\41\1\u0134\5\41\27\0\10\41\1\u0134\12\41"+
-    "\1\u0135\1\0\2\41\1\u0135\7\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u0136\1\0\10\41\27\0"+
-    "\22\41\1\u0136\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\7\41\1\u0137\4\41\1\u0138\6\41\1\u0139\1\0\1\41"+
-    "\1\u0138\1\u0139\2\41\1\u0137\4\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\7\41\1\u013a\4\41\1\u0138\6\41\1\u0139\1\0\1\41"+
-    "\1\u0138\1\u0139\2\41\1\u0137\4\41\3\0\4\41\1\0"+
+    "\1\0\10\41\27\0\3\41\1\u0128\2\41\1\u0128\16\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\3\41\1\u0129\2\41"+
+    "\1\u0129\16\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\36\0\1\u012a\70\0\1\41\1\0\1\u012b\1\0\10\41"+
+    "\27\0\22\41\1\u012b\2\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\242\1\0\1\242\1\0\10\242"+
+    "\27\0\25\242\1\0\12\242\3\0\4\242\1\0\4\242"+
+    "\3\0\3\243\1\0\2\243\3\0\2\243\1\0\6\243"+
+    "\1\244\1\245\1\246\1\243\1\0\15\243\25\0\1\243"+
+    "\12\0\3\243\4\0\1\243\4\0\150\243\1\0\1\245"+
+    "\1\246\1\243\1\247\74\243\30\0\1\65\121\0\1\65"+
+    "\3\0\1\u012c\147\0\1\u012d\12\0\1\u012d\63\0\1\u012e"+
+    "\103\0\2\254\2\0\1\254\116\0\2\255\2\0\1\255"+
+    "\102\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
+    "\1\u012f\15\41\1\0\5\41\1\u012f\4\41\3\0\4\41"+
+    "\1\0\3\41\1\u0130\4\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\14\41\1\u0131\10\41\1\0\1\41\1\u0131"+
+    "\10\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\1\41\1\u0132\13\41\1\u0132"+
+    "\7\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\4\41\1\256"+
+    "\14\41\1\256\3\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\22\41\1\u013b\1\41\1\0\12\41\3\0\4\41\1\0"+
+    "\25\41\1\0\12\41\3\0\2\41\1\u0133\1\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\14\41\1\u013c\7\41\1\0\1\41\1\u013c\10\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\24\41\1\0\1\u013d\3\41\1\u013d\5\41"+
-    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\2\41\1\u013e\10\41\1\u013e\10\41"+
-    "\1\0\10\41\1\u013f\1\41\3\0\1\u0140\3\41\1\0"+
+    "\25\41\1\0\12\41\3\0\1\41\1\u0134\2\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\41\1\u0141\13\41\1\u0141\6\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\12\41\1\u0142\11\41\1\0\12\41\3\0"+
+    "\11\41\1\u0135\13\41\1\0\6\41\1\u0135\3\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\14\41\1\u0143\7\41\1\0\1\41\1\u0143"+
-    "\10\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\11\41\1\u0144\12\41\1\0"+
-    "\6\41\1\u0144\3\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u0145"+
-    "\10\41\1\u0145\1\41\1\u0146\6\41\1\0\12\41\3\0"+
+    "\2\41\1\u0136\5\41\27\0\10\41\1\u0136\13\41\1\u0137"+
+    "\1\0\2\41\1\u0137\7\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\u0138\1\0\10\41\27\0\22\41"+
+    "\1\u0138\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
+    "\1\u0139\4\41\1\u013a\7\41\1\u013b\1\0\1\41\1\u013a"+
+    "\1\u013b\2\41\1\u0139\4\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
+    "\1\u013c\4\41\1\u013a\7\41\1\u013b\1\0\1\41\1\u013a"+
+    "\1\u013b\2\41\1\u0139\4\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\22\41"+
+    "\1\u013d\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\14\41"+
+    "\1\u013e\10\41\1\0\1\41\1\u013e\10\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\25\41\1\0\1\u013f\3\41\1\u013f\5\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\2\41\1\u0145\10\41\1\u0145\10\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\5\41\1\u0147\16\41\1\0"+
-    "\3\41\1\u0147\6\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u0148"+
-    "\14\41\1\0\5\41\1\u0148\4\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\u0149\11\41\1\u0149\11\41\1\0\12\41\3\0\4\41"+
+    "\10\41\27\0\2\41\1\u0140\10\41\1\u0140\11\41\1\0"+
+    "\10\41\1\u0141\1\41\3\0\1\u0142\3\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\41"+
+    "\1\u0143\13\41\1\u0143\7\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\12\41\1\u014a\11\41\1\0\12\41\3\0\4\41"+
+    "\27\0\12\41\1\u0144\12\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\41\1\u014b\13\41\1\u014b\6\41\1\0\12\41"+
+    "\27\0\14\41\1\u0145\10\41\1\0\1\41\1\u0145\10\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\5\41\1\u014c\16\41\1\0\12\41"+
+    "\1\0\10\41\27\0\23\41\1\u0146\1\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\3\41\1\u014d\2\41\1\u014d\15\41"+
-    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u014e\1\41"+
-    "\1\u014f\2\41\1\u0150\7\41\1\0\1\41\1\u0150\3\41"+
-    "\1\u014e\1\u014f\3\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\1\u0151\1\41"+
-    "\1\u0152\7\41\1\u0151\1\u0152\10\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\1\u0153\4\41\1\u0154\4\41\1\u0153\11\41"+
-    "\1\0\3\41\1\u0154\6\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\41"+
-    "\1\u0155\13\41\1\u0155\6\41\1\0\12\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\3\41"+
-    "\1\u0156\4\41\27\0\17\41\1\u0156\4\41\1\0\12\41"+
+    "\1\0\10\41\27\0\11\41\1\u0147\13\41\1\0\6\41"+
+    "\1\u0147\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\2\41\1\u0148\10\41"+
+    "\1\u0148\1\41\1\u0149\7\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\2\41\1\u0148\10\41\1\u0148\11\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\14\41\1\u0157\7\41\1\0\1\41"+
-    "\1\u0157\10\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u0158\1\0\10\41\27\0\22\41\1\u0158\1\41"+
-    "\1\0\12\41\3\0\4\41\1\0\4\41\3\0\122\240"+
-    "\55\0\1\u0159\21\0\1\u0159\66\0\1\u015a\4\0\1\u015b"+
-    "\4\0\1\u015a\15\0\1\u015b\35\0\1\u015c\52\0\1\u015c"+
-    "\41\0\1\u015d\62\0\1\u015d\100\0\1\u015e\13\0\1\u015e"+
-    "\104\0\1\u015f\11\0\1\u015f\112\0\1\u0160\2\0\1\u0160"+
-    "\122\0\1\u0161\22\0\1\u0161\72\0\1\u0162\2\0\1\u0162"+
-    "\50\0\1\41\1\0\1\u0163\1\0\10\41\27\0\22\41"+
-    "\1\u0163\1\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\5\41"+
-    "\1\u0164\16\41\1\0\3\41\1\u0164\6\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\2\41"+
-    "\1\u0165\5\41\27\0\3\41\1\u0166\1\u0167\1\41\1\u0166"+
-    "\1\u0168\1\u0165\1\u0169\7\41\1\u0167\1\41\1\u016a\1\0"+
-    "\2\41\1\u016a\2\41\1\u0168\1\u0169\2\41\1\u016b\3\0"+
-    "\1\41\1\u016c\2\41\1\0\4\41\3\0\3\123\1\0"+
-    "\2\123\3\0\2\123\1\0\6\123\1\350\1\351\1\344"+
-    "\1\123\1\0\15\123\24\0\1\123\12\0\3\123\4\0"+
-    "\1\123\4\0\25\123\1\0\1\351\1\344\1\123\1\354"+
-    "\73\123\1\0\1\346\1\0\1\346\1\0\10\346\27\0"+
-    "\24\346\1\0\12\346\3\0\4\346\1\0\4\346\1\0"+
-    "\1\u016d\1\0\1\123\1\347\1\123\1\347\1\123\10\347"+
-    "\5\123\1\343\1\0\1\344\1\123\1\345\15\123\24\347"+
-    "\1\123\12\347\3\123\4\347\1\123\4\347\1\123\1\u016e"+
-    "\1\123\3\130\1\0\2\130\3\0\2\130\1\0\6\130"+
-    "\1\361\1\130\1\356\1\351\1\0\15\130\24\0\1\130"+
-    "\12\0\3\130\4\0\1\130\4\0\25\130\1\0\1\130"+
-    "\1\356\1\351\1\362\74\130\1\360\1\130\1\360\1\130"+
-    "\10\360\5\130\1\355\1\130\1\356\1\0\1\357\15\130"+
-    "\24\360\1\130\12\360\3\130\4\360\1\130\4\360\1\130"+
-    "\1\u016f\1\130\3\141\1\u0170\2\141\3\u0170\2\141\1\u0170"+
-    "\1\141\1\0\3\141\1\0\1\u0171\1\141\1\366\1\141"+
-    "\1\u0172\15\141\24\u0170\1\141\12\u0170\3\141\4\u0170\1\141"+
-    "\4\u0170\20\141\1\0\3\141\1\0\115\141\1\0\3\141"+
-    "\1\0\1\u0172\1\141\1\366\1\141\1\u0173\74\141\1\370"+
-    "\1\141\1\370\1\141\10\370\1\u0174\2\141\1\u0175\1\u0174"+
-    "\1\365\1\141\1\366\1\141\1\367\15\141\24\370\1\141"+
-    "\12\370\3\141\4\370\1\141\4\370\3\141\3\0\1\u0176"+
-    "\2\0\3\u0176\1\0\2\u0176\30\0\24\u0176\1\0\12\u0176"+
-    "\3\0\4\u0176\1\0\4\u0176\20\0\1\373\3\0\1\373"+
-    "\115\0\1\376\3\0\1\376\100\0\15\u0100\1\0\3\u0100"+
-    "\1\0\101\u0100\1\u0103\1\u0100\1\u0103\1\u0100\5\u0103\1\u0104"+
-    "\1\u0103\1\u0104\1\u0177\2\u0100\1\u0178\1\u0177\22\u0100\24\u0103"+
-    "\1\u0100\12\u0103\3\u0100\4\u0103\1\u0100\4\u0103\4\u0100\1\u0104"+
-    "\1\u0100\1\u0104\1\u0100\10\u0104\1\u0179\2\u0100\1\u017a\1\u0179"+
-    "\22\u0100\24\u0104\1\u0100\12\u0104\3\u0100\4\u0104\1\u0100\4\u0104"+
-    "\3\u0100\15\0\1\u0106\3\0\1\u0106\115\0\1\u0109\3\0"+
-    "\1\u0109\115\0\2\u010d\2\0\1\u010d\5\0\1\u010e\73\0"+
-    "\1\u010f\1\0\1\u010f\1\0\10\u010f\27\0\24\u010f\1\0"+
-    "\12\u010f\3\0\4\u010f\1\0\4\u010f\3\0\34\175\1\u0110"+
-    "\1\u017b\64\175\34\177\1\u0112\1\u017c\64\177\15\201\1\202"+
-    "\3\201\1\202\14\201\1\202\4\201\1\202\14\201\1\u017d"+
-    "\11\201\1\u017d\27\201\15\0\2\u0116\2\0\1\u0116\202\0"+
-    "\1\u017e\64\0\1\u017f\13\0\1\u017f\41\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\7\41\1\u0180\14\41\1\0"+
-    "\5\41\1\u0180\4\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\u0181\1\0\10\41\27\0\22\41\1\u0181"+
-    "\1\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\2\41\1\u0182\5\41\27\0"+
-    "\4\41\1\u0183\1\u0184\2\41\1\u0182\3\41\1\u0185\4\41"+
-    "\1\u0183\2\41\1\0\1\41\1\u0185\1\41\1\u0184\6\41"+
-    "\3\0\2\41\1\u0186\1\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u0187\1\0\10\41\27\0\22\41\1\u0187\1\41"+
-    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u0188\12\41"+
-    "\1\0\6\41\1\u0188\3\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\u0189"+
-    "\11\41\1\u0189\11\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\0\10\41\27\0\5\41\1\u014a\17\41\1\0\3\41"+
+    "\1\u014a\6\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u014b\15\41"+
+    "\1\0\5\41\1\u014b\4\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\u014c"+
+    "\11\41\1\u014c\12\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\7\41\1\u018a\14\41\1\0\5\41\1\u018a\4\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u018b\1\0"+
-    "\10\41\27\0\22\41\1\u018b\1\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\14\41\1\u018c\7\41\1\0\1\41\1\u018c"+
-    "\10\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\2\41\1\u018d\10\41\1\u018d"+
-    "\10\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\23\41\1\u018e"+
-    "\1\0\2\41\1\u018e\7\41\3\0\4\41\1\0\4\41"+
-    "\36\0\1\u012a\67\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\2\41\1\u018f\10\41\1\u018f\10\41\1\0\12\41"+
-    "\3\0\4\41\1\0\4\41\6\0\1\u0190\2\0\3\u0190"+
-    "\1\0\2\u0190\2\0\1\u012a\4\0\1\u0191\20\0\24\u0190"+
-    "\1\0\12\u0190\1\u0192\2\0\4\u0190\1\0\4\u0190\72\0"+
-    "\1\u0193\3\0\1\u0193\43\0\2\u0194\2\0\1\u0194\101\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\10\41\1\u0195\1\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\10\41\1\u0196\1\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u0197"+
-    "\14\41\1\0\5\41\1\u0197\4\41\3\0\4\41\1\0"+
+    "\12\41\1\u014d\12\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\2\41\1\u0198\10\41\1\u0198\10\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u0199\1\0"+
-    "\10\41\27\0\22\41\1\u0199\1\41\1\0\12\41\3\0"+
+    "\1\41\1\u014e\13\41\1\u014e\7\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\11\41\1\u019a\12\41\1\0\6\41\1\u019a"+
-    "\3\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\2\41\1\u019b\10\41\1\u019b"+
-    "\10\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\11\41\1\u019c"+
-    "\12\41\1\0\6\41\1\u019c\3\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u019d\1\0\10\41\27\0"+
-    "\22\41\1\u019d\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\7\41\1\u019e\14\41\1\0\5\41\1\u019e\4\41\3\0"+
+    "\10\41\27\0\5\41\1\u014f\17\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\11\41\1\u019f\12\41\1\0\6\41\1\u019f"+
-    "\3\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\15\41\1\u01a0\6\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\u01a1\1\0\10\41\27\0\22\41\1\u01a1\1\41\1\0"+
+    "\10\41\27\0\3\41\1\u0150\2\41\1\u0150\16\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\11\41\1\u01a2\12\41\1\0"+
-    "\6\41\1\u01a2\3\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\5\41\1\u01a3"+
-    "\16\41\1\0\3\41\1\u01a3\6\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u01a4\1\0\10\41\27\0"+
-    "\22\41\1\u01a4\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\u01a5\11\41\1\u01a5\11\41\1\0\12\41\3\0\4\41"+
+    "\1\41\1\0\10\41\27\0\7\41\1\u0151\1\41\1\u0152"+
+    "\2\41\1\u0153\10\41\1\0\1\41\1\u0153\3\41\1\u0151"+
+    "\1\u0152\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\1\u0154\1\41\1\u0155"+
+    "\7\41\1\u0154\1\u0155\11\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\13\41\1\u01a6\10\41\1\0\12\41\3\0\4\41"+
+    "\27\0\1\u0156\4\41\1\u0157\4\41\1\u0156\12\41\1\0"+
+    "\3\41\1\u0157\6\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\1\41\1\u0158"+
+    "\13\41\1\u0158\7\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\3\41\1\u0159"+
+    "\4\41\27\0\17\41\1\u0159\5\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\14\41\1\u015a\10\41\1\0\1\41\1\u015a"+
+    "\10\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\u015b\1\0\10\41\27\0\22\41\1\u015b\2\41\1\0"+
+    "\12\41\3\0\4\41\1\0\4\41\3\0\123\241\55\0"+
+    "\1\u015c\22\0\1\u015c\66\0\1\u015d\4\0\1\u015e\4\0"+
+    "\1\u015d\16\0\1\u015e\35\0\1\u015f\52\0\1\u015f\42\0"+
+    "\1\u0160\62\0\1\u0160\101\0\1\u0161\13\0\1\u0161\105\0"+
+    "\1\u0162\11\0\1\u0162\113\0\1\u0163\2\0\1\u0163\123\0"+
+    "\1\u0164\23\0\1\u0164\72\0\1\u0165\2\0\1\u0165\51\0"+
+    "\1\41\1\0\1\u0166\1\0\10\41\27\0\22\41\1\u0166"+
+    "\2\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\5\41\1\u0167"+
+    "\17\41\1\0\3\41\1\u0167\6\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\2\41\1\u0168"+
+    "\5\41\27\0\3\41\1\u0169\1\u016a\1\41\1\u0169\1\u016b"+
+    "\1\u0168\1\u016c\7\41\1\u016a\2\41\1\u016d\1\0\2\41"+
+    "\1\u016d\2\41\1\u016b\1\u016c\2\41\1\u016e\3\0\1\41"+
+    "\1\u016f\2\41\1\0\4\41\3\0\3\124\1\0\2\124"+
+    "\3\0\2\124\1\0\6\124\1\352\1\353\1\346\1\124"+
+    "\1\0\15\124\25\0\1\124\12\0\3\124\4\0\1\124"+
+    "\4\0\25\124\1\0\1\353\1\346\1\124\1\356\74\124"+
+    "\1\0\1\350\1\0\1\350\1\0\10\350\27\0\25\350"+
+    "\1\0\12\350\3\0\4\350\1\0\4\350\1\0\1\u0170"+
+    "\1\0\1\124\1\351\1\124\1\351\1\124\10\351\5\124"+
+    "\1\345\1\0\1\346\1\124\1\347\15\124\25\351\1\124"+
+    "\12\351\3\124\4\351\1\124\4\351\1\124\1\u0171\1\124"+
+    "\3\131\1\0\2\131\3\0\2\131\1\0\6\131\1\363"+
+    "\1\131\1\360\1\353\1\0\15\131\25\0\1\131\12\0"+
+    "\3\131\4\0\1\131\4\0\25\131\1\0\1\131\1\360"+
+    "\1\353\1\364\75\131\1\362\1\131\1\362\1\131\10\362"+
+    "\5\131\1\357\1\131\1\360\1\0\1\361\15\131\25\362"+
+    "\1\131\12\362\3\131\4\362\1\131\4\362\1\131\1\u0172"+
+    "\1\131\3\142\1\u0173\2\142\3\u0173\2\142\1\u0173\1\142"+
+    "\1\0\3\142\1\0\1\u0174\1\142\1\370\1\142\1\u0175"+
+    "\15\142\25\u0173\1\142\12\u0173\3\142\4\u0173\1\142\4\u0173"+
+    "\20\142\1\0\3\142\1\0\116\142\1\0\3\142\1\0"+
+    "\1\u0175\1\142\1\370\1\142\1\u0176\75\142\1\372\1\142"+
+    "\1\372\1\142\10\372\1\u0177\2\142\1\u0178\1\u0177\1\367"+
+    "\1\142\1\370\1\142\1\371\15\142\25\372\1\142\12\372"+
+    "\3\142\4\372\1\142\4\372\3\142\3\0\1\u0179\2\0"+
+    "\3\u0179\1\0\2\u0179\30\0\25\u0179\1\0\12\u0179\3\0"+
+    "\4\u0179\1\0\4\u0179\20\0\1\375\3\0\1\375\116\0"+
+    "\1\u0100\3\0\1\u0100\101\0\15\u0102\1\0\3\u0102\1\0"+
+    "\102\u0102\1\u0105\1\u0102\1\u0105\1\u0102\5\u0105\1\u0106\1\u0105"+
+    "\1\u0106\1\u017a\2\u0102\1\u017b\1\u017a\22\u0102\25\u0105\1\u0102"+
+    "\12\u0105\3\u0102\4\u0105\1\u0102\4\u0105\4\u0102\1\u0106\1\u0102"+
+    "\1\u0106\1\u0102\10\u0106\1\u017c\2\u0102\1\u017d\1\u017c\22\u0102"+
+    "\25\u0106\1\u0102\12\u0106\3\u0102\4\u0106\1\u0102\4\u0106\3\u0102"+
+    "\15\0\1\u0108\3\0\1\u0108\116\0\1\u010b\3\0\1\u010b"+
+    "\116\0\2\u010f\2\0\1\u010f\5\0\1\u0110\74\0\1\u0111"+
+    "\1\0\1\u0111\1\0\10\u0111\27\0\25\u0111\1\0\12\u0111"+
+    "\3\0\4\u0111\1\0\4\u0111\3\0\34\176\1\u0112\1\u017e"+
+    "\65\176\34\200\1\u0114\1\u017f\65\200\15\202\1\203\3\202"+
+    "\1\203\14\202\1\203\4\202\1\203\14\202\1\u0180\12\202"+
+    "\1\u0180\27\202\15\0\2\u0118\2\0\1\u0118\204\0\1\u0181"+
+    "\64\0\1\u0182\13\0\1\u0182\42\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\7\41\1\u0183\15\41\1\0\5\41"+
+    "\1\u0183\4\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\u0184\1\0\10\41\27\0\22\41\1\u0184\2\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\2\41\1\u0185\5\41\27\0\4\41"+
+    "\1\u0186\1\u0187\2\41\1\u0185\3\41\1\u0188\4\41\1\u0186"+
+    "\3\41\1\0\1\41\1\u0188\1\41\1\u0187\6\41\3\0"+
+    "\2\41\1\u0189\1\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\u018a\1\0\10\41\27\0\22\41\1\u018a\2\41\1\0"+
+    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\11\41\1\u018b\13\41\1\0"+
+    "\6\41\1\u018b\3\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\1\u018c\11\41"+
+    "\1\u018c\12\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
+    "\1\u018d\15\41\1\0\5\41\1\u018d\4\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u018e\1\0\10\41"+
+    "\27\0\22\41\1\u018e\2\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\7\41\1\u01a7\14\41\1\0\5\41\1\u01a7\4\41"+
+    "\27\0\14\41\1\u018f\10\41\1\0\1\41\1\u018f\10\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\2\41\1\u01a8\5\41\27\0\10\41\1\u01a8\13\41"+
+    "\1\0\10\41\27\0\2\41\1\u0190\10\41\1\u0190\11\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u01a9\14\41"+
-    "\1\0\5\41\1\u01a9\4\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\5\41"+
-    "\1\u01aa\16\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
-    "\1\u01ab\14\41\1\0\5\41\1\u01ab\4\41\3\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\24\41\1\u0191\1\0"+
+    "\2\41\1\u0191\7\41\3\0\4\41\1\0\4\41\36\0"+
+    "\1\u012c\70\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\2\41\1\u0192\10\41\1\u0192\11\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\6\0\1\u0193\2\0\3\u0193\1\0"+
+    "\2\u0193\2\0\1\u012c\4\0\1\u0194\20\0\25\u0193\1\0"+
+    "\12\u0193\1\u0195\2\0\4\u0193\1\0\4\u0193\73\0\1\u0196"+
+    "\3\0\1\u0196\43\0\2\u0197\2\0\1\u0197\102\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\10\41"+
+    "\1\u0198\1\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\10\41"+
+    "\1\u0199\1\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u019a\15\41"+
+    "\1\0\5\41\1\u019a\4\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\2\41"+
+    "\1\u019b\10\41\1\u019b\11\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u019c\1\0\10\41"+
+    "\27\0\22\41\1\u019c\2\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\u01ac\11\41\1\u01ac\11\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\3\41\1\u01ad\4\41\27\0\17\41\1\u01ad\4\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\11\41\1\u01ae\12\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\21\41\1\u01af\2\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\7\41\1\u01b0\4\41\1\u01b1"+
-    "\7\41\1\0\1\41\1\u01b1\3\41\1\u01b0\4\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\23\41\1\u01b2\1\0\2\41\1\u01b2\7\41"+
+    "\27\0\11\41\1\u019d\13\41\1\0\6\41\1\u019d\3\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\11\41\1\u01b3\12\41\1\0\6\41"+
-    "\1\u01b3\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u01b4\1\0\10\41\27\0\22\41\1\u01b4\1\41"+
+    "\1\0\10\41\27\0\2\41\1\u019e\10\41\1\u019e\11\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\3\41\1\u01b5\2\41"+
-    "\1\u01b5\15\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\14\41"+
-    "\1\u01b6\7\41\1\0\1\41\1\u01b6\10\41\3\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u019f\13\41"+
+    "\1\0\6\41\1\u019f\3\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\u01a0\1\0\10\41\27\0\22\41"+
+    "\1\u01a0\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
+    "\1\u01a1\15\41\1\0\5\41\1\u01a1\4\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\7\41\1\u01b7\14\41\1\0\5\41\1\u01b7\4\41"+
+    "\27\0\11\41\1\u01a2\13\41\1\0\6\41\1\u01a2\3\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\3\41\1\u01b8\2\41\1\u01b8\11\41"+
-    "\1\u01b9\3\41\1\0\12\41\3\0\4\41\1\0\1\u01b9"+
-    "\3\41\4\0\1\41\1\0\1\u01ba\1\0\10\41\27\0"+
-    "\22\41\1\u01ba\1\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\0\10\41\27\0\15\41\1\u01a3\7\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u01a4"+
+    "\1\0\10\41\27\0\22\41\1\u01a4\2\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\11\41\1\u01a5\13\41\1\0\6\41"+
+    "\1\u01a5\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\5\41\1\u01a6\17\41"+
+    "\1\0\3\41\1\u01a6\6\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\u01a7\1\0\10\41\27\0\22\41"+
+    "\1\u01a7\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\u01a8"+
+    "\11\41\1\u01a8\12\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\11\41\1\u01bb\12\41\1\0\6\41\1\u01bb\3\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u01bc\1\0"+
-    "\10\41\27\0\22\41\1\u01bc\1\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\47\0\1\u01bd\11\0\1\u01bd\107\0"+
-    "\1\u01be\11\0\1\u01be\112\0\1\u01bf\2\0\1\u01bf\163\0"+
-    "\1\u01c0\53\0\1\u01c1\10\0\1\u01c1\107\0\1\u01c2\13\0"+
-    "\1\u01c2\141\0\1\u01c3\73\0\1\u01c4\22\0\1\u01c4\70\0"+
-    "\1\u01c5\13\0\1\u01c5\120\0\1\u01c6\11\0\1\u01c6\30\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\11\41\1\u01c7"+
-    "\12\41\1\0\6\41\1\u01c7\3\41\3\0\4\41\1\0"+
+    "\13\41\1\u01a9\11\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\11\41\1\u01c8\12\41\1\0\6\41\1\u01c8\3\41\3\0"+
+    "\7\41\1\u01aa\15\41\1\0\5\41\1\u01aa\4\41\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\22\41\1\u01ab\2\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\5\41\1\u01c9\16\41\1\0\3\41\1\u01c9"+
-    "\4\41\1\u01ca\1\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u01cb"+
-    "\10\41\1\u01cb\10\41\1\0\12\41\3\0\4\41\1\0"+
+    "\2\41\1\u01ac\5\41\27\0\10\41\1\u01ac\14\41\1\0"+
+    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\7\41\1\u01ad\15\41\1\0"+
+    "\5\41\1\u01ad\4\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\5\41\1\u01ae"+
+    "\17\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u01af"+
+    "\15\41\1\0\5\41\1\u01af\4\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\5\41\1\u01cc\16\41\1\0\3\41\1\u01cc\6\41\3\0"+
+    "\1\u01b0\11\41\1\u01b0\12\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\3\41"+
+    "\1\u01b1\4\41\27\0\17\41\1\u01b1\5\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\11\41\1\u01b2\13\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\21\41\1\u01b3\3\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\7\41\1\u01b4\4\41\1\u01b5\10\41"+
+    "\1\0\1\41\1\u01b5\3\41\1\u01b4\4\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\24\41\1\u01b6\1\0\2\41\1\u01b6\7\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\1\41\1\u01cd\13\41\1\u01cd\6\41\1\0"+
+    "\10\41\27\0\11\41\1\u01b7\13\41\1\0\6\41\1\u01b7"+
+    "\3\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\u01b8\1\0\10\41\27\0\22\41\1\u01b8\2\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\5\41\1\u01ce\16\41\1\0"+
-    "\3\41\1\u01ce\6\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\11\41\1\u01cf"+
-    "\12\41\1\0\6\41\1\u01cf\3\41\3\0\4\41\1\0"+
+    "\1\41\1\0\10\41\27\0\3\41\1\u01b9\2\41\1\u01b9"+
+    "\16\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\14\41\1\u01ba"+
+    "\10\41\1\0\1\41\1\u01ba\10\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\2\41\1\u01d0\10\41\1\u01d0\10\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u01d1\1\0"+
-    "\10\41\27\0\22\41\1\u01d1\1\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\u0170\1\0\1\u0170\1\0"+
-    "\10\u0170\27\0\24\u0170\1\0\12\u0170\3\0\4\u0170\1\0"+
-    "\4\u0170\1\0\1\u01d2\1\0\3\141\1\0\2\141\3\0"+
-    "\2\141\1\0\1\141\1\0\3\141\1\0\1\u0171\1\141"+
-    "\1\366\1\141\1\0\15\141\24\0\1\141\12\0\3\141"+
-    "\4\0\1\141\4\0\20\141\1\0\3\141\2\0\1\141"+
-    "\1\366\1\141\1\u0173\110\141\1\u0174\3\141\1\u0174\1\365"+
-    "\1\141\1\366\1\141\1\367\73\141\1\0\1\u0176\1\0"+
-    "\1\u0176\1\0\10\u0176\1\u0174\2\0\1\u01d3\1\u0174\22\0"+
-    "\24\u0176\1\0\12\u0176\3\0\4\u0176\1\0\4\u0176\3\0"+
-    "\15\u0100\1\u0177\3\u0100\1\u0177\115\u0100\1\u0179\3\u0100\1\u0179"+
-    "\100\u0100\15\201\1\202\3\201\1\202\14\201\1\202\4\201"+
-    "\1\202\23\201\1\u01d4\3\201\1\u01d4\26\201\71\0\1\u01d5"+
-    "\3\0\1\u01d5\75\0\1\u01d6\22\0\1\u01d6\26\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\3\41\1\u01d7\2\41"+
-    "\1\u01d7\15\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\u01d8"+
-    "\11\41\1\u01d8\11\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u01d9\1\0\10\41\27\0"+
-    "\22\41\1\u01d9\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\41\1\0\2\41\1\u01da"+
-    "\5\41\27\0\10\41\1\u01da\13\41\1\0\12\41\3\0"+
+    "\7\41\1\u01bb\15\41\1\0\5\41\1\u01bb\4\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\24\41\1\0\12\41\3\0\2\41\1\u01db"+
-    "\1\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\24\41\1\0\11\41\1\u01dc\3\0\4\41"+
+    "\10\41\27\0\3\41\1\u01bc\2\41\1\u01bc\11\41\1\u01bd"+
+    "\4\41\1\0\12\41\3\0\4\41\1\0\1\u01bd\3\41"+
+    "\4\0\1\41\1\0\1\u01be\1\0\10\41\27\0\22\41"+
+    "\1\u01be\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\11\41"+
+    "\1\u01bf\13\41\1\0\6\41\1\u01bf\3\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u01c0\1\0\10\41"+
+    "\27\0\22\41\1\u01c0\2\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\47\0\1\u01c1\11\0\1\u01c1\110\0\1\u01c2"+
+    "\11\0\1\u01c2\113\0\1\u01c3\2\0\1\u01c3\137\0\1\u01c4"+
+    "\25\0\1\u01c4\53\0\1\u01c5\10\0\1\u01c5\110\0\1\u01c6"+
+    "\13\0\1\u01c6\143\0\1\u01c7\73\0\1\u01c8\23\0\1\u01c8"+
+    "\70\0\1\u01c9\13\0\1\u01c9\121\0\1\u01ca\12\0\1\u01ca"+
+    "\30\0\1\41\1\0\1\41\1\0\10\41\27\0\11\41"+
+    "\1\u01cb\13\41\1\0\6\41\1\u01cb\3\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\5\41\1\u01dd\16\41\1\0\3\41\1\u01dd\6\41"+
+    "\27\0\11\41\1\u01cc\13\41\1\0\6\41\1\u01cc\3\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\12\41\3\0\1\u01de"+
-    "\3\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\2\41\1\u01df\10\41\1\u01df\10\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\u01e0\1\0\10\41\27\0\22\41\1\u01e0\1\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\11\41\1\u01e1\12\41\1\0"+
-    "\6\41\1\u01e1\3\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u01e2"+
-    "\14\41\1\0\5\41\1\u01e2\4\41\3\0\4\41\1\0"+
+    "\1\0\10\41\27\0\5\41\1\u01cd\17\41\1\0\3\41"+
+    "\1\u01cd\4\41\1\u01ce\1\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\2\41"+
+    "\1\u01cf\10\41\1\u01cf\11\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\5\41\1\u01d0\17\41\1\0\3\41\1\u01d0\6\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\1\41\1\u01d1\13\41\1\u01d1\7\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\5\41\1\u01d2\17\41"+
+    "\1\0\3\41\1\u01d2\6\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\11\41"+
+    "\1\u01d3\13\41\1\0\6\41\1\u01d3\3\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\2\41\1\u01d4\10\41\1\u01d4\11\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u01d5"+
+    "\1\0\10\41\27\0\22\41\1\u01d5\2\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\u0173\1\0\1\u0173"+
+    "\1\0\10\u0173\27\0\25\u0173\1\0\12\u0173\3\0\4\u0173"+
+    "\1\0\4\u0173\1\0\1\u01d6\1\0\3\142\1\0\2\142"+
+    "\3\0\2\142\1\0\1\142\1\0\3\142\1\0\1\u0174"+
+    "\1\142\1\370\1\142\1\0\15\142\25\0\1\142\12\0"+
+    "\3\142\4\0\1\142\4\0\20\142\1\0\3\142\2\0"+
+    "\1\142\1\370\1\142\1\u0176\111\142\1\u0177\3\142\1\u0177"+
+    "\1\367\1\142\1\370\1\142\1\371\74\142\1\0\1\u0179"+
+    "\1\0\1\u0179\1\0\10\u0179\1\u0177\2\0\1\u01d7\1\u0177"+
+    "\22\0\25\u0179\1\0\12\u0179\3\0\4\u0179\1\0\4\u0179"+
+    "\3\0\15\u0102\1\u017a\3\u0102\1\u017a\116\u0102\1\u017c\3\u0102"+
+    "\1\u017c\101\u0102\15\202\1\203\3\202\1\203\14\202\1\203"+
+    "\4\202\1\203\24\202\1\u01d8\3\202\1\u01d8\26\202\72\0"+
+    "\1\u01d9\3\0\1\u01d9\75\0\1\u01da\23\0\1\u01da\26\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\3\41\1\u01db"+
+    "\2\41\1\u01db\16\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\24\41\1\0\12\41\3\0\3\41\1\u01e3\1\0\4\41"+
-    "\4\0\1\u0190\1\0\1\u0190\1\0\10\u0190\1\u01e4\3\0"+
-    "\1\u01e5\22\0\24\u0190\1\0\12\u0190\3\0\4\u0190\1\0"+
-    "\4\u0190\6\0\1\u01e6\2\0\3\u01e6\1\0\2\u01e6\30\0"+
-    "\24\u01e6\1\0\12\u01e6\3\0\4\u01e6\1\0\4\u01e6\6\0"+
-    "\1\u01e7\2\0\3\u01e7\1\0\2\u01e7\30\0\24\u01e7\1\0"+
-    "\12\u01e7\3\0\4\u01e7\1\0\4\u01e7\50\0\1\u01e8\13\0"+
-    "\1\u01e8\41\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\41\1\u01e9\13\41\1\u01e9\6\41\1\0\12\41\3\0"+
+    "\1\u01dc\11\41\1\u01dc\12\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u01dd\1\0\10\41"+
+    "\27\0\22\41\1\u01dd\2\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\2\41"+
+    "\1\u01de\5\41\27\0\10\41\1\u01de\14\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\25\41\1\0\12\41\3\0\2\41"+
+    "\1\u01df\1\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\25\41\1\0\11\41\1\u01e0\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\5\41\1\u01ea\16\41\1\0\3\41\1\u01ea"+
+    "\10\41\27\0\5\41\1\u01e1\17\41\1\0\3\41\1\u01e1"+
     "\6\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\1\41\1\u01eb\13\41\1\u01eb"+
-    "\6\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\12\41\3\0\1\u01ec\3\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\14\41\1\u01ed\7\41"+
-    "\1\0\1\41\1\u01ed\10\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\10\41\1\u01ee\1\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\2\41"+
-    "\1\u01ef\10\41\1\u01ef\10\41\1\0\12\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\41\1\u01f0\13\41\1\u01f0\6\41\1\0\12\41"+
-    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u01f1"+
-    "\1\0\10\41\27\0\2\41\1\u01f2\10\41\1\u01f2\6\41"+
-    "\1\u01f1\1\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\10\41\1\u01f3\1\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\13\41"+
-    "\1\u01f4\10\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\12\41\3\0"+
+    "\1\u01e2\3\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\2\41\1\u01e3\10\41\1\u01e3\11\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\u01e4\1\0\10\41\27\0\22\41\1\u01e4\2\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u01e5\13\41"+
+    "\1\0\6\41\1\u01e5\3\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
-    "\1\u01f5\14\41\1\0\5\41\1\u01f5\4\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\u01f6\1\0\10\41"+
-    "\27\0\22\41\1\u01f6\1\41\1\0\12\41\3\0\4\41"+
+    "\1\u01e6\15\41\1\0\5\41\1\u01e6\4\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\7\41\1\u01f7\14\41\1\0\5\41\1\u01f7\4\41"+
+    "\27\0\25\41\1\0\12\41\3\0\3\41\1\u01e7\1\0"+
+    "\4\41\4\0\1\u0193\1\0\1\u0193\1\0\10\u0193\1\u01e8"+
+    "\3\0\1\u01e9\22\0\25\u0193\1\0\12\u0193\3\0\4\u0193"+
+    "\1\0\4\u0193\6\0\1\u01ea\2\0\3\u01ea\1\0\2\u01ea"+
+    "\30\0\25\u01ea\1\0\12\u01ea\3\0\4\u01ea\1\0\4\u01ea"+
+    "\6\0\1\u01eb\2\0\3\u01eb\1\0\2\u01eb\30\0\25\u01eb"+
+    "\1\0\12\u01eb\3\0\4\u01eb\1\0\4\u01eb\50\0\1\u01ec"+
+    "\13\0\1\u01ec\42\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\1\41\1\u01ed\13\41\1\u01ed\7\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\12\41\3\0\2\41"+
-    "\1\u01f8\1\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\7\41\1\u01f9\14\41\1\0\12\41"+
+    "\1\0\10\41\27\0\5\41\1\u01ee\17\41\1\0\3\41"+
+    "\1\u01ee\6\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\1\41\1\u01ef\13\41"+
+    "\1\u01ef\7\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\1\u01f0\3\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\14\41\1\u01f1"+
+    "\10\41\1\0\1\41\1\u01f1\10\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\25\41\1\0\10\41\1\u01f2\1\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\2\41\1\u01f3\10\41\1\u01f3\11\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\1\41\1\u01f4\13\41\1\u01f4\7\41\1\0"+
+    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\u01f5\1\0\10\41\27\0\2\41\1\u01f6\10\41\1\u01f6"+
+    "\6\41\1\u01f5\2\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\25\41\1\0\10\41\1\u01f7\1\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\13\41\1\u01f8\11\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\7\41\1\u01f9\15\41\1\0\5\41\1\u01f9\4\41\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u01fa\1\0"+
+    "\10\41\27\0\22\41\1\u01fa\2\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\7\41\1\u01fb\15\41\1\0\5\41\1\u01fb"+
+    "\4\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\12\41\3\0"+
+    "\2\41\1\u01fc\1\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\7\41\1\u01fd\15\41\1\0"+
+    "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\24\41\1\u01fe\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\5\41\1\u01fa\16\41\1\0\3\41"+
-    "\1\u01fa\6\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\6\41\1\u01fb\15\41"+
+    "\1\0\10\41\27\0\5\41\1\u01ff\17\41\1\0\3\41"+
+    "\1\u01ff\6\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\6\41\1\u0200\16\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\23\41\1\u01fc\1\0"+
-    "\2\41\1\u01fc\7\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u01fd"+
-    "\10\41\1\u01fd\10\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\0\1\41\1\0\10\41\27\0\24\41\1\u0201\1\0"+
+    "\2\41\1\u0201\7\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u0202"+
+    "\10\41\1\u0202\11\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\5\41\1\u01fe\16\41\1\0\3\41\1\u01fe\6\41\3\0"+
+    "\5\41\1\u0203\17\41\1\0\3\41\1\u0203\6\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\7\41\1\u01ff\14\41\1\0\5\41\1\u01ff"+
+    "\10\41\27\0\7\41\1\u0204\15\41\1\0\5\41\1\u0204"+
     "\4\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\24\41\1\0\11\41\1\u0200"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\11\41\1\u0205"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\2\41\1\u0201\10\41\1\u0201\10\41"+
+    "\1\0\10\41\27\0\2\41\1\u0206\10\41\1\u0206\11\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u0202\1\0\10\41\27\0\22\41\1\u0202\1\41"+
+    "\1\0\1\u0207\1\0\10\41\27\0\22\41\1\u0207\2\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\14\41\1\u0203\7\41"+
-    "\1\0\1\41\1\u0203\10\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\u0204\1\0\10\41\27\0\22\41"+
-    "\1\u0204\1\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\14\41\1\u0208\10\41"+
+    "\1\0\1\41\1\u0208\10\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\u0209\1\0\10\41\27\0\22\41"+
+    "\1\u0209\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
-    "\1\u0205\14\41\1\0\5\41\1\u0205\4\41\3\0\4\41"+
+    "\1\u020a\15\41\1\0\5\41\1\u020a\4\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\2\41\1\u0206\10\41\1\u0206\10\41\1\0\12\41"+
+    "\27\0\2\41\1\u020b\10\41\1\u020b\11\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\3\41\1\u0207\2\41\1\u0207\15\41"+
+    "\1\0\10\41\27\0\3\41\1\u020c\2\41\1\u020c\16\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\5\41\1\u0208\16\41"+
-    "\1\0\3\41\1\u0208\6\41\3\0\4\41\1\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\5\41\1\u020d\17\41"+
+    "\1\0\3\41\1\u020d\6\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
-    "\1\u0209\14\41\1\0\5\41\1\u0209\4\41\3\0\4\41"+
-    "\1\0\4\41\51\0\1\u020a\10\0\1\u020a\117\0\1\u020b"+
-    "\21\0\1\u020b\70\0\1\u020c\10\0\1\u020c\45\0\1\u020d"+
-    "\62\0\1\u020d\110\0\1\u020e\21\0\1\u020e\70\0\1\u020f"+
-    "\10\0\1\u020f\52\0\1\u0210\52\0\1\u0210\41\0\1\u0211"+
-    "\12\0\1\u020e\47\0\1\u0211\1\0\1\u0212\102\0\1\u0213"+
-    "\22\0\1\u0213\30\0\1\u020a\62\0\1\u020a\34\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\4\41\1\u0214\14\41"+
-    "\1\u0214\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\u0215\1\0\10\41\27\0\22\41"+
-    "\1\u0215\1\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\1\u020e\15\41\1\0\5\41\1\u020e\4\41\3\0\4\41"+
+    "\1\0\4\41\51\0\1\u020f\10\0\1\u020f\120\0\1\u0210"+
+    "\22\0\1\u0210\70\0\1\u0211\10\0\1\u0211\46\0\1\u0212"+
+    "\62\0\1\u0212\111\0\1\u0213\22\0\1\u0213\70\0\1\u0214"+
+    "\10\0\1\u0214\53\0\1\u0215\52\0\1\u0215\42\0\1\u0216"+
+    "\12\0\1\u0213\47\0\1\u0216\2\0\1\u0217\102\0\1\u0218"+
+    "\23\0\1\u0218\30\0\1\u020f\62\0\1\u020f\35\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\4\41\1\u0219\14\41"+
+    "\1\u0219\3\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\u021a\1\0\10\41\27\0\22\41"+
+    "\1\u021a\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\11\41"+
-    "\1\u0216\12\41\1\0\6\41\1\u0216\3\41\3\0\4\41"+
+    "\1\u021b\13\41\1\0\6\41\1\u021b\3\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\3\41\1\u0217\2\41\1\u0217\15\41\1\0\12\41"+
+    "\27\0\3\41\1\u021c\2\41\1\u021c\16\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\12\41\3\0\1\41"+
-    "\1\u0218\2\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\1\41\1\u0219\13\41\1\u0219\6\41"+
+    "\1\0\10\41\27\0\25\41\1\0\12\41\3\0\1\41"+
+    "\1\u021d\2\41\1\0\4\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\1\41\1\u021e\13\41\1\u021e\7\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\2\41\1\u021a\10\41"+
-    "\1\u021a\10\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\2\41\1\u021f\10\41"+
+    "\1\u021f\11\41\1\0\12\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\3\41"+
-    "\1\u021b\2\41\1\u021b\15\41\1\0\12\41\3\0\4\41"+
+    "\1\u0220\2\41\1\u0220\16\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\2\41\1\u021c\10\41\1\u021c\10\41\1\0\12\41"+
+    "\27\0\2\41\1\u0221\10\41\1\u0221\11\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\11\41\1\u021d\12\41\1\0\6\41"+
-    "\1\u021d\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u021e\14\41"+
-    "\1\0\5\41\1\u021e\4\41\3\0\4\41\1\0\4\41"+
-    "\20\0\1\u0174\3\0\1\u0174\100\0\15\201\1\202\3\201"+
-    "\1\202\14\201\1\202\4\201\1\202\1\201\1\u021f\13\201"+
-    "\1\u021f\40\201\71\0\1\u0220\3\0\1\u0220\25\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\4\41\1\u0221\14\41"+
-    "\1\u0221\2\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\1\0\10\41\27\0\11\41\1\u0222\13\41\1\0\6\41"+
+    "\1\u0222\3\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u0223\15\41"+
+    "\1\0\5\41\1\u0223\4\41\3\0\4\41\1\0\4\41"+
+    "\20\0\1\u0177\3\0\1\u0177\101\0\15\202\1\203\3\202"+
+    "\1\203\14\202\1\203\4\202\1\203\1\202\1\u0224\13\202"+
+    "\1\u0224\41\202\72\0\1\u0225\3\0\1\u0225\25\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\4\41\1\u0226\14\41"+
+    "\1\u0226\3\41\1\0\12\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\41"+
-    "\1\u0222\13\41\1\u0222\6\41\1\0\12\41\3\0\4\41"+
+    "\1\u0227\13\41\1\u0227\7\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\23\41\1\u0223\1\0\2\41\1\u0223\7\41\3\0"+
+    "\27\0\24\41\1\u0228\1\0\2\41\1\u0228\7\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\5\41\1\u0224\16\41\1\0\3\41\1\u0224"+
+    "\10\41\27\0\5\41\1\u0229\17\41\1\0\3\41\1\u0229"+
     "\6\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\5\41\1\u0225\16\41\1\0"+
-    "\3\41\1\u0225\6\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\2\41\1\u0226\5\41\27\0"+
-    "\10\41\1\u0226\13\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\41\1\0\10\41\27\0\5\41\1\u022a\17\41\1\0"+
+    "\3\41\1\u022a\6\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\2\41\1\u022b\5\41\27\0"+
+    "\10\41\1\u022b\14\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\23\41\1\u0227\1\0\2\41\1\u0227\7\41\3\0\4\41"+
+    "\24\41\1\u022c\1\0\2\41\1\u022c\7\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\11\41\1\u0228\12\41\1\0\6\41\1\u0228\3\41"+
+    "\27\0\11\41\1\u022d\13\41\1\0\6\41\1\u022d\3\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\5\41\1\u0229\16\41\1\0\3\41"+
-    "\1\u0229\6\41\3\0\4\41\1\0\4\41\20\0\1\u01e4"+
-    "\105\0\1\u01e6\1\0\1\u01e6\1\0\10\u01e6\6\0\1\u022a"+
-    "\20\0\24\u01e6\1\0\12\u01e6\3\0\4\u01e6\1\0\4\u01e6"+
-    "\4\0\1\u01e7\1\0\1\u01e7\1\0\10\u01e7\27\0\24\u01e7"+
-    "\1\0\12\u01e7\1\u022b\2\0\4\u01e7\1\0\4\u01e7\54\0"+
-    "\1\u022c\22\0\1\u022c\26\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\3\41\1\u022d\2\41\1\u022d\15\41\1\0"+
+    "\1\0\10\41\27\0\5\41\1\u022e\17\41\1\0\3\41"+
+    "\1\u022e\6\41\3\0\4\41\1\0\4\41\20\0\1\u01e8"+
+    "\106\0\1\u01ea\1\0\1\u01ea\1\0\10\u01ea\6\0\1\u022f"+
+    "\20\0\25\u01ea\1\0\12\u01ea\3\0\4\u01ea\1\0\4\u01ea"+
+    "\4\0\1\u01eb\1\0\1\u01eb\1\0\10\u01eb\27\0\25\u01eb"+
+    "\1\0\12\u01eb\1\u0230\2\0\4\u01eb\1\0\4\u01eb\54\0"+
+    "\1\u0231\23\0\1\u0231\26\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\3\41\1\u0232\2\41\1\u0232\16\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\1\41\1\u022e\13\41\1\u022e"+
-    "\6\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u022f"+
-    "\10\41\1\u022f\10\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\41\1\0\10\41\27\0\1\41\1\u0233\13\41\1\u0233"+
+    "\7\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u0234"+
+    "\10\41\1\u0234\11\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\24\41\1\0\1\u0230\3\41\1\u0230\5\41\3\0\4\41"+
+    "\25\41\1\0\1\u0235\3\41\1\u0235\5\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\11\41\1\u0231\12\41\1\0\6\41\1\u0231\3\41"+
+    "\27\0\11\41\1\u0236\13\41\1\0\6\41\1\u0236\3\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\1\41\1\u0232\13\41\1\u0232\6\41"+
+    "\1\0\10\41\27\0\1\41\1\u0237\13\41\1\u0237\7\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\2\41\1\u0233\5\41\27\0\10\41"+
-    "\1\u0233\13\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\1\0\1\41\1\0\2\41\1\u0238\5\41\27\0\10\41"+
+    "\1\u0238\14\41\1\0\12\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\2\41"+
-    "\1\u0234\10\41\1\u0234\10\41\1\0\12\41\3\0\4\41"+
+    "\1\u0239\10\41\1\u0239\11\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\3\41\1\u0235\2\41\1\u0235\15\41\1\0\12\41"+
+    "\27\0\3\41\1\u023a\2\41\1\u023a\16\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\4\41\1\u0236\14\41\1\u0236\2\41"+
+    "\1\0\10\41\27\0\4\41\1\u023b\14\41\1\u023b\3\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\17\41\1\u0237\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\17\41\1\u023c\5\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\12\41"+
-    "\3\0\1\41\1\u0238\2\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\23\41\1\u0239\1\0"+
-    "\2\41\1\u0239\7\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\16\41\1\u023a"+
-    "\5\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\11\41\1\u023b\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u023c\12\41"+
-    "\1\0\6\41\1\u023c\3\41\3\0\4\41\1\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\12\41"+
+    "\3\0\1\41\1\u023d\2\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u023e\15\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\24\41\1\u023f\1\0"+
+    "\2\41\1\u023f\7\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\16\41\1\u0240"+
+    "\6\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\25\41\1\0"+
+    "\11\41\1\u0241\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u0242\13\41"+
+    "\1\0\6\41\1\u0242\3\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\3\41"+
-    "\1\u023d\2\41\1\u023d\15\41\1\0\12\41\3\0\4\41"+
+    "\1\u0243\2\41\1\u0243\16\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\3\41"+
-    "\1\u023e\4\41\27\0\17\41\1\u023e\4\41\1\0\12\41"+
+    "\1\u0244\4\41\27\0\17\41\1\u0244\5\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\23\41\1\u023f\1\0\2\41\1\u023f"+
+    "\1\0\10\41\27\0\24\41\1\u0245\1\0\2\41\1\u0245"+
     "\7\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\7\41\1\u0240\14\41\1\0"+
-    "\5\41\1\u0240\4\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u0241"+
-    "\14\41\1\0\5\41\1\u0241\4\41\3\0\4\41\1\0"+
+    "\1\41\1\0\10\41\27\0\7\41\1\u0246\15\41\1\0"+
+    "\5\41\1\u0246\4\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u0247"+
+    "\15\41\1\0\5\41\1\u0247\4\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\23\41\1\u0242\1\0\2\41\1\u0242\7\41\3\0\4\41"+
-    "\1\0\4\41\56\0\1\u020e\22\0\1\u020e\26\0\1\u0243"+
-    "\12\0\1\u020e\47\0\1\u0243\1\0\1\u0212\76\0\1\u020f"+
-    "\13\0\1\u020f\127\0\1\u020a\3\0\1\u020a\44\0\1\u020e"+
-    "\51\0\1\u0212\137\0\1\u020e\70\0\1\u0244\21\0\1\u0244"+
-    "\104\0\1\u0245\15\0\1\u0245\70\0\1\u0246\2\0\1\u0246"+
-    "\50\0\1\41\1\0\1\41\1\0\10\41\2\u0247\2\0"+
-    "\1\u0247\22\0\24\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u0248\1\0\10\41\27\0"+
-    "\22\41\1\u0248\1\41\1\0\12\41\3\0\4\41\1\0"+
+    "\24\41\1\u0248\1\0\2\41\1\u0248\7\41\3\0\4\41"+
+    "\1\0\4\41\56\0\1\u0213\23\0\1\u0213\26\0\1\u0249"+
+    "\12\0\1\u0213\47\0\1\u0249\2\0\1\u0217\76\0\1\u0214"+
+    "\13\0\1\u0214\131\0\1\u020f\3\0\1\u020f\44\0\1\u0213"+
+    "\52\0\1\u0217\140\0\1\u0213\70\0\1\u024a\22\0\1\u024a"+
+    "\104\0\1\u024b\16\0\1\u024b\70\0\1\u024c\2\0\1\u024c"+
+    "\51\0\1\41\1\0\1\41\1\0\10\41\2\u024d\2\0"+
+    "\1\u024d\22\0\25\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\u024e\1\0\10\41\27\0"+
+    "\22\41\1\u024e\2\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\23\41\1\u0249\1\0\2\41\1\u0249\7\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\u024a\1\0\10\41"+
-    "\27\0\22\41\1\u024a\1\41\1\0\12\41\3\0\4\41"+
+    "\24\41\1\u024f\1\0\2\41\1\u024f\7\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u0250\1\0\10\41"+
+    "\27\0\22\41\1\u0250\2\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\12\41\3\0\4\41\1\0\2\41"+
-    "\1\u024b\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\5\41\1\u024c\16\41\1\0\3\41\1\u024c\6\41"+
-    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u024d"+
-    "\1\0\10\41\27\0\22\41\1\u024d\1\41\1\0\12\41"+
+    "\27\0\25\41\1\0\12\41\3\0\4\41\1\0\2\41"+
+    "\1\u0251\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\5\41\1\u0252\17\41\1\0\3\41\1\u0252\6\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u0253"+
+    "\1\0\10\41\27\0\22\41\1\u0253\2\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\14\41\1\u024e\7\41\1\0\1\41"+
-    "\1\u024e\10\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u024f\14\41"+
-    "\1\0\5\41\1\u024f\4\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\11\41\1\u0250\3\0\4\41\1\0\4\41\3\0"+
-    "\15\201\1\202\3\201\1\202\14\201\1\202\4\201\1\202"+
-    "\5\201\1\u0251\22\201\1\u0251\25\201\53\0\1\u0252\22\0"+
-    "\1\u0252\24\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\14\41\1\u0253\7\41\1\0\1\41\1\u0253\10\41\3\0"+
-    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u0254\1\0"+
-    "\10\41\27\0\22\41\1\u0254\1\41\1\0\12\41\3\0"+
+    "\1\0\10\41\27\0\14\41\1\u0254\10\41\1\0\1\41"+
+    "\1\u0254\10\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u0255\15\41"+
+    "\1\0\5\41\1\u0255\4\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\11\41\1\u0256\3\0\4\41\1\0\4\41\3\0"+
+    "\15\202\1\203\3\202\1\203\14\202\1\203\4\202\1\203"+
+    "\5\202\1\u0257\23\202\1\u0257\25\202\53\0\1\u0258\23\0"+
+    "\1\u0258\24\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\14\41\1\u0259\10\41\1\0\1\41\1\u0259\10\41\3\0"+
+    "\4\41\1\0\4\41\4\0\1\41\1\0\1\u025a\1\0"+
+    "\10\41\27\0\22\41\1\u025a\2\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\11\41\1\u0255\12\41\1\0\6\41\1\u0255"+
+    "\10\41\27\0\11\41\1\u025b\13\41\1\0\6\41\1\u025b"+
     "\3\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\7\41\1\u0256\14\41\1\0"+
-    "\5\41\1\u0256\4\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\11\41\1\u0257"+
-    "\12\41\1\0\6\41\1\u0257\3\41\3\0\4\41\1\0"+
+    "\1\41\1\0\10\41\27\0\7\41\1\u025c\15\41\1\0"+
+    "\5\41\1\u025c\4\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\11\41\1\u025d"+
+    "\13\41\1\0\6\41\1\u025d\3\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\24\41\1\0\11\41\1\u0258\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\12\41\3\0\1\u0259\3\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\1\u025a\11\41"+
-    "\1\u025a\11\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\20\0\1\u01e4\3\0\1\u01e5\115\0\1\u025b\3\0\1\u025c"+
-    "\171\0\1\u025d\3\0\1\u025d\25\0\1\41\1\0\1\u025e"+
-    "\1\0\10\41\27\0\22\41\1\u025e\1\41\1\0\12\41"+
+    "\25\41\1\0\11\41\1\u025e\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\1\u025f\3\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\1\u0260\11\41"+
+    "\1\u0260\12\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\20\0\1\u01e8\3\0\1\u01e9\116\0\1\u0261\3\0\1\u0262"+
+    "\173\0\1\u0263\3\0\1\u0263\25\0\1\41\1\0\1\u0264"+
+    "\1\0\10\41\27\0\22\41\1\u0264\2\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\23\41\1\u025f\1\0\2\41\1\u025f"+
+    "\1\0\10\41\27\0\24\41\1\u0265\1\0\2\41\1\u0265"+
     "\7\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\2\41\1\u0260\10\41\1\u0260"+
-    "\10\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u0261"+
-    "\14\41\1\0\5\41\1\u0261\4\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u0262\1\0\10\41\27\0"+
-    "\22\41\1\u0262\1\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\41\1\0\10\41\27\0\2\41\1\u0266\10\41\1\u0266"+
+    "\11\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\7\41\1\u0267"+
+    "\15\41\1\0\5\41\1\u0267\4\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\u0268\1\0\10\41\27\0"+
+    "\22\41\1\u0268\2\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\2\41\1\u0263\10\41\1\u0263\10\41\1\0\12\41\3\0"+
+    "\2\41\1\u0269\10\41\1\u0269\11\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\4\41\1\u0264\14\41\1\u0264\2\41\1\0"+
+    "\10\41\27\0\4\41\1\u026a\14\41\1\u026a\3\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\23\41\1\u0265\1\0\2\41"+
-    "\1\u0265\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u0266\1\0\10\41\27\0\22\41\1\u0266\1\41"+
+    "\1\41\1\0\10\41\27\0\24\41\1\u026b\1\0\2\41"+
+    "\1\u026b\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\u026c\1\0\10\41\27\0\22\41\1\u026c\2\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u0267\12\41"+
+    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u026d\13\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u0268\1\0\10\41\27\0\22\41\1\u0268\1\41"+
+    "\1\0\1\u026e\1\0\10\41\27\0\22\41\1\u026e\2\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\10\41"+
-    "\1\u0269\1\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u026a\12\41"+
-    "\1\0\6\41\1\u026a\3\41\3\0\4\41\1\0\4\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\10\41"+
+    "\1\u026f\1\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\11\41\1\u0270\13\41"+
+    "\1\0\6\41\1\u0270\3\41\3\0\4\41\1\0\4\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\7\41"+
-    "\1\u026b\14\41\1\0\5\41\1\u026b\4\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\u026c\1\0\10\41"+
-    "\27\0\22\41\1\u026c\1\41\1\0\12\41\3\0\4\41"+
-    "\1\0\4\41\51\0\1\u026d\10\0\1\u026d\45\0\1\u020e"+
-    "\62\0\1\u020e\36\0\1\u026e\62\0\1\u026e\115\0\1\u020e"+
-    "\15\0\1\u020e\30\0\1\u026f\5\0\2\u0247\2\0\1\u0247"+
-    "\32\0\1\u026f\46\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\12\41\3\0\4\41\1\0\2\41"+
-    "\1\u0270\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\7\41\1\u0271\14\41\1\0\5\41\1\u0271\4\41"+
+    "\1\u0271\15\41\1\0\5\41\1\u0271\4\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u0272\1\0\10\41"+
+    "\27\0\22\41\1\u0272\2\41\1\0\12\41\3\0\4\41"+
+    "\1\0\4\41\51\0\1\u0273\10\0\1\u0273\46\0\1\u0213"+
+    "\62\0\1\u0213\37\0\1\u0274\62\0\1\u0274\116\0\1\u0213"+
+    "\16\0\1\u0213\30\0\1\u0275\5\0\2\u024d\2\0\1\u024d"+
+    "\32\0\1\u0275\47\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\25\41\1\0\12\41\3\0\4\41\1\0\2\41"+
+    "\1\u0276\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\7\41\1\u0277\15\41\1\0\5\41\1\u0277\4\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\14\41\1\u0272\7\41\1\0\1\41"+
-    "\1\u0272\10\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\12\41"+
-    "\3\0\4\41\1\0\2\41\1\u0273\1\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u0274\14\41"+
-    "\1\0\5\41\1\u0274\4\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0275\1\41"+
+    "\1\0\10\41\27\0\14\41\1\u0278\10\41\1\0\1\41"+
+    "\1\u0278\10\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\12\41"+
+    "\3\0\4\41\1\0\2\41\1\u0279\1\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\7\41\1\u027a\15\41"+
+    "\1\0\5\41\1\u027a\4\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u027b\1\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\14\41"+
-    "\1\u0276\7\41\1\0\1\41\1\u0276\10\41\3\0\4\41"+
+    "\1\u027c\10\41\1\0\1\41\1\u027c\10\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\12\41\3\0\4\41\1\0\2\41"+
-    "\1\u0277\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\u0278\11\41\1\u0278\11\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\3\0\15\201\1\202\3\201\1\202"+
-    "\14\201\1\202\4\201\1\202\25\201\1\u0279\3\201\1\u0279"+
-    "\24\201\15\0\2\u027a\2\0\1\u027a\101\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\2\41\1\u027b\10\41\1\u027b"+
-    "\10\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u027c"+
-    "\10\41\1\u027c\10\41\1\0\12\41\3\0\4\41\1\0"+
+    "\27\0\25\41\1\0\12\41\3\0\4\41\1\0\2\41"+
+    "\1\u027d\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\1\u027e\11\41\1\u027e\12\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\3\0\15\202\1\203\3\202\1\203"+
+    "\14\202\1\203\4\202\1\203\26\202\1\u027f\3\202\1\u027f"+
+    "\24\202\15\0\2\u0280\2\0\1\u0280\102\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\2\41\1\u0281\10\41\1\u0281"+
+    "\11\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\2\41\1\u0282"+
+    "\10\41\1\u0282\11\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\23\41\1\u027d\1\0\2\41\1\u027d\7\41\3\0\4\41"+
-    "\1\0\4\41\4\0\1\41\1\0\1\u027e\1\0\10\41"+
-    "\27\0\22\41\1\u027e\1\41\1\0\12\41\3\0\4\41"+
+    "\24\41\1\u0283\1\0\2\41\1\u0283\7\41\3\0\4\41"+
+    "\1\0\4\41\4\0\1\41\1\0\1\u0284\1\0\10\41"+
+    "\27\0\22\41\1\u0284\2\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\3\41\1\u027f\2\41\1\u027f\15\41\1\0\12\41"+
-    "\3\0\4\41\1\0\4\41\20\0\1\u025b\157\0\1\u0280"+
-    "\22\0\1\u0280\24\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\24\41\1\0\12\41\3\0\4\41\1\0\2\41"+
-    "\1\u0281\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\7\41\1\u0282\14\41\1\0\5\41\1\u0282\4\41"+
+    "\27\0\3\41\1\u0285\2\41\1\u0285\16\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\20\0\1\u0261\160\0\1\u0286"+
+    "\23\0\1\u0286\24\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\25\41\1\0\12\41\3\0\4\41\1\0\2\41"+
+    "\1\u0287\1\41\4\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\7\41\1\u0288\15\41\1\0\5\41\1\u0288\4\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\23\41\1\u0283\1\0\2\41\1\u0283"+
+    "\1\0\10\41\27\0\24\41\1\u0289\1\0\2\41\1\u0289"+
     "\7\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\23\41\1\u0284\1\0\2\41"+
-    "\1\u0284\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\1\u0285\11\41\1\u0285"+
-    "\11\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\u0286\1\0\10\41\27\0\22\41\1\u0286"+
-    "\1\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\12\41\3\0\4\41\1\0\2\41\1\u0287\1\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\22\41\1\u0288"+
-    "\1\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\3\41\1\u0289"+
-    "\2\41\1\u0289\15\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u028a\1\0\10\41\27\0"+
-    "\22\41\1\u028a\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u028b\1\0\10\41\27\0"+
-    "\22\41\1\u028b\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\4\0\1\41\1\0\1\u028c\1\0\10\41\27\0"+
-    "\22\41\1\u028c\1\41\1\0\12\41\3\0\4\41\1\0"+
-    "\4\41\52\0\1\u020e\2\0\1\u020e\114\0\1\u020e\13\0"+
-    "\1\u020e\105\0\1\u028d\13\0\1\u028d\41\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\24\41\1\0\12\41\3\0"+
-    "\4\41\1\0\2\41\1\u028e\1\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\5\41\1\u028f\16\41\1\0"+
-    "\3\41\1\u028f\6\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\1\u0290\3\41\1\u0290\5\41\3\0\4\41\1\0\4\41"+
+    "\1\41\1\0\10\41\27\0\24\41\1\u028a\1\0\2\41"+
+    "\1\u028a\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\1\u028b\11\41\1\u028b"+
+    "\12\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\u028c\1\0\10\41\27\0\22\41\1\u028c"+
+    "\2\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\25\41\1\0"+
+    "\12\41\3\0\4\41\1\0\2\41\1\u028d\1\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\22\41\1\u028e"+
+    "\2\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\3\41\1\u028f"+
+    "\2\41\1\u028f\16\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\u0290\1\0\10\41\27\0"+
+    "\22\41\1\u0290\2\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\u0291\1\0\10\41\27\0"+
+    "\22\41\1\u0291\2\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\4\0\1\41\1\0\1\u0292\1\0\10\41\27\0"+
+    "\22\41\1\u0292\2\41\1\0\12\41\3\0\4\41\1\0"+
+    "\4\41\52\0\1\u0213\2\0\1\u0213\115\0\1\u0213\13\0"+
+    "\1\u0213\106\0\1\u0293\13\0\1\u0293\42\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\12\41\3\0"+
+    "\4\41\1\0\2\41\1\u0294\1\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\5\41\1\u0295\17\41\1\0"+
+    "\3\41\1\u0295\6\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\25\41\1\0"+
+    "\1\u0296\3\41\1\u0296\5\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0297\1\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0298\1\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0299\1\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0291\1\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0292\1\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u0293\1\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\23\41"+
-    "\1\u0294\1\0\2\41\1\u0294\7\41\3\0\4\41\1\0"+
+    "\1\u029a\1\0\2\41\1\u029a\7\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\4\41\1\u0295\14\41\1\u0295\2\41\1\0\12\41\3\0"+
-    "\4\41\1\0\4\41\3\0\15\201\1\202\3\201\1\202"+
-    "\14\201\1\202\4\201\1\202\7\201\1\u0296\22\201\1\u0296"+
-    "\23\201\15\0\2\u027a\2\0\1\u027a\33\0\1\u0297\21\0"+
-    "\1\u0297\23\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\23\41\1\u0298\1\0\2\41\1\u0298\7\41\3\0\4\41"+
+    "\4\41\1\u029b\14\41\1\u029b\3\41\1\0\12\41\3\0"+
+    "\4\41\1\0\4\41\3\0\15\202\1\203\3\202\1\203"+
+    "\14\202\1\203\4\202\1\203\7\202\1\u029c\23\202\1\u029c"+
+    "\23\202\15\0\2\u0280\2\0\1\u0280\33\0\1\u029d\22\0"+
+    "\1\u029d\23\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\24\41\1\u029e\1\0\2\41\1\u029e\7\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\41\1\u0299\13\41\1\u0299\6\41\1\0\12\41"+
+    "\27\0\1\41\1\u029f\13\41\1\u029f\7\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\11\41\1\u029a\3\0"+
-    "\4\41\1\0\4\41\33\0\1\u029b\72\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\1\u029c\11\41\1\u029c\11\41"+
+    "\1\0\10\41\27\0\25\41\1\0\11\41\1\u02a0\3\0"+
+    "\4\41\1\0\4\41\33\0\1\u02a1\73\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\1\u02a2\11\41\1\u02a2\12\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u029d\1\0\10\41\27\0\22\41\1\u029d\1\41"+
+    "\1\0\1\u02a3\1\0\10\41\27\0\22\41\1\u02a3\2\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\u029e\1\0\10\41\27\0\22\41\1\u029e\1\41"+
+    "\1\0\1\u02a4\1\0\10\41\27\0\22\41\1\u02a4\2\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\2\41\1\u029f\5\41\27\0\10\41"+
-    "\1\u029f\13\41\1\0\12\41\3\0\4\41\1\0\4\41"+
-    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\u02a0"+
-    "\11\41\1\u02a0\11\41\1\0\12\41\3\0\4\41\1\0"+
+    "\1\0\1\41\1\0\2\41\1\u02a5\5\41\27\0\10\41"+
+    "\1\u02a5\14\41\1\0\12\41\3\0\4\41\1\0\4\41"+
+    "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\1\u02a6"+
+    "\11\41\1\u02a6\12\41\1\0\12\41\3\0\4\41\1\0"+
     "\4\41\4\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\1\u02a1\11\41\1\u02a1\11\41\1\0\12\41\3\0\4\41"+
+    "\1\u02a7\11\41\1\u02a7\12\41\1\0\12\41\3\0\4\41"+
     "\1\0\4\41\4\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\7\41\1\u02a2\14\41\1\0\5\41\1\u02a2\4\41"+
+    "\27\0\7\41\1\u02a8\15\41\1\0\5\41\1\u02a8\4\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\4\41\1\u02a3\14\41\1\u02a3\2\41"+
-    "\1\0\12\41\3\0\4\41\1\0\4\41\47\0\1\u02a4"+
-    "\11\0\1\u02a4\44\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\u02a5\11\41\1\u02a5\11\41\1\0\12\41\3\0"+
+    "\1\0\10\41\27\0\4\41\1\u02a9\14\41\1\u02a9\3\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\47\0\1\u02aa"+
+    "\11\0\1\u02aa\45\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\1\u02ab\11\41\1\u02ab\12\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\2\41\1\u02a6\10\41\1\u02a6\10\41\1\0"+
+    "\10\41\27\0\2\41\1\u02ac\10\41\1\u02ac\11\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\24\41\1\0\12\41\3\0"+
-    "\4\41\1\0\2\41\1\u02a7\1\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\24\41\1\0\12\41\3\0"+
-    "\4\41\1\0\2\41\1\u02a8\1\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\1\u02a9\11\41\1\u02a9\11\41"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\12\41\3\0"+
+    "\4\41\1\0\2\41\1\u02ad\1\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\25\41\1\0\12\41\3\0"+
+    "\4\41\1\0\2\41\1\u02ae\1\41\4\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\1\u02af\11\41\1\u02af\12\41"+
     "\1\0\12\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\12\41"+
-    "\3\0\4\41\1\0\2\41\1\u02aa\1\41\3\0\15\201"+
-    "\1\202\3\201\1\202\6\201\1\u02ab\5\201\1\202\4\201"+
-    "\1\202\56\201\46\0\1\u02ac\10\0\1\u02ac\43\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\11\41"+
-    "\1\u02ad\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\u02ae\1\0\10\41\27\0\22\41\1\u02ae\1\41\1\0"+
-    "\12\41\3\0\4\41\1\0\4\41\20\0\2\u029b\2\0"+
-    "\1\u029b\101\0\1\41\1\0\1\41\1\0\10\41\27\0"+
-    "\3\41\1\u02af\2\41\1\u02af\15\41\1\0\12\41\3\0"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\12\41"+
+    "\3\0\4\41\1\0\2\41\1\u02b0\1\41\3\0\15\202"+
+    "\1\203\3\202\1\203\6\202\1\u02b1\5\202\1\203\4\202"+
+    "\1\203\57\202\46\0\1\u02b2\10\0\1\u02b2\44\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\11\41"+
+    "\1\u02b3\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
+    "\1\u02b4\1\0\10\41\27\0\22\41\1\u02b4\2\41\1\0"+
+    "\12\41\3\0\4\41\1\0\4\41\20\0\2\u02a1\2\0"+
+    "\1\u02a1\102\0\1\41\1\0\1\41\1\0\10\41\27\0"+
+    "\3\41\1\u02b5\2\41\1\u02b5\16\41\1\0\12\41\3\0"+
     "\4\41\1\0\4\41\4\0\1\41\1\0\1\41\1\0"+
-    "\2\41\1\u02b0\5\41\27\0\10\41\1\u02b0\13\41\1\0"+
+    "\2\41\1\u02b6\5\41\27\0\10\41\1\u02b6\14\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\3\41\1\u02b1\2\41\1\u02b1"+
-    "\15\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\14\41\1\u02b2"+
-    "\7\41\1\0\1\41\1\u02b2\10\41\3\0\4\41\1\0"+
-    "\4\41\112\0\1\u02b3\13\0\1\41\1\0\1\41\1\0"+
-    "\10\41\27\0\3\41\1\u02b4\2\41\1\u02b4\15\41\1\0"+
+    "\1\41\1\0\10\41\27\0\3\41\1\u02b7\2\41\1\u02b7"+
+    "\16\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\14\41\1\u02b8"+
+    "\10\41\1\0\1\41\1\u02b8\10\41\3\0\4\41\1\0"+
+    "\4\41\113\0\1\u02b9\13\0\1\41\1\0\1\41\1\0"+
+    "\10\41\27\0\3\41\1\u02ba\2\41\1\u02ba\16\41\1\0"+
     "\12\41\3\0\4\41\1\0\4\41\4\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\23\41\1\u02b5\1\0\2\41"+
-    "\1\u02b5\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\12\41"+
-    "\3\0\1\41\1\u02b6\2\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\24\41\1\0\12\41"+
-    "\3\0\4\41\1\0\2\41\1\u02b7\1\41\3\0\15\201"+
-    "\1\u02b8\1\u02ab\2\201\1\u02b8\14\201\1\202\4\201\1\202"+
-    "\56\201\47\0\1\u02b9\2\0\1\u02b9\50\0\1\41\1\0"+
-    "\1\41\1\0\10\41\27\0\23\41\1\u02ba\1\0\2\41"+
-    "\1\u02ba\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
-    "\1\0\1\41\1\0\10\41\27\0\23\41\1\u02bb\1\0"+
-    "\2\41\1\u02bb\7\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\12\41\3\0\4\41\1\0\2\41\1\u02bc\1\41\4\0"+
-    "\1\41\1\0\1\u02bd\1\0\10\41\27\0\22\41\1\u02bd"+
-    "\1\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
-    "\1\41\1\0\1\41\1\0\10\41\27\0\24\41\1\0"+
-    "\1\u02be\3\41\1\u02be\5\41\3\0\4\41\1\0\4\41"+
-    "\65\0\1\u02bf\15\0\1\u02bf\22\0\1\41\1\0\1\u02c0"+
-    "\1\0\10\41\27\0\22\41\1\u02c0\1\41\1\0\12\41"+
-    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u02c1"+
-    "\1\0\10\41\27\0\22\41\1\u02c1\1\41\1\0\12\41"+
+    "\1\41\1\0\10\41\27\0\24\41\1\u02bb\1\0\2\41"+
+    "\1\u02bb\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\12\41"+
+    "\3\0\1\41\1\u02bc\2\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\25\41\1\0\12\41"+
+    "\3\0\4\41\1\0\2\41\1\u02bd\1\41\3\0\15\202"+
+    "\1\u02be\1\u02b1\2\202\1\u02be\14\202\1\203\4\202\1\203"+
+    "\57\202\47\0\1\u02bf\2\0\1\u02bf\51\0\1\41\1\0"+
+    "\1\41\1\0\10\41\27\0\24\41\1\u02c0\1\0\2\41"+
+    "\1\u02c0\7\41\3\0\4\41\1\0\4\41\4\0\1\41"+
+    "\1\0\1\41\1\0\10\41\27\0\24\41\1\u02c1\1\0"+
+    "\2\41\1\u02c1\7\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\25\41\1\0"+
+    "\12\41\3\0\4\41\1\0\2\41\1\u02c2\1\41\4\0"+
+    "\1\41\1\0\1\u02c3\1\0\10\41\27\0\22\41\1\u02c3"+
+    "\2\41\1\0\12\41\3\0\4\41\1\0\4\41\4\0"+
+    "\1\41\1\0\1\41\1\0\10\41\27\0\25\41\1\0"+
+    "\1\u02c4\3\41\1\u02c4\5\41\3\0\4\41\1\0\4\41"+
+    "\65\0\1\u02c5\16\0\1\u02c5\22\0\1\41\1\0\1\u02c6"+
+    "\1\0\10\41\27\0\22\41\1\u02c6\2\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\u02c7"+
+    "\1\0\10\41\27\0\22\41\1\u02c7\2\41\1\0\12\41"+
     "\3\0\4\41\1\0\4\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\12\41\3\0\4\41"+
-    "\1\0\2\41\1\u02c2\1\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\24\41\1\0\12\41\3\0\4\41"+
-    "\1\0\2\41\1\u02c3\1\41\4\0\1\41\1\0\1\41"+
-    "\1\0\10\41\27\0\5\41\1\u02c4\16\41\1\0\3\41"+
-    "\1\u02c4\6\41\3\0\4\41\1\0\4\41\104\0\1\u02c5"+
-    "\21\0\1\41\1\0\1\41\1\0\10\41\27\0\24\41"+
-    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u02c6\1\41"+
+    "\1\0\10\41\27\0\25\41\1\0\12\41\3\0\4\41"+
+    "\1\0\2\41\1\u02c8\1\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\25\41\1\0\12\41\3\0\4\41"+
+    "\1\0\2\41\1\u02c9\1\41\4\0\1\41\1\0\1\41"+
+    "\1\0\10\41\27\0\5\41\1\u02ca\17\41\1\0\3\41"+
+    "\1\u02ca\6\41\3\0\4\41\1\0\4\41\105\0\1\u02cb"+
+    "\21\0\1\41\1\0\1\41\1\0\10\41\27\0\25\41"+
+    "\1\0\12\41\3\0\4\41\1\0\2\41\1\u02cc\1\41"+
     "\4\0\1\41\1\0\1\41\1\0\10\41\27\0\11\41"+
-    "\1\u02c7\12\41\1\0\6\41\1\u02c7\3\41\3\0\4\41"+
-    "\1\0\4\41\51\0\1\u02c8\10\0\1\u02c8\43\0\1\41"+
-    "\1\0\1\u02c9\1\0\10\41\27\0\22\41\1\u02c9\1\41"+
-    "\1\0\12\41\3\0\4\41\1\0\4\41\65\0\1\u02ca"+
-    "\15\0\1\u02ca\22\0\1\41\1\0\1\41\1\0\10\41"+
-    "\27\0\1\41\1\u02cb\13\41\1\u02cb\6\41\1\0\12\41"+
-    "\3\0\4\41\1\0\4\41\6\0\1\u02cc\62\0\1\u02cc"+
-    "\50\0\2\u02cc\2\0\1\u02cc\5\0\1\u02cd\107\0\2\u02cd"+
-    "\2\0\1\u02cd\1\0\1\u02ce\45\0\1\u02cf\3\0\1\u02cf"+
-    "\5\0\1\u02d0\107\0\1\u02d1\3\0\1\u02d1\126\0\1\u02d2"+
-    "\110\0\1\u02d3\3\0\1\u02d3\126\0\1\u02d4\110\0\1\u02d5"+
-    "\3\0\1\u02d5\126\0\1\u02d6\110\0\1\u02d7\3\0\1\u02d7"+
-    "\41\0\2\u02d5\2\0\1\u02d5\6\0\1\u02d8\162\0\1\u02d9"+
-    "\3\0\1\u02d9\47\0\1\u02d5\201\0\1\u02d5\16\0";
+    "\1\u02cd\13\41\1\0\6\41\1\u02cd\3\41\3\0\4\41"+
+    "\1\0\4\41\51\0\1\u02ce\10\0\1\u02ce\44\0\1\41"+
+    "\1\0\1\u02cf\1\0\10\41\27\0\22\41\1\u02cf\2\41"+
+    "\1\0\12\41\3\0\4\41\1\0\4\41\65\0\1\u02d0"+
+    "\16\0\1\u02d0\22\0\1\41\1\0\1\41\1\0\10\41"+
+    "\27\0\1\41\1\u02d1\13\41\1\u02d1\7\41\1\0\12\41"+
+    "\3\0\4\41\1\0\4\41\6\0\1\u02d2\62\0\1\u02d2"+
+    "\51\0\2\u02d2\2\0\1\u02d2\5\0\1\u02d3\110\0\2\u02d3"+
+    "\2\0\1\u02d3\1\0\1\u02d4\46\0\1\u02d5\3\0\1\u02d5"+
+    "\5\0\1\u02d6\110\0\1\u02d7\3\0\1\u02d7\127\0\1\u02d8"+
+    "\111\0\1\u02d9\3\0\1\u02d9\127\0\1\u02da\111\0\1\u02db"+
+    "\3\0\1\u02db\127\0\1\u02dc\111\0\1\u02dd\3\0\1\u02dd"+
+    "\41\0\2\u02db\2\0\1\u02db\6\0\1\u02de\164\0\1\u02df"+
+    "\3\0\1\u02df\47\0\1\u02db\203\0\1\u02db\16\0";
 
   private static int [] zzUnpackTrans() {
-    int [] result = new int[46986];
+    int [] result = new int[47974];
     int offset = 0;
     offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
     return result;
@@ -1412,22 +1423,22 @@ private static int zzUnpackTrans(String packed, int offset, int [] result) {
 
   private static final String ZZ_ATTRIBUTE_PACKED_0 =
     "\25\0\2\1\1\11\12\1\2\11\2\1\3\11\13\1"+
-    "\1\11\25\1\1\11\5\1\2\11\2\1\1\11\6\1"+
+    "\1\11\26\1\1\11\5\1\2\11\2\1\1\11\6\1"+
     "\1\11\12\1\1\11\4\1\1\0\1\1\1\11\2\1"+
     "\1\11\2\1\2\11\2\1\1\11\1\1\1\11\1\1"+
     "\1\11\4\0\1\1\1\11\4\1\1\11\2\1\1\0"+
     "\2\1\1\0\1\1\2\0\6\1\1\11\2\0\4\1"+
     "\1\0\1\1\1\0\1\1\2\0\1\11\2\0\2\1"+
-    "\1\0\52\1\13\0\2\1\1\11\1\1\3\0\3\1"+
+    "\1\0\53\1\13\0\2\1\1\11\1\1\3\0\3\1"+
     "\3\11\1\1\3\0\3\1\2\11\3\0\1\1\2\0"+
     "\1\11\2\0\1\11\7\0\1\11\2\0\1\11\1\0"+
     "\1\11\2\0\1\11\1\1\1\0\1\11\1\0\2\11"+
-    "\2\1\1\11\3\0\15\1\1\0\1\1\3\0\54\1"+
+    "\2\1\1\11\3\0\15\1\1\0\1\1\3\0\55\1"+
     "\12\0\12\1\1\11\3\1\1\0\1\11\1\0\1\11"+
     "\1\1\1\0\1\11\1\0\1\1\1\0\2\11\1\1"+
-    "\2\0\20\1\4\0\51\1\12\0\13\1\1\11\1\0"+
-    "\1\1\1\11\1\0\15\1\1\11\1\1\3\0\41\1"+
-    "\10\0\1\11\1\0\14\1\1\0\11\1\3\0\26\1"+
+    "\2\0\20\1\4\0\52\1\12\0\13\1\1\11\1\0"+
+    "\1\1\1\11\1\0\15\1\1\11\1\1\3\0\42\1"+
+    "\10\0\1\11\1\0\14\1\1\0\11\1\3\0\27\1"+
     "\5\0\23\1\1\11\1\1\1\0\17\1\3\0\12\1"+
     "\1\0\5\1\1\0\14\1\1\0\11\1\1\0\14\1"+
     "\1\0\7\1\1\0\6\1\1\11\5\1\1\0\5\1"+
@@ -1435,7 +1446,7 @@ private static int zzUnpackTrans(String packed, int offset, int [] result) {
     "\14\0\1\11\1\0";
 
   private static int [] zzUnpackAttribute() {
-    int [] result = new int[729];
+    int [] result = new int[735];
     int offset = 0;
     offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
     return result;
@@ -1887,16 +1898,16 @@ public PHPTokenId nextToken() throws java.io.IOException {
           { //the difference from the original rules comes from the fact that we took ';' out out of tokens
     return  PHPTokenId.UNKNOWN_TOKEN;
           }
-        case 158: break;
+        case 159: break;
         case 94:
           { return PHPTokenId.PHP_FALSE;
           }
-        case 159: break;
+        case 160: break;
         case 22:
           { yypushback(1);
     yybegin(ST_PHP_NOWDOC);
           }
-        case 160: break;
+        case 161: break;
         case 30:
           { String yytext = yytext();
     switch (yytext.charAt(yytext.length() - 1)) {
@@ -1909,12 +1920,12 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
      return PHPTokenId.PHP_LINE_COMMENT;
           }
-        case 161: break;
+        case 162: break;
         case 73:
           { yypushback(2);
         return PHPTokenId.PHP_ENCAPSED_AND_WHITESPACE;
           }
-        case 162: break;
+        case 163: break;
         case 4:
           { if(isInConst) {
         // for checking arrays
@@ -1939,37 +1950,37 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
     return PHPTokenId.PHP_TOKEN;
           }
-        case 163: break;
+        case 164: break;
         case 60:
           { popState();
     return PHPTokenId.PHPDOC_COMMENT_END;
           }
-        case 164: break;
-        case 128:
+        case 165: break;
+        case 129:
           { return PHPTokenId.PHP_INCLUDE;
           }
-        case 165: break;
-        case 147:
+        case 166: break;
+        case 148:
           { return PHPTokenId.PHP_ENDDECLARE;
           }
-        case 166: break;
+        case 167: break;
         case 32:
           { return  PHPTokenId.UNKNOWN_TOKEN;
           }
-        case 167: break;
-        case 118:
+        case 168: break;
+        case 119:
           { return PHPTokenId.PHP_GLOBAL;
           }
-        case 168: break;
-        case 154:
+        case 169: break;
+        case 155:
           { return PHPTokenId.PHP__FUNCTION__;
           }
-        case 169: break;
+        case 170: break;
         case 18:
           { popState();
     return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
           }
-        case 170: break;
+        case 171: break;
         case 36:
           { if (shortTagsAllowed ) {
         //yybegin(ST_PHP_IN_SCRIPTING);
@@ -1981,34 +1992,38 @@ public PHPTokenId nextToken() throws java.io.IOException {
         return PHPTokenId.T_INLINE_HTML;
     }
           }
-        case 171: break;
+        case 172: break;
         case 50:
           { yypushback(1);
     pushState(ST_PHP_IN_SCRIPTING);
     return PHPTokenId.PHP_CURLY_OPEN;
           }
-        case 172: break;
+        case 173: break;
+        case 115:
+          { return PHPTokenId.PHP_TYPE_OBJECT;
+          }
+        case 174: break;
         case 85:
           { return PHPTokenId.PHP_LIST;
           }
-        case 173: break;
+        case 175: break;
         case 93:
           { return PHPTokenId.PHP_EMPTY;
           }
-        case 174: break;
+        case 176: break;
         case 15:
           { pushState(ST_PHP_LINE_COMMENT);
     return PHPTokenId.PHP_LINE_COMMENT;
           }
-        case 175: break;
+        case 177: break;
         case 90:
           { return PHPTokenId.PHP_CASE;
           }
-        case 176: break;
+        case 178: break;
         case 38:
           { return PHPTokenId.PHP_VARIABLE;
           }
-        case 177: break;
+        case 179: break;
         case 41:
           { //popState();
         yybegin(YYINITIAL);
@@ -2018,7 +2033,7 @@ public PHPTokenId nextToken() throws java.io.IOException {
         stack.clear();
     return PHPTokenId.PHP_CLOSETAG;
           }
-        case 178: break;
+        case 180: break;
         case 8:
           { if(isInConst) {
         isInConst = false;
@@ -2027,7 +2042,7 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
     return PHPTokenId.PHP_SEMICOLON;
           }
-        case 179: break;
+        case 181: break;
         case 40:
           { if (aspTagsAllowed) {
             yybegin(YYINITIAL);
@@ -2036,35 +2051,35 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
     return  PHPTokenId.UNKNOWN_TOKEN;
           }
-        case 180: break;
+        case 182: break;
         case 31:
           { return PHPTokenId.PHP_LINE_COMMENT;
           }
-        case 181: break;
+        case 183: break;
         case 82:
           { pushState(ST_PHP_DOC_COMMENT);
     yypushback(yylength()-3);
     return PHPTokenId.PHPDOC_COMMENT_START;
           }
-        case 182: break;
+        case 184: break;
         case 99:
           { return PHPTokenId.PHP_ISSET;
           }
-        case 183: break;
-        case 137:
+        case 185: break;
+        case 138:
           { return PHPTokenId.PHP__FILE__;
           }
-        case 184: break;
+        case 186: break;
         case 45:
           { return PHPTokenId.PHP_IF;
           }
-        case 185: break;
+        case 187: break;
         case 51:
           { popState();
     pushState(ST_PHP_LOOKING_FOR_PROPERTY);
     return PHPTokenId.PHP_OBJECT_OPERATOR;
           }
-        case 186: break;
+        case 188: break;
         case 62:
           { if (aspTagsAllowed) {
             yybegin(YYINITIAL);
@@ -2077,57 +2092,57 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
     return PHPTokenId.PHP_LINE_COMMENT;
           }
-        case 187: break;
+        case 189: break;
         case 43:
           { return PHPTokenId.PHP_AS;
           }
-        case 188: break;
-        case 156:
+        case 190: break;
+        case 157:
           { pushState(ST_HALTED_COMPILER);
     return PHPTokenId.PHP_HALT_COMPILER;
           }
-        case 189: break;
+        case 191: break;
         case 70:
           { return PHPTokenId.PHP_USE;
           }
-        case 190: break;
+        case 192: break;
         case 102:
           { return PHPTokenId.PHP_TYPE_FLOAT;
           }
-        case 191: break;
-        case 155:
+        case 193: break;
+        case 156:
           { return PHPTokenId.PHP__NAMESPACE__;
           }
-        case 192: break;
+        case 194: break;
         case 61:
           { popState();
     return PHPTokenId.PHP_LINE_COMMENT;
           }
-        case 193: break;
-        case 153:
+        case 195: break;
+        case 154:
           { return PHPTokenId.PHP_INCLUDE_ONCE;
           }
-        case 194: break;
-        case 140:
+        case 196: break;
+        case 141:
           { return PHPTokenId.PHP_NAMESPACE;
           }
-        case 195: break;
+        case 197: break;
         case 13:
           { if (isInConst) {
         pushState(ST_PHP_LOOKING_FOR_CONSTANT_NAME);
     }
     return PHPTokenId.PHP_TOKEN;
           }
-        case 196: break;
+        case 198: break;
         case 59:
           { popState();
     return PHPTokenId.PHP_COMMENT_END;
           }
-        case 197: break;
-        case 134:
+        case 199: break;
+        case 135:
           { return PHPTokenId.PHP_ITERABLE;
           }
-        case 198: break;
+        case 200: break;
         case 97:
           { int bprefix = (yytext().charAt(0) != '<') ? 1 : 0;
     int startString=3+bprefix;
@@ -2145,7 +2160,7 @@ public PHPTokenId nextToken() throws java.io.IOException {
     yybegin(ST_PHP_START_HEREDOC);
     return PHPTokenId.PHP_HEREDOC_TAG_START;
           }
-        case 199: break;
+        case 201: break;
         case 58:
           { // const keyword is also used within group uses. so check "=", otherwise it matches the following:
     // use A\{const CONSTANTA, function myFunction,...}
@@ -2160,151 +2175,151 @@ public PHPTokenId nextToken() throws java.io.IOException {
     yypushback(back);
     return PHPTokenId.PHP_STRING;
           }
-        case 200: break;
+        case 202: break;
         case 34:
           { popState();
     return PHPTokenId.T_INLINE_HTML;
           }
-        case 201: break;
+        case 203: break;
         case 6:
           { return PHPTokenId.PHP_OPERATOR;
           }
-        case 202: break;
+        case 204: break;
         case 11:
           { pushState(ST_PHP_BACKQUOTE);
     return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
           }
-        case 203: break;
+        case 205: break;
         case 47:
           { pushState(ST_PHP_QUOTES_AFTER_VARIABLE);
     return PHPTokenId.PHP_VARIABLE;
           }
-        case 204: break;
+        case 206: break;
         case 3:
           { return PHPTokenId.PHP_NUMBER;
           }
-        case 205: break;
+        case 207: break;
         case 71:
           { yypushback(1);
     pushState(ST_PHP_VAR_OFFSET);
     return PHPTokenId.PHP_VARIABLE;
           }
-        case 206: break;
-        case 125:
+        case 208: break;
+        case 126:
           { return PHPTokenId.PHP_REQUIRE;
           }
-        case 207: break;
-        case 127:
+        case 209: break;
+        case 128:
           { return PHPTokenId.PHP_DECLARE;
           }
-        case 208: break;
+        case 210: break;
         case 105:
           { return PHPTokenId.PHP_CLONE;
           }
-        case 209: break;
+        case 211: break;
         case 100:
           { return PHPTokenId.PHP_TRAIT;
           }
-        case 210: break;
+        case 212: break;
         case 49:
           { pushState(ST_PHP_IN_SCRIPTING);
     return PHPTokenId.PHP_TOKEN;
           }
-        case 211: break;
+        case 213: break;
         case 65:
           { return PHPTokenId.PHP_NEW;
           }
-        case 212: break;
+        case 214: break;
         case 76:
           { yypushback(2);
     return PHPTokenId.PHP_COMMENT;
           }
-        case 213: break;
+        case 215: break;
         case 57:
           { return PHPTokenId.PHP_OBJECT_OPERATOR;
           }
-        case 214: break;
+        case 216: break;
         case 19:
           { yypushback(1);
         popState();
           }
-        case 215: break;
-        case 121:
+        case 217: break;
+        case 122:
           { return PHPTokenId.PHP_EXTENDS;
           }
-        case 216: break;
+        case 218: break;
         case 83:
           { return PHPTokenId.PHP_NULL;
           }
-        case 217: break;
+        case 219: break;
         case 91:
           { pushState(ST_PHP_IN_SCRIPTING);
     //yybegin(ST_PHP_IN_SCRIPTING);
     return PHPTokenId.PHP_OPENTAG;
     //return createSymbol(ASTSymbol.T_OPEN_TAG);
           }
-        case 218: break;
+        case 220: break;
         case 111:
           { return PHPTokenId.PHP_WHILE;
           }
-        case 219: break;
-        case 139:
+        case 221: break;
+        case 140:
           { return PHPTokenId.PHP_ENDSWITCH;
           }
-        case 220: break;
-        case 129:
+        case 222: break;
+        case 130:
           { return PHPTokenId.PHP_PRIVATE;
           }
-        case 221: break;
+        case 223: break;
         case 1:
           { return PHPTokenId.T_INLINE_HTML;
           }
-        case 222: break;
-        case 150:
+        case 224: break;
+        case 151:
           { return PHPTokenId.PHP_YIELD_FROM;
           }
-        case 223: break;
+        case 225: break;
         case 92:
           { return PHPTokenId.PHP_ENDIF;
           }
-        case 224: break;
+        case 226: break;
         case 28:
           { yypushback(1);
     popState();
         if (yylength() > 0)
             return PHPTokenId.PHP_ENCAPSED_AND_WHITESPACE;
           }
-        case 225: break;
-        case 115:
+        case 227: break;
+        case 116:
           { return PHPTokenId.PHP_STATIC;
           }
-        case 226: break;
-        case 126:
+        case 228: break;
+        case 127:
           { return PHPTokenId.PHP_DEFAULT;
           }
-        case 227: break;
+        case 229: break;
         case 17:
           { return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
           }
-        case 228: break;
+        case 230: break;
         case 25:
           { popState();
     return PHPTokenId.PHP_TOKEN;
           }
-        case 229: break;
+        case 231: break;
         case 37:
           { pushState(ST_PHP_LOOKING_FOR_PROPERTY);
     return PHPTokenId.PHP_OBJECT_OPERATOR;
           }
-        case 230: break;
-        case 138:
+        case 232: break;
+        case 139:
           { return PHPTokenId.PHP__LINE__;
           }
-        case 231: break;
+        case 233: break;
         case 78:
           { return PHPTokenId.PHP_EXIT;
           }
-        case 232: break;
+        case 234: break;
         case 35:
           { if (aspTagsAllowed) {
         //yybegin(ST_PHP_IN_SCRIPTING);
@@ -2316,16 +2331,16 @@ public PHPTokenId nextToken() throws java.io.IOException {
         return PHPTokenId.T_INLINE_HTML;
     }
           }
-        case 233: break;
+        case 235: break;
         case 39:
           { pushState(ST_PHP_COMMENT);
     return PHPTokenId.PHP_COMMENT_START;
           }
-        case 234: break;
+        case 236: break;
         case 96:
           { return PHPTokenId.PHP_BREAK;
           }
-        case 235: break;
+        case 237: break;
         case 26:
           { if(parenBalanceInConst == 0 && bracketBalanceInConst == 0) {
         isInConst = false;
@@ -2333,20 +2348,20 @@ public PHPTokenId nextToken() throws java.io.IOException {
     yypushback(1);
     popState();
           }
-        case 236: break;
+        case 238: break;
         case 21:
           { yypushback(1);
         yybegin(ST_PHP_HEREDOC);
           }
-        case 237: break;
-        case 142:
+        case 239: break;
+        case 143:
           { return PHPTokenId.PHP_INSTEADOF;
           }
-        case 238: break;
-        case 143:
+        case 240: break;
+        case 144:
           { return PHPTokenId.PHP_PROTECTED;
           }
-        case 239: break;
+        case 241: break;
         case 63:
           { String text = yytext();
     if ((text.charAt(1)=='%' && aspTagsAllowed)
@@ -2360,32 +2375,32 @@ public PHPTokenId nextToken() throws java.io.IOException {
         return PHPTokenId.T_INLINE_HTML;
     }
           }
-        case 240: break;
+        case 242: break;
         case 107:
           { return PHPTokenId.PHP_PRINT;
           }
-        case 241: break;
+        case 243: break;
         case 69:
           { return PHPTokenId.PHP_VAR;
           }
-        case 242: break;
-        case 157:
+        case 244: break;
+        case 158:
           { pushState(ST_PHP_IN_SCRIPTING);
     return PHPTokenId.T_INLINE_HTML;
           }
-        case 243: break;
+        case 245: break;
         case 101:
           { return PHPTokenId.PHP_THROW;
           }
-        case 244: break;
-        case 119:
+        case 246: break;
+        case 120:
           { return PHPTokenId.PHP_PARENT;
           }
-        case 245: break;
-        case 117:
+        case 247: break;
+        case 118:
           { return PHPTokenId.PHP_SWITCH;
           }
-        case 246: break;
+        case 248: break;
         case 74:
           { int trailingNewLineLength = 1;
         int label_len = yylength() - trailingNewLineLength;
@@ -2404,36 +2419,36 @@ public PHPTokenId nextToken() throws java.io.IOException {
             return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
         }
           }
-        case 247: break;
+        case 249: break;
         case 77:
           { yypushback(2); // go back to mark end of comment in the next token
         return PHPTokenId.PHPDOC_COMMENT;
           }
-        case 248: break;
+        case 250: break;
         case 67:
           { return PHPTokenId.PHP_TYPE_INT;
           }
-        case 249: break;
+        case 251: break;
         case 109:
           { return PHPTokenId.PHP_CASTING;
           }
-        case 250: break;
+        case 252: break;
         case 42:
           { return PHPTokenId.PHP_TEXTUAL_OPERATOR;
           }
-        case 251: break;
+        case 253: break;
         case 33:
           { popState();return PHPTokenId.WHITESPACE;
           }
-        case 252: break;
+        case 254: break;
         case 66:
           { return PHPTokenId.PHP_DIE;
           }
-        case 253: break;
-        case 145:
+        case 255: break;
+        case 146:
           { return PHPTokenId.PHP__CLASS__;
           }
-        case 254: break;
+        case 256: break;
         case 75:
           { int label_len = yylength() - 1;
     int back = 1;
@@ -2452,65 +2467,65 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
     return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
           }
-        case 255: break;
+        case 257: break;
         case 2:
           { yypushback(1);
     pushState(ST_PHP_HIGHLIGHTING_ERROR);
           }
-        case 256: break;
+        case 258: break;
         case 106:
           { return PHPTokenId.PHP_CLASS;
           }
-        case 257: break;
-        case 123:
+        case 259: break;
+        case 124:
           { return PHPTokenId.PHP_FINALLY;
           }
-        case 258: break;
-        case 141:
+        case 260: break;
+        case 142:
           { return PHPTokenId.PHP_INTERFACE;
           }
-        case 259: break;
-        case 144:
+        case 261: break;
+        case 145:
           { return PHPTokenId.PHP__TRAIT__;
           }
-        case 260: break;
+        case 262: break;
         case 108:
           { return PHPTokenId.PHP_UNSET;
           }
-        case 261: break;
+        case 263: break;
         case 12:
           { return PHPTokenId.PHP_CURLY_OPEN;
           }
-        case 262: break;
+        case 264: break;
         case 23:
           { yypushback(1);
     popState();
           }
-        case 263: break;
-        case 120:
+        case 265: break;
+        case 121:
           { return PHPTokenId.PHP_PUBLIC;
           }
-        case 264: break;
-        case 152:
+        case 266: break;
+        case 153:
           { return PHPTokenId.PHP_REQUIRE_ONCE;
           }
-        case 265: break;
-        case 146:
+        case 267: break;
+        case 147:
           { return PHPTokenId.PHP_ENDFOREACH;
           }
-        case 266: break;
-        case 116:
+        case 268: break;
+        case 117:
           { return PHPTokenId.PHP_TYPE_STRING;
           }
-        case 267: break;
+        case 269: break;
         case 80:
           { return PHPTokenId.PHP_EVAL;
           }
-        case 268: break;
+        case 270: break;
         case 87:
           { return PHPTokenId.PHP_GOTO;
           }
-        case 269: break;
+        case 271: break;
         case 103:
           { isInConst = true;
     parenBalanceInConst = 0;
@@ -2518,109 +2533,109 @@ public PHPTokenId nextToken() throws java.io.IOException {
     pushState(ST_PHP_LOOKING_FOR_CONSTANT_NAME);
     return PHPTokenId.PHP_CONST;
           }
-        case 270: break;
+        case 272: break;
         case 20:
           { popState();
         return PHPTokenId.PHP_STRING;
           }
-        case 271: break;
-        case 133:
+        case 273: break;
+        case 134:
           { return PHPTokenId.PHP_ABSTRACT;
           }
-        case 272: break;
+        case 274: break;
         case 9:
           { pushState(ST_PHP_DOUBLE_QUOTES);
     return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
           }
-        case 273: break;
+        case 275: break;
         case 81:
           { return PHPTokenId.PHP_ECHO;
           }
-        case 274: break;
+        case 276: break;
         case 95:
           { return PHPTokenId.PHP_FINAL;
           }
-        case 275: break;
-        case 151:
+        case 277: break;
+        case 152:
           { return PHPTokenId.PHP__METHOD__;
           }
-        case 276: break;
+        case 278: break;
         case 10:
           { return PHPTokenId.PHP_NS_SEPARATOR;
           }
-        case 277: break;
+        case 279: break;
         case 110:
           { return PHPTokenId.PHP_YIELD;
           }
-        case 278: break;
-        case 132:
+        case 280: break;
+        case 133:
           { pushState(ST_PHP_LOOKING_FOR_FUNCTION_NAME);
     return PHPTokenId.PHP_FUNCTION;
           }
-        case 279: break;
-        case 130:
+        case 281: break;
+        case 131:
           { return PHPTokenId.PHP__DIR__;
           }
-        case 280: break;
+        case 282: break;
         case 5:
           { return  PHPTokenId.PHP_STRING;
           }
-        case 281: break;
-        case 135:
+        case 283: break;
+        case 136:
           { return PHPTokenId.PHP_CONTINUE;
           }
-        case 282: break;
-        case 149:
+        case 284: break;
+        case 150:
           { return PHPTokenId.PHP_IMPLEMENTS;
           }
-        case 283: break;
+        case 285: break;
         case 68:
           { return PHPTokenId.PHP_TRY;
           }
-        case 284: break;
+        case 286: break;
         case 98:
           { return PHPTokenId.PHP_ARRAY;
           }
-        case 285: break;
+        case 287: break;
         case 7:
           { return PHPTokenId.WHITESPACE;
           }
-        case 286: break;
+        case 288: break;
         case 114:
           { return PHPTokenId.PHP_RETURN;
           }
-        case 287: break;
+        case 289: break;
         case 29:
           { return PHPTokenId.PHP_TOKEN;
           }
-        case 288: break;
+        case 290: break;
         case 16:
           { return PHPTokenId.PHP_ENCAPSED_AND_WHITESPACE;
           }
-        case 289: break;
+        case 291: break;
         case 104:
           { return PHPTokenId.PHP_CATCH;
           }
-        case 290: break;
+        case 292: break;
         case 72:
           { String text = yytext();
         int lastIndexOfDollar = text.lastIndexOf('$');
         yypushback(text.length() - lastIndexOfDollar);
         return PHPTokenId.PHP_ENCAPSED_AND_WHITESPACE;
           }
-        case 291: break;
+        case 293: break;
         case 52:
           { return PHPTokenId.PHP_PAAMAYIM_NEKUDOTAYIM;
           }
-        case 292: break;
-        case 136:
+        case 294: break;
+        case 137:
           { return PHPTokenId.PHP_CALLABLE;
           }
-        case 293: break;
-        case 148:
+        case 295: break;
+        case 149:
           { return PHPTokenId.PHP_INSTANCEOF;
           }
-        case 294: break;
+        case 296: break;
         case 54:
           { heredoc=null;
     hereocLength=0;
@@ -2633,8 +2648,8 @@ public PHPTokenId nextToken() throws java.io.IOException {
     yypushback(back);
     return PHPTokenId.PHP_HEREDOC_TAG_END;
           }
-        case 295: break;
-        case 124:
+        case 297: break;
+        case 125:
           { int bprefix = (yytext().charAt(0) != '<') ? 1 : 0;
         int startString=3+bprefix;
         /* 3 is <<<, 2 is quotes, 1 is newline */
@@ -2649,19 +2664,19 @@ public PHPTokenId nextToken() throws java.io.IOException {
         yybegin(ST_PHP_START_NOWDOC);
         return PHPTokenId.PHP_NOWDOC_TAG_START;
           }
-        case 296: break;
+        case 298: break;
         case 88:
           { return PHPTokenId.PHP_TYPE_BOOL;
           }
-        case 297: break;
+        case 299: break;
         case 112:
           { return PHPTokenId.PHP_ENDFOR;
           }
-        case 298: break;
+        case 300: break;
         case 64:
           { return PHPTokenId.PHP_FOR;
           }
-        case 299: break;
+        case 301: break;
         case 55:
           { int label_len = yylength() - 1;
 
@@ -2678,29 +2693,29 @@ public PHPTokenId nextToken() throws java.io.IOException {
         return PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING;
     }
           }
-        case 300: break;
-        case 122:
+        case 302: break;
+        case 123:
           { return PHPTokenId.PHP_FOREACH;
           }
-        case 301: break;
+        case 303: break;
         case 46:
           { pushState(ST_PHP_LOOKING_FOR_STATIC_PROPERTY);
     return PHPTokenId.PHP_PAAMAYIM_NEKUDOTAYIM;
           }
-        case 302: break;
+        case 304: break;
         case 24:
           { popState();
     return PHPTokenId.PHP_STRING;
           }
-        case 303: break;
+        case 305: break;
         case 79:
           { return PHPTokenId.PHP_ELSE;
           }
-        case 304: break;
+        case 306: break;
         case 86:
           { return PHPTokenId.PHP_SELF;
           }
-        case 305: break;
+        case 307: break;
         case 56:
           { heredoc=null; hereocLength=0;
     yybegin(ST_PHP_IN_SCRIPTING);
@@ -2712,12 +2727,12 @@ public PHPTokenId nextToken() throws java.io.IOException {
     yypushback(back);
     return PHPTokenId.PHP_NOWDOC_TAG_END;
           }
-        case 306: break;
+        case 308: break;
         case 48:
           { yypushback(1);
     return PHPTokenId.PHP_ENCAPSED_AND_WHITESPACE;
           }
-        case 307: break;
+        case 309: break;
         case 14:
           { int lastState = stack.peek();
     if (lastState != ST_PHP_IN_SCRIPTING && lastState != YYINITIAL) {
@@ -2726,11 +2741,11 @@ public PHPTokenId nextToken() throws java.io.IOException {
     }
     return PHPTokenId.PHP_CURLY_CLOSE;
           }
-        case 308: break;
+        case 310: break;
         case 44:
           { return PHPTokenId.PHP_DO;
           }
-        case 309: break;
+        case 311: break;
         case 53:
           { int trailingNewLineLength = 1;
         int label_len = yylength() - trailingNewLineLength;
@@ -2749,23 +2764,23 @@ public PHPTokenId nextToken() throws java.io.IOException {
             yybegin(ST_PHP_HEREDOC);
         }
           }
-        case 310: break;
+        case 312: break;
         case 89:
           { return PHPTokenId.PHP_TYPE_VOID;
           }
-        case 311: break;
-        case 131:
+        case 313: break;
+        case 132:
           { return PHPTokenId.PHP_ENDWHILE;
           }
-        case 312: break;
+        case 314: break;
         case 113:
           { return PHPTokenId.PHP_ELSEIF;
           }
-        case 313: break;
+        case 315: break;
         case 84:
           { return PHPTokenId.PHP_TRUE;
           }
-        case 314: break;
+        case 316: break;
         default:
           if (zzInput == YYEOF)
             //zzAtEOF = true;
@@ -2779,7 +2794,7 @@ public PHPTokenId nextToken() throws java.io.IOException {
                   return null;
               }
             }
-            case 730: break;
+            case 736: break;
             case ST_PHP_DOC_COMMENT: {
               if (input.readLength() > 0) {
                     input.backup(1);  // backup eof
@@ -2789,7 +2804,7 @@ public PHPTokenId nextToken() throws java.io.IOException {
                     return null;
                 }
             }
-            case 731: break;
+            case 737: break;
             default:
               {        if(input.readLength() > 0) {
             // backup eof
diff --git a/php.editor/src/org/netbeans/modules/php/editor/lexer/PHPTokenId.java b/php.editor/src/org/netbeans/modules/php/editor/lexer/PHPTokenId.java
index 9bc4dc0ffa..da35362b56 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/lexer/PHPTokenId.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/lexer/PHPTokenId.java
@@ -81,6 +81,7 @@
     PHP_TYPE_STRING("string", "keyword"), //NOI18N
     PHP_TYPE_BOOL("bool", "keyword"), //NOI18N
     PHP_TYPE_VOID("void", "keyword"), //NOI18N
+    PHP_TYPE_OBJECT("object", "keyword"), //NOI18N
     PHP_FINAL(null, "keyword"), //NOI18N
     PHP_PAAMAYIM_NEKUDOTAYIM(null, "operator"), //NOI18N
     PHP_EXTENDS(null, "keyword"), //NOI18N
diff --git a/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java b/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
index 2568d12934..c97ad14c80 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
@@ -45,6 +45,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import org.netbeans.api.annotations.common.CheckForNull;
@@ -89,6 +90,8 @@
  */
 class ClassScopeImpl extends TypeScopeImpl implements ClassScope, VariableNameFactory {
     private final Collection<QualifiedName> possibleFQSuperClassNames;
+    // @GuardedBy("this")
+    private final Collection<QualifiedName> mixinClassNames = new LinkedHashSet<>();
     private final Collection<QualifiedName> usedTraits = new HashSet<>();
     private final Set<? super TypeScope> superRecursionDetection = new HashSet<>();
     private final Set<? super TypeScope> subRecursionDetection = new HashSet<>();
@@ -166,6 +169,7 @@ void addElement(ModelElementImpl element) {
         this.superClass = Union2.<String, List<ClassScopeImpl>>createFirst(superClassName != null ? superClassName.toString() : null);
         this.possibleFQSuperClassNames = indexedClass.getPossibleFQSuperClassNames();
         usedTraits.addAll(indexedClass.getUsedTraits());
+        this.mixinClassNames.addAll(indexedClass.getFQMixinClassNames());
     }
     //old contructors
 
@@ -180,6 +184,20 @@ void addElement(ModelElementImpl element) {
         return this.possibleFQSuperClassNames;
     }
 
+    /**
+     * Add fully qualified names for @mixin tag.
+     *
+     * @param names fully qualified names
+     */
+    synchronized void addFQMixinClassNames(Collection<QualifiedName> names) {
+        mixinClassNames.addAll(names);
+    }
+
+    @Override
+    public synchronized Collection<QualifiedName> getFQMixinClassNames() {
+        return Collections.unmodifiableCollection(mixinClassNames);
+    }
+
     @NonNull
     @Override
     public Collection<? extends ClassScope> getSuperClasses() {
@@ -514,6 +532,16 @@ public String getIndexSignature() {
         sb.append(Signature.ITEM_DELIMITER);
         sb.append(isDeprecated() ? 1 : 0).append(Signature.ITEM_DELIMITER);
         sb.append(getFilenameUrl()).append(Signature.ITEM_DELIMITER);
+        // mixin
+        StringBuilder mixinSb = new StringBuilder();
+        for (QualifiedName mixinClassName : mixinClassNames) {
+            if (mixinSb.length() > 0) {
+                mixinSb.append(","); // NOI18N
+            }
+            mixinSb.append(mixinClassName.toString());
+        }
+        sb.append(mixinSb);
+        sb.append(Signature.ITEM_DELIMITER);
         return sb.toString();
     }
 
@@ -541,6 +569,8 @@ public String getDefaultConstructorIndexSignature() {
         QualifiedName qualifiedName = namespaceScope.getQualifiedName();
         sb.append(qualifiedName.toString()).append(Signature.ITEM_DELIMITER);
         sb.append(isDeprecated() ? 1 : 0).append(Signature.ITEM_DELIMITER);
+        sb.append(getFilenameUrl()).append(Signature.ITEM_DELIMITER);
+        sb.append(Signature.ITEM_DELIMITER); // mixin
 
         return sb.toString();
 
diff --git a/php.editor/src/org/netbeans/modules/php/editor/model/impl/ModelVisitor.java b/php.editor/src/org/netbeans/modules/php/editor/model/impl/ModelVisitor.java
index 115bff81ad..996450d938 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/model/impl/ModelVisitor.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/model/impl/ModelVisitor.java
@@ -47,6 +47,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -1200,6 +1201,24 @@ public void visit(StaticFieldAccess node) {
 
     @Override
     public void visit(PHPDocTypeTag node) {
+        // #241740 for @mixin tag
+        if (node.getKind().equals(PHPDocTag.Type.MIXIN)) {
+            Scope currentScope = modelBuilder.getCurrentScope();
+            if (currentScope instanceof ClassScopeImpl) {
+                ClassScopeImpl classScope = (ClassScopeImpl) currentScope;
+                List<? extends PhpDocTypeTagInfo> tagInfos = PhpDocTypeTagInfo.create(node, classScope);
+                Set<QualifiedName> names = new LinkedHashSet<>();
+                tagInfos.stream()
+                        .filter(tagInfo -> !tagInfo.getName().isEmpty())
+                        .map(tagInfo -> tagInfo.getTypeName())
+                        .filter(typeName -> (typeName != null && !typeName.isEmpty()))
+                        .map(typeName -> VariousUtils.qualifyTypeNames(typeName, node.getStartOffset(), classScope))
+                        .forEach(qualifiedTypeName -> names.add(QualifiedName.create(qualifiedTypeName)));
+                if (!names.isEmpty()) {
+                    classScope.addFQMixinClassNames(names);
+                }
+            }
+        }
         occurencesBuilder.prepare(node, modelBuilder.getCurrentScope());
         super.visit(node);
     }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java b/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java
index 8e72262365..6ce9231afe 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java
@@ -72,8 +72,8 @@ private Type() {
     public static final String VOID = "void"; //NOI18N
     public static final String MIXED = "mixed"; //NOI18N
 
-    private static final List<String> TYPES_FOR_EDITOR = Arrays.asList(ARRAY, CALLABLE, ITERABLE, BOOL, FLOAT, INT, STRING);
-    private static final List<String> TYPES_FOR_RETURN_TYPE = Arrays.asList(ARRAY, CALLABLE, ITERABLE, BOOL, FLOAT, INT, STRING, VOID);
+    private static final List<String> TYPES_FOR_EDITOR = Arrays.asList(ARRAY, CALLABLE, ITERABLE, BOOL, FLOAT, INT, STRING, OBJECT);
+    private static final List<String> TYPES_FOR_RETURN_TYPE = Arrays.asList(ARRAY, CALLABLE, ITERABLE, BOOL, FLOAT, INT, STRING, VOID, OBJECT);
     private static final List<String> TYPES_FOR_PHP_DOC = Arrays.asList(STRING, INTEGER, INT, BOOLEAN, BOOL, FLOAT, DOUBLE, OBJECT, MIXED, ARRAY,
             RESOURCE, VOID, NULL, CALLBACK, CALLABLE, ITERABLE, "false", "true", "self"); // NOI18N
 
diff --git a/php.editor/src/org/netbeans/modules/php/editor/options/Bundle.properties b/php.editor/src/org/netbeans/modules/php/editor/options/Bundle.properties
index 3b1c7262eb..49380f331f 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/options/Bundle.properties
+++ b/php.editor/src/org/netbeans/modules/php/editor/options/Bundle.properties
@@ -112,3 +112,5 @@ CodeCompletionPanel.autoCompletionSmartQuotesLabel.text=&Quotes Completion:
 CodeCompletionPanel.autoStringConcatenationCheckBox.text=Use Strin&g Auto-Concatenation after Typed Break
 CodeCompletionPanel.useLowercaseLabel.text=Use Lo&wercase:
 CodeCompletionPanel.trueFalseNullCheckBox.text="TRUE", "FALSE", "NULL" C&onstants
+CodeCompletionPanel.autoCompletionCommentAsteriskLabel.text=C&omment Completion:
+CodeCompletionPanel.autoCompletionCommentAsteriskCheckBox.text=&Insert " * " after a line break (Multi line comment /* */ only)
diff --git a/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.form b/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.form
index 0156058274..5fc740484f 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.form
+++ b/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.form
@@ -85,6 +85,14 @@
                       <EmptySpace max="-2" attributes="0"/>
                       <Component id="trueFalseNullCheckBox" min="-2" max="-2" attributes="0"/>
                   </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="autoCompletionCommentAsteriskLabel" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="autoCompletionCommentAsteriskCheckBox" min="-2" max="-2" attributes="0"/>
+                  </Group>
               </Group>
               <EmptySpace max="32767" attributes="0"/>
           </Group>
@@ -143,6 +151,10 @@
               <Component id="useLowercaseLabel" min="-2" max="-2" attributes="0"/>
               <EmptySpace max="-2" attributes="0"/>
               <Component id="trueFalseNullCheckBox" min="-2" max="-2" attributes="0"/>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Component id="autoCompletionCommentAsteriskLabel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="autoCompletionCommentAsteriskCheckBox" min="-2" max="-2" attributes="0"/>
               <EmptySpace max="32767" attributes="0"/>
           </Group>
       </Group>
@@ -520,5 +532,19 @@
         </Property>
       </Properties>
     </Component>
+    <Component class="javax.swing.JLabel" name="autoCompletionCommentAsteriskLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/php/editor/options/Bundle.properties" key="CodeCompletionPanel.autoCompletionCommentAsteriskLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JCheckBox" name="autoCompletionCommentAsteriskCheckBox">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/netbeans/modules/php/editor/options/Bundle.properties" key="CodeCompletionPanel.autoCompletionCommentAsteriskCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
   </SubComponents>
 </Form>
diff --git a/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.java b/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.java
index 94faace933..b29312d234 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/options/CodeCompletionPanel.java
@@ -114,6 +114,7 @@ public static VariablesScope resolve(String value) {
     static final String PHP_AUTO_COMPLETION_SMART_QUOTES = "phpCodeCompletionSmartQuotes"; //NOI18N
     static final String PHP_AUTO_STRING_CONCATINATION = "phpCodeCompletionStringAutoConcatination"; //NOI18N
     static final String PHP_AUTO_COMPLETION_USE_LOWERCASE_TRUE_FALSE_NULL = "phpAutoCompletionUseLowercaseTrueFalseNull"; //NOI18N
+    static final String PHP_AUTO_COMPLETION_COMMENT_ASTERISK = "phpAutoCompletionCommentAsterisk"; // NOI18N
 
     // default values
     static final boolean PHP_AUTO_COMPLETION_FULL_DEFAULT = true;
@@ -126,6 +127,7 @@ public static VariablesScope resolve(String value) {
     static final boolean PHP_AUTO_COMPLETION_SMART_QUOTES_DEFAULT = true;
     static final boolean PHP_AUTO_STRING_CONCATINATION_DEFAULT = true;
     static final boolean PHP_AUTO_COMPLETION_USE_LOWERCASE_TRUE_FALSE_NULL_DEFAULT = true;
+    static final boolean PHP_AUTO_COMPLETION_COMMENT_ASTERISK_DEFAULT = true;
 
     private final Preferences preferences;
     private final ItemListener defaultCheckBoxListener = new DefaultCheckBoxListener();
@@ -156,6 +158,7 @@ public CodeCompletionPanel(Preferences preferences) {
         id2Saved.put(PHP_AUTO_COMPLETION_SMART_QUOTES, autoCompletionSmartQuotesCheckBox.isSelected());
         id2Saved.put(PHP_AUTO_STRING_CONCATINATION, autoStringConcatenationCheckBox.isSelected());
         id2Saved.put(PHP_AUTO_COMPLETION_USE_LOWERCASE_TRUE_FALSE_NULL, trueFalseNullCheckBox.isSelected());
+        id2Saved.put(PHP_AUTO_COMPLETION_COMMENT_ASTERISK, autoCompletionCommentAsteriskCheckBox.isSelected());
     }
 
     public static PreferencesCustomizer.Factory getCustomizerFactory() {
@@ -233,6 +236,12 @@ public void itemStateChanged(ItemEvent e) {
                 PHP_AUTO_COMPLETION_USE_LOWERCASE_TRUE_FALSE_NULL_DEFAULT);
         trueFalseNullCheckBox.setSelected(codeCompletionUseLowercaseTrueFalseNull);
         trueFalseNullCheckBox.addItemListener(defaultCheckBoxListener);
+
+        boolean codeCompletionCommentAsterisk = preferences.getBoolean(
+                PHP_AUTO_COMPLETION_COMMENT_ASTERISK,
+                PHP_AUTO_COMPLETION_COMMENT_ASTERISK_DEFAULT);
+        autoCompletionCommentAsteriskCheckBox.setSelected(codeCompletionCommentAsterisk);
+        autoCompletionCommentAsteriskCheckBox.addItemListener(defaultCheckBoxListener);
     }
 
     private void initCodeCompletionForMethods() {
@@ -303,6 +312,7 @@ void validateData() {
         preferences.putBoolean(PHP_AUTO_COMPLETION_SMART_QUOTES, autoCompletionSmartQuotesCheckBox.isSelected());
         preferences.putBoolean(PHP_AUTO_STRING_CONCATINATION, autoStringConcatenationCheckBox.isSelected());
         preferences.putBoolean(PHP_AUTO_COMPLETION_USE_LOWERCASE_TRUE_FALSE_NULL, trueFalseNullCheckBox.isSelected());
+        preferences.putBoolean(PHP_AUTO_COMPLETION_COMMENT_ASTERISK, autoCompletionCommentAsteriskCheckBox.isSelected());
 
         VariablesScope variablesScope = null;
         if (allVariablesRadioButton.isSelected()) {
@@ -368,6 +378,8 @@ private void initComponents() {
         autoStringConcatenationCheckBox = new JCheckBox();
         useLowercaseLabel = new JLabel();
         trueFalseNullCheckBox = new JCheckBox();
+        autoCompletionCommentAsteriskLabel = new JLabel();
+        autoCompletionCommentAsteriskCheckBox = new JCheckBox();
 
         enableAutocompletionLabel.setLabelFor(autoCompletionFullRadioButton);
         Mnemonics.setLocalizedText(enableAutocompletionLabel, NbBundle.getMessage(CodeCompletionPanel.class, "CodeCompletionPanel.enableAutocompletionLabel.text")); // NOI18N
@@ -437,6 +449,10 @@ private void initComponents() {
 
         Mnemonics.setLocalizedText(trueFalseNullCheckBox, NbBundle.getMessage(CodeCompletionPanel.class, "CodeCompletionPanel.trueFalseNullCheckBox.text")); // NOI18N
 
+        Mnemonics.setLocalizedText(autoCompletionCommentAsteriskLabel, NbBundle.getMessage(CodeCompletionPanel.class, "CodeCompletionPanel.autoCompletionCommentAsteriskLabel.text")); // NOI18N
+
+        Mnemonics.setLocalizedText(autoCompletionCommentAsteriskCheckBox, NbBundle.getMessage(CodeCompletionPanel.class, "CodeCompletionPanel.autoCompletionCommentAsteriskCheckBox.text")); // NOI18N
+
         GroupLayout layout = new GroupLayout(this);
         this.setLayout(layout);
         layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING)
@@ -482,7 +498,13 @@ private void initComponents() {
                         .addComponent(useLowercaseLabel))
                     .addGroup(layout.createSequentialGroup()
                         .addContainerGap()
-                        .addComponent(trueFalseNullCheckBox)))
+                        .addComponent(trueFalseNullCheckBox))
+                    .addGroup(layout.createSequentialGroup()
+                        .addContainerGap()
+                        .addComponent(autoCompletionCommentAsteriskLabel))
+                    .addGroup(layout.createSequentialGroup()
+                        .addContainerGap()
+                        .addComponent(autoCompletionCommentAsteriskCheckBox)))
                 .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
         layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING)
@@ -537,6 +559,10 @@ private void initComponents() {
                 .addComponent(useLowercaseLabel)
                 .addPreferredGap(ComponentPlacement.RELATED)
                 .addComponent(trueFalseNullCheckBox)
+                .addPreferredGap(ComponentPlacement.UNRELATED)
+                .addComponent(autoCompletionCommentAsteriskLabel)
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addComponent(autoCompletionCommentAsteriskCheckBox)
                 .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
 
@@ -583,6 +609,8 @@ private void initComponents() {
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private JRadioButton allVariablesRadioButton;
     private ButtonGroup autoCompletionButtonGroup;
+    private JCheckBox autoCompletionCommentAsteriskCheckBox;
+    private JLabel autoCompletionCommentAsteriskLabel;
     private JRadioButton autoCompletionCustomizeRadioButton;
     private JRadioButton autoCompletionFullRadioButton;
     private JCheckBox autoCompletionNamespacesCheckBox;
diff --git a/php.editor/src/org/netbeans/modules/php/editor/options/OptionsUtils.java b/php.editor/src/org/netbeans/modules/php/editor/options/OptionsUtils.java
index 58b124cf77..cdba8b361d 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/options/OptionsUtils.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/options/OptionsUtils.java
@@ -99,6 +99,12 @@ public void preferenceChange(PreferenceChangeEvent evt) {
                         CodeCompletionPanel.PHP_AUTO_COMPLETION_USE_LOWERCASE_TRUE_FALSE_NULL_DEFAULT);
             }
 
+            if (settingName == null || CodeCompletionPanel.PHP_AUTO_COMPLETION_COMMENT_ASTERISK.equals(settingName)) {
+                autoCompletionCommentAsterisk = preferences.getBoolean(
+                        CodeCompletionPanel.PHP_AUTO_COMPLETION_COMMENT_ASTERISK,
+                        CodeCompletionPanel.PHP_AUTO_COMPLETION_COMMENT_ASTERISK_DEFAULT);
+            }
+
             if (settingName == null || CodeCompletionPanel.PHP_CODE_COMPLETION_STATIC_METHODS.equals(settingName)) {
                 codeCompletionStaticMethods = preferences.getBoolean(
                         CodeCompletionPanel.PHP_CODE_COMPLETION_STATIC_METHODS,
@@ -134,6 +140,7 @@ public void preferenceChange(PreferenceChangeEvent evt) {
     private static Boolean autoCompletionSmartQuotes = null;
     private static Boolean autoStringConcatination = null;
     private static Boolean autoCompletionUseLowercaseTrueFalseNull = null;
+    private static Boolean autoCompletionCommentAsterisk = null;
 
     private static Boolean codeCompletionStaticMethods = null;
     private static Boolean codeCompletionNonStaticMethods = null;
@@ -244,6 +251,17 @@ public static boolean autoCompletionUseLowercaseTrueFalseNull() {
         return autoCompletionUseLowercaseTrueFalseNull;
     }
 
+    /**
+     * Multi line comment only.
+     *
+     * @return {@code true} if " * " is inserted, otherwise {@code false}
+     */
+    public static boolean autoCompletionCommentAsterisk() {
+        lazyInit();
+        assert autoCompletionCommentAsterisk != null;
+        return autoCompletionCommentAsterisk;
+    }
+
     /**
      * All variables or only from current file.
      */
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Parser.java b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Parser.java
index c440b50d13..d477efe23e 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Parser.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Parser.java
@@ -42,7 +42,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.11a beta 20060608
-// Sun Jul 30 19:42:18 JST 2017
+// Sun Jun 10 08:20:09 JST 2018
 //----------------------------------------------------
 
 package org.netbeans.modules.php.editor.parser;
@@ -52,7 +52,7 @@
 import org.openide.util.Pair;
 
 /** CUP v0.11a beta 20060608 generated parser.
-  * @version Sun Jul 30 19:42:18 JST 2017
+  * @version Sun Jun 10 08:20:09 JST 2018
   */
 @org.netbeans.api.annotations.common.SuppressWarnings({"EI_EXPOSE_REP", "MS_PKGPROTECT", "BC_BAD_CAST_TO_CONCRETE_COLLECTION"})
 public class ASTPHP5Parser extends java_cup.runtime.lr_parser {
@@ -102,7 +102,7 @@
     "\000\002\013\006\000\002\013\004\000\002\011\005\000" +
     "\002\011\003\000\002\010\003\000\002\010\005\000\002" +
     "\010\007\000\002\010\004\000\002\010\006\000\002\010" +
-    "\010\000\002\005\003\000\002\005\002\000\002\006\005" +
+    "\010\000\002\005\004\000\002\005\002\000\002\006\005" +
     "\000\002\006\003\000\002\007\003\000\002\007\005\000" +
     "\002\007\004\000\002\007\006\000\002\007\004\000\002" +
     "\007\006\000\002\015\004\000\002\015\002\000\002\016" +
@@ -294,7 +294,7 @@
   /** <code>reduce_goto</code> table. */
   protected static final short[][] _reduce_table =
     unpackFromStrings(new String[] {
-    "\000\u0537\000\006\002\003\012\004\001\001\000\002\001" +
+    "\000\u0538\000\006\002\003\012\004\001\001\000\002\001" +
     "\001\000\140\003\174\004\101\013\206\014\177\017\132" +
     "\062\167\063\124\064\154\065\051\070\131\074\015\100" +
     "\016\101\100\103\165\104\176\105\204\106\063\107\170" +
@@ -303,16 +303,16 @@
     "\177\121\200\150\201\025\212\160\213\023\214\054\223" +
     "\171\225\116\226\006\230\021\233\134\240\111\243\032" +
     "\244\040\245\047\256\057\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\006\050\u0529\051\u052c" +
+    "\002\001\001\000\002\001\001\000\006\050\u052a\051\u052d" +
     "\001\001\000\002\001\001\000\112\003\174\004\101\062" +
-    "\167\063\124\064\154\065\051\070\131\074\015\100\u0524" +
-    "\103\u0525\104\u0526\105\204\106\063\107\170\110\143\121" +
+    "\167\063\124\064\154\065\051\070\131\074\015\100\u0525" +
+    "\103\u0526\104\u0527\105\204\106\063\107\170\110\143\121" +
     "\106\131\075\151\126\152\043\153\022\154\137\155\077" +
     "\156\056\157\110\161\070\201\025\223\171\225\116\226" +
     "\006\230\021\233\134\240\111\243\032\244\040\245\047" +
     "\256\057\001\001\000\002\001\001\000\106\003\174\004" +
     "\101\062\167\063\124\064\154\065\051\070\131\074\015" +
-    "\100\u0520\105\204\106\063\107\170\110\143\121\106\131" +
+    "\100\u0521\105\204\106\063\107\170\110\143\121\106\131" +
     "\075\151\126\152\043\153\022\154\137\155\077\156\056" +
     "\157\110\161\070\201\025\223\171\225\116\226\006\230" +
     "\021\233\134\240\111\243\032\244\040\245\047\256\057" +
@@ -1731,51 +1731,51 @@
     "\230\021\233\134\240\111\243\032\244\040\245\047\256" +
     "\057\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\002\001\001\000\010\003\u04f6\010\u04f8\011\u0517" +
+    "\001\000\002\001\001\000\010\003\u04f6\010\u04f8\011\u0518" +
     "\001\001\000\002\001\001\000\004\003\u0501\001\001\000" +
     "\010\003\u04f6\010\u04f8\011\u04ff\001\001\000\002\001\001" +
     "\000\006\003\u04f6\010\u04fe\001\001\000\002\001\001\000" +
     "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\012\003\u050b\005\u050a\006\u0509\007\u0506\001\001" +
-    "\000\002\001\001\000\004\003\u0514\001\001\000\004\003" +
-    "\u0511\001\001\000\002\001\001\000\002\001\001\000\002" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\006\003\u050b\007\u0510\001\001\000\002\001\001" +
+    "\000\002\001\001\000\004\003\u0515\001\001\000\004\003" +
+    "\u0512\001\001\000\004\076\u0510\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\002\001\001\000\006\003\u050b\007\u0511\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\002\001\001\000\012\003\u050b\005\u051d\006\u0509" +
-    "\007\u0506\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\116\003\174\004\101" +
-    "\062\167\063\124\064\154\065\051\070\131\074\015\100" +
-    "\u02d6\105\204\106\063\107\170\110\143\121\106\122\u0522" +
-    "\123\u02d7\124\u02d9\125\u02d8\131\075\151\126\152\043\153" +
-    "\022\154\137\155\077\156\056\157\110\161\070\201\025" +
-    "\223\171\225\116\226\006\230\021\233\134\240\111\243" +
-    "\032\244\040\245\047\256\057\001\001\000\002\001\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\106\003\174\004\101\062\167\063\124" +
-    "\064\154\065\051\070\131\074\015\100\u0528\105\204\106" +
-    "\063\107\170\110\143\121\106\131\075\151\126\152\043" +
-    "\153\022\154\137\155\077\156\056\157\110\161\070\201" +
-    "\025\223\171\225\116\226\006\230\021\233\134\240\111" +
-    "\243\032\244\040\245\047\256\057\001\001\000\002\001" +
-    "\001\000\002\001\001\000\002\001\001\000\054\003\u0106" +
-    "\064\154\065\051\105\u0103\106\063\107\375\110\143\121" +
-    "\106\152\043\155\376\156\056\161\u0101\201\u052e\223\u052d" +
-    "\226\006\230\021\233\134\243\032\244\040\245\047\256" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\012" +
+    "\003\u050b\005\u051e\006\u0509\007\u0506\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\116\003\174\004\101\062\167\063\124\064\154\065" +
+    "\051\070\131\074\015\100\u02d6\105\204\106\063\107\170" +
+    "\110\143\121\106\122\u0523\123\u02d7\124\u02d9\125\u02d8\131" +
+    "\075\151\126\152\043\153\022\154\137\155\077\156\056" +
+    "\157\110\161\070\201\025\223\171\225\116\226\006\230" +
+    "\021\233\134\240\111\243\032\244\040\245\047\256\057" +
+    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\001\000\002\001\001\000\002\001\001\000\106\003\174" +
+    "\004\101\062\167\063\124\064\154\065\051\070\131\074" +
+    "\015\100\u0529\105\204\106\063\107\170\110\143\121\106" +
+    "\131\075\151\126\152\043\153\022\154\137\155\077\156" +
+    "\056\157\110\161\070\201\025\223\171\225\116\226\006" +
+    "\230\021\233\134\240\111\243\032\244\040\245\047\256" +
     "\057\001\001\000\002\001\001\000\002\001\001\000\002" +
-    "\001\001\000\106\003\174\004\101\062\167\063\124\064" +
-    "\154\065\051\070\131\074\015\100\u0530\105\204\106\063" +
-    "\107\170\110\143\121\106\131\075\151\126\152\043\153" +
-    "\022\154\137\155\077\156\056\157\110\161\070\201\025" +
-    "\223\171\225\116\226\006\230\021\233\134\240\111\243" +
+    "\001\001\000\054\003\u0106\064\154\065\051\105\u0103\106" +
+    "\063\107\375\110\143\121\106\152\043\155\376\156\056" +
+    "\161\u0101\201\u052f\223\u052e\226\006\230\021\233\134\243" +
     "\032\244\040\245\047\256\057\001\001\000\002\001\001" +
-    "\000\002\001\001\000\004\051\u0534\001\001\000\002\001" +
-    "\001\000\002\001\001\000\010\046\u0536\047\335\056\336" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001" });
+    "\000\002\001\001\000\002\001\001\000\106\003\174\004" +
+    "\101\062\167\063\124\064\154\065\051\070\131\074\015" +
+    "\100\u0531\105\204\106\063\107\170\110\143\121\106\131" +
+    "\075\151\126\152\043\153\022\154\137\155\077\156\056" +
+    "\157\110\161\070\201\025\223\171\225\116\226\006\230" +
+    "\021\233\134\240\111\243\032\244\040\245\047\256\057" +
+    "\001\001\000\002\001\001\000\002\001\001\000\004\051" +
+    "\u0535\001\001\000\002\001\001\000\002\001\001\000\010" +
+    "\046\u0537\047\335\056\336\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001" });
 
   /** Access to <code>reduce_goto</code> table. */
   public short[][] reduce_table() {return _reduce_table;}
@@ -3738,16 +3738,16 @@ else if (CUP$ASTPHP5Parser$act_num < 700) {
           return CUP$ASTPHP5Parser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 107: // group_namespace_parts ::= non_empty_group_namespace_parts
+          case 107: // group_namespace_parts ::= non_empty_group_namespace_parts possible_comma
             {
               List RESULT =null;
-		int listleft = ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.peek()).left;
-		int listright = ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.peek()).right;
-		List list = (List)((java_cup.runtime.Symbol) CUP$ASTPHP5Parser$stack.peek()).value;
+		int listleft = ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.elementAt(CUP$ASTPHP5Parser$top-1)).left;
+		int listright = ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.elementAt(CUP$ASTPHP5Parser$top-1)).right;
+		List list = (List)((java_cup.runtime.Symbol) CUP$ASTPHP5Parser$stack.elementAt(CUP$ASTPHP5Parser$top-1)).value;
 
 	RESULT = list;
 
-              CUP$ASTPHP5Parser$result = parser.getSymbolFactory().newSymbol("group_namespace_parts",3, ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.peek()), ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.peek()), RESULT);
+              CUP$ASTPHP5Parser$result = parser.getSymbolFactory().newSymbol("group_namespace_parts",3, ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.elementAt(CUP$ASTPHP5Parser$top-1)), ((java_cup.runtime.Symbol)CUP$ASTPHP5Parser$stack.peek()), RESULT);
             }
           return CUP$ASTPHP5Parser$result;
 
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java
index c278d3c5b8..c40c8e9693 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 17/04/23 9:54 */
+/* The following code was generated by JFlex 1.4.3 on 17/07/09 10:32 */
 
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
@@ -56,7 +56,7 @@
 /**
  * This class is a scanner generated by
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 17/04/23 9:54 from the specification file
+ * on 17/07/09 10:32 from the specification file
  * <tt>/home/junichi11/hg/web-main/php.editor/tools/ASTPHP5Scanner.flex</tt>
  */
 public class ASTPHP5Scanner implements Scanner {
@@ -234,29 +234,29 @@
     "\1\175\1\47\1\175\1\176\1\1\1\176\2\1\1\175"+
     "\1\177\1\0\1\177\1\0\2\150\1\200\2\0\6\6"+
     "\1\201\1\202\1\6\1\203\23\6\1\204\12\6\1\205"+
-    "\1\6\1\206\5\6\12\0\11\6\4\0\1\207\2\0"+
+    "\1\6\1\206\5\6\12\0\11\6\5\0\1\207\3\0"+
     "\1\45\1\47\1\1\2\0\1\6\1\210\5\6\1\211"+
     "\1\6\1\212\1\213\4\6\1\214\1\6\1\215\1\216"+
     "\3\6\1\217\2\6\1\220\1\6\1\221\2\6\1\222"+
     "\1\223\1\224\4\6\1\225\1\226\2\6\1\227\2\6"+
-    "\5\0\1\230\6\0\11\6\2\231\4\0\4\232\2\233"+
+    "\5\0\1\230\6\0\11\6\2\231\5\0\4\232\2\233"+
     "\1\0\2\6\1\234\2\6\1\235\7\6\1\236\7\6"+
     "\1\237\1\240\1\241\1\6\1\0\1\242\1\243\2\6"+
-    "\4\0\1\244\5\0\1\245\11\6\5\0\1\246\6\6"+
+    "\4\0\1\244\5\0\1\245\11\6\6\0\1\246\6\6"+
     "\1\247\3\6\1\250\1\251\1\252\1\6\1\253\3\6"+
     "\1\254\1\0\1\255\1\6\1\256\3\0\1\257\1\0"+
-    "\1\6\1\260\7\6\2\261\3\0\3\6\1\262\1\263"+
+    "\1\6\1\260\7\6\2\261\4\0\3\6\1\262\1\263"+
     "\5\6\1\264\1\6\1\265\1\266\1\6\1\0\1\6"+
-    "\1\267\1\270\1\6\1\271\3\6\1\272\2\6\4\0"+
+    "\1\267\1\270\1\6\1\271\3\6\1\272\2\6\5\0"+
     "\2\6\1\273\1\274\1\6\1\275\2\6\1\276\1\6"+
-    "\1\0\1\277\1\300\2\6\1\301\2\6\3\0\1\302"+
+    "\1\0\1\277\1\300\2\6\1\301\2\6\5\0\1\302"+
     "\1\303\1\6\1\304\1\305\1\6\1\306\2\6\1\307"+
-    "\1\6\5\0\5\6\5\0\1\310\1\311\1\312\2\6"+
-    "\1\313\2\0\1\314\1\6\1\0\1\6\1\0\1\6"+
-    "\7\0\1\315\7\0\1\75\1\0";
+    "\1\6\10\0\5\6\7\0\1\310\1\311\1\312\2\6"+
+    "\1\0\1\313\2\0\1\314\1\6\5\0\1\6\1\315"+
+    "\3\0\1\6\7\0\1\316\7\0\1\75\1\0";
 
   private static int [] zzUnpackAction() {
-    int [] result = new int[764];
+    int [] result = new int[785];
     int offset = 0;
     offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
     return result;
@@ -339,47 +339,50 @@ private static int zzUnpackAction(String packed, int offset, int [] result) {
     "\0\u07b4\0\u51d0\0\u07b4\0\u5214\0\u5258\0\u529c\0\u52e0\0\u5324"+
     "\0\u5368\0\u53ac\0\u53f0\0\u5434\0\u5478\0\u54bc\0\u5500\0\u5544"+
     "\0\u5588\0\u55cc\0\u5610\0\u5654\0\u5698\0\u56dc\0\u5720\0\u5764"+
-    "\0\u57a8\0\u57ec\0\u5830\0\u5874\0\u58b8\0\u58fc\0\u5940\0\u0550"+
-    "\0\u5984\0\u59c8\0\u5a0c\0\u5a50\0\u5a94\0\u5ad8\0\u5b1c\0\u5b60"+
-    "\0\u07b4\0\u5ba4\0\u5be8\0\u5c2c\0\u5c70\0\u5cb4\0\u07b4\0\u5cf8"+
-    "\0\u07b4\0\u07b4\0\u5d3c\0\u5d80\0\u5dc4\0\u5e08\0\u07b4\0\u5e4c"+
-    "\0\u07b4\0\u07b4\0\u5e90\0\u5ed4\0\u5f18\0\u5f5c\0\u5fa0\0\u5fe4"+
-    "\0\u07b4\0\u6028\0\u07b4\0\u606c\0\u60b0\0\u07b4\0\u07b4\0\u07b4"+
-    "\0\u60f4\0\u6138\0\u617c\0\u61c0\0\u6204\0\u07b4\0\u6248\0\u628c"+
-    "\0\u07b4\0\u62d0\0\u6314\0\u6358\0\u639c\0\u63e0\0\u6424\0\u6468"+
-    "\0\u0550\0\u64ac\0\u64f0\0\u6534\0\u6578\0\u65bc\0\u6600\0\u6644"+
+    "\0\u57a8\0\u57ec\0\u5830\0\u5874\0\u58b8\0\u58fc\0\u5940\0\u5984"+
+    "\0\u0550\0\u59c8\0\u5a0c\0\u5a50\0\u5a94\0\u5ad8\0\u5b1c\0\u5b60"+
+    "\0\u5ba4\0\u5be8\0\u07b4\0\u5c2c\0\u5c70\0\u5cb4\0\u5cf8\0\u5d3c"+
+    "\0\u07b4\0\u5d80\0\u07b4\0\u07b4\0\u5dc4\0\u5e08\0\u5e4c\0\u5e90"+
+    "\0\u07b4\0\u5ed4\0\u07b4\0\u07b4\0\u5f18\0\u5f5c\0\u5fa0\0\u5fe4"+
+    "\0\u6028\0\u606c\0\u07b4\0\u60b0\0\u07b4\0\u60f4\0\u6138\0\u07b4"+
+    "\0\u07b4\0\u07b4\0\u617c\0\u61c0\0\u6204\0\u6248\0\u628c\0\u07b4"+
+    "\0\u62d0\0\u6314\0\u07b4\0\u6358\0\u639c\0\u63e0\0\u6424\0\u6468"+
+    "\0\u64ac\0\u64f0\0\u0550\0\u6534\0\u6578\0\u65bc\0\u6600\0\u6644"+
     "\0\u6688\0\u66cc\0\u6710\0\u6754\0\u6798\0\u67dc\0\u6820\0\u6864"+
-    "\0\u0550\0\u68a8\0\u68ec\0\u6930\0\u6974\0\u69b8\0\u0550\0\u1144"+
-    "\0\u1254\0\u1364\0\u0550\0\u69fc\0\u6a40\0\u6a84\0\u6ac8\0\u6b0c"+
-    "\0\u6b50\0\u6b94\0\u07b4\0\u6bd8\0\u6c1c\0\u6c60\0\u6ca4\0\u6ce8"+
-    "\0\u6d2c\0\u6d70\0\u07b4\0\u6db4\0\u6df8\0\u6e3c\0\u6e80\0\u6ec4"+
-    "\0\u6f08\0\u6f4c\0\u07b4\0\u07b4\0\u07b4\0\u6f90\0\u6fd4\0\u07b4"+
-    "\0\u07b4\0\u7018\0\u705c\0\u70a0\0\u70e4\0\u7128\0\u716c\0\u0550"+
-    "\0\u71b0\0\u71f4\0\u7238\0\u727c\0\u72c0\0\u0550\0\u7304\0\u7348"+
-    "\0\u738c\0\u73d0\0\u7414\0\u7458\0\u749c\0\u74e0\0\u7524\0\u7568"+
-    "\0\u75ac\0\u75f0\0\u7634\0\u7678\0\u07b4\0\u76bc\0\u7700\0\u7744"+
-    "\0\u7788\0\u77cc\0\u7810\0\u7854\0\u7898\0\u78dc\0\u7920\0\u07b4"+
-    "\0\u07b4\0\u07b4\0\u7964\0\u07b4\0\u79a8\0\u79ec\0\u7a30\0\u7a74"+
-    "\0\u7ab8\0\u07b4\0\u7afc\0\u0550\0\u7b40\0\u7b84\0\u7bc8\0\u0550"+
-    "\0\u7c0c\0\u7c50\0\u07b4\0\u7c94\0\u7cd8\0\u7d1c\0\u7d60\0\u7da4"+
-    "\0\u7de8\0\u7e2c\0\u0550\0\u7e70\0\u7eb4\0\u7ef8\0\u7f3c\0\u7f80"+
-    "\0\u7fc4\0\u8008\0\u07b4\0\u07b4\0\u804c\0\u8090\0\u80d4\0\u8118"+
-    "\0\u815c\0\u07b4\0\u81a0\0\u07b4\0\u07b4\0\u81e4\0\u8228\0\u826c"+
-    "\0\u0550\0\u0550\0\u82b0\0\u07b4\0\u82f4\0\u8338\0\u837c\0\u07b4"+
-    "\0\u83c0\0\u8404\0\u8448\0\u848c\0\u84d0\0\u8514\0\u8558\0\u859c"+
-    "\0\u07b4\0\u07b4\0\u85e0\0\u07b4\0\u8624\0\u8668\0\u07b4\0\u86ac"+
-    "\0\u86f0\0\u07b4\0\u07b4\0\u8734\0\u8778\0\u07b4\0\u87bc\0\u8800"+
-    "\0\u8844\0\u8888\0\u88cc\0\u07b4\0\u07b4\0\u8910\0\u07b4\0\u07b4"+
-    "\0\u8954\0\u0550\0\u8998\0\u89dc\0\u07b4\0\u8a20\0\u8a64\0\u8aa8"+
-    "\0\u8aec\0\u8b30\0\u8b74\0\u8bb8\0\u8bfc\0\u8c40\0\u8c84\0\u8cc8"+
-    "\0\u8d0c\0\u8d50\0\u8d94\0\u8dd8\0\u8e1c\0\u07b4\0\u07b4\0\u07b4"+
-    "\0\u8e60\0\u8ea4\0\u0550\0\u8ee8\0\u8f2c\0\u07b4\0\u8f70\0\u8fb4"+
-    "\0\u8ff8\0\u903c\0\u9080\0\u90c4\0\u9108\0\u914c\0\u9190\0\u91d4"+
-    "\0\u9218\0\u925c\0\u0550\0\u92a0\0\u92e4\0\u9328\0\u936c\0\u93b0"+
-    "\0\u93f4\0\u9438\0\u0550\0\u947c";
+    "\0\u68a8\0\u68ec\0\u0550\0\u6930\0\u6974\0\u69b8\0\u69fc\0\u6a40"+
+    "\0\u6a84\0\u0550\0\u1144\0\u1254\0\u1364\0\u0550\0\u6ac8\0\u6b0c"+
+    "\0\u6b50\0\u6b94\0\u6bd8\0\u6c1c\0\u6c60\0\u07b4\0\u6ca4\0\u6ce8"+
+    "\0\u6d2c\0\u6d70\0\u6db4\0\u6df8\0\u6e3c\0\u07b4\0\u6e80\0\u6ec4"+
+    "\0\u6f08\0\u6f4c\0\u6f90\0\u6fd4\0\u7018\0\u07b4\0\u07b4\0\u07b4"+
+    "\0\u705c\0\u70a0\0\u07b4\0\u07b4\0\u70e4\0\u7128\0\u716c\0\u71b0"+
+    "\0\u71f4\0\u7238\0\u0550\0\u727c\0\u72c0\0\u7304\0\u7348\0\u738c"+
+    "\0\u0550\0\u73d0\0\u7414\0\u7458\0\u749c\0\u74e0\0\u7524\0\u7568"+
+    "\0\u75ac\0\u75f0\0\u7634\0\u7678\0\u76bc\0\u7700\0\u7744\0\u7788"+
+    "\0\u07b4\0\u77cc\0\u7810\0\u7854\0\u7898\0\u78dc\0\u7920\0\u7964"+
+    "\0\u79a8\0\u79ec\0\u7a30\0\u07b4\0\u07b4\0\u07b4\0\u7a74\0\u07b4"+
+    "\0\u7ab8\0\u7afc\0\u7b40\0\u7b84\0\u7bc8\0\u07b4\0\u7c0c\0\u0550"+
+    "\0\u7c50\0\u7c94\0\u7cd8\0\u0550\0\u7d1c\0\u7d60\0\u07b4\0\u7da4"+
+    "\0\u7de8\0\u7e2c\0\u7e70\0\u7eb4\0\u7ef8\0\u7f3c\0\u0550\0\u7f80"+
+    "\0\u7fc4\0\u8008\0\u804c\0\u8090\0\u80d4\0\u8118\0\u815c\0\u07b4"+
+    "\0\u07b4\0\u81a0\0\u81e4\0\u8228\0\u826c\0\u82b0\0\u07b4\0\u82f4"+
+    "\0\u07b4\0\u07b4\0\u8338\0\u837c\0\u83c0\0\u0550\0\u0550\0\u8404"+
+    "\0\u07b4\0\u8448\0\u848c\0\u84d0\0\u07b4\0\u8514\0\u8558\0\u859c"+
+    "\0\u85e0\0\u8624\0\u8668\0\u86ac\0\u86f0\0\u8734\0\u07b4\0\u07b4"+
+    "\0\u8778\0\u07b4\0\u87bc\0\u8800\0\u07b4\0\u8844\0\u8888\0\u07b4"+
+    "\0\u07b4\0\u88cc\0\u8910\0\u07b4\0\u8954\0\u8998\0\u89dc\0\u8a20"+
+    "\0\u8a64\0\u8aa8\0\u8aec\0\u07b4\0\u07b4\0\u8b30\0\u07b4\0\u07b4"+
+    "\0\u8b74\0\u0550\0\u8bb8\0\u8bfc\0\u07b4\0\u8c40\0\u8c84\0\u8cc8"+
+    "\0\u8d0c\0\u8d50\0\u8d94\0\u8dd8\0\u8e1c\0\u8e60\0\u8ea4\0\u8ee8"+
+    "\0\u8f2c\0\u8f70\0\u8fb4\0\u8ff8\0\u903c\0\u9080\0\u90c4\0\u9108"+
+    "\0\u914c\0\u9190\0\u07b4\0\u07b4\0\u07b4\0\u91d4\0\u9218\0\u925c"+
+    "\0\u0550\0\u92a0\0\u92e4\0\u07b4\0\u9328\0\u936c\0\u93b0\0\u93f4"+
+    "\0\u9438\0\u947c\0\u94c0\0\u936c\0\u9504\0\u9548\0\u958c\0\u95d0"+
+    "\0\u9614\0\u9658\0\u969c\0\u96e0\0\u9724\0\u9768\0\u97ac\0\u0550"+
+    "\0\u97f0\0\u9834\0\u9878\0\u98bc\0\u9900\0\u9944\0\u9988\0\u0550"+
+    "\0\u99cc";
 
   private static int [] zzUnpackRowMap() {
-    int [] result = new int[764];
+    int [] result = new int[785];
     int offset = 0;
     offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
     return result;
@@ -780,453 +783,479 @@ private static int zzUnpackRowMap(String packed, int offset, int [] result) {
     "\1\36\2\0\3\36\17\0\1\36\5\0\1\u01d4\2\0"+
     "\3\u01d4\1\0\2\u01d4\3\0\1\u0172\2\0\1\u01d5\4\0"+
     "\22\u01d4\3\0\1\u01d4\2\0\3\u01d4\17\0\1\u01d4\1\u01d6"+
-    "\36\0\1\u01d7\64\0\3\u0175\56\0\1\u0177\71\0\1\u01d8"+
-    "\72\0\1\u01d9\45\0\1\u0178\103\0\1\u017a\137\0\1\u01da"+
-    "\31\0\15\116\1\363\3\116\1\364\1\0\1\116\1\365"+
-    "\25\116\1\u01db\31\116\15\123\1\375\3\123\1\376\1\123"+
-    "\1\0\1\377\25\123\1\u01dc\31\123\15\130\1\u0104\1\u0182"+
-    "\1\130\1\u0182\1\u0105\2\130\1\u0106\74\130\1\u0104\1\u0184"+
-    "\1\130\1\u0184\1\u0105\2\130\1\u0106\74\130\1\u0104\1\132"+
-    "\1\130\1\132\1\u0105\2\130\1\u0106\25\130\1\u01dd\31\130"+
-    "\16\u010f\1\u0188\1\u010f\1\u0188\101\u010f\1\u018a\1\u010f\1\u018a"+
-    "\63\u010f\50\0\1\u01de\62\0\1\u01df\55\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\5\36\1\u01e0\14\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\3\36\1\u01e1\16\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\u01e2\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\7\36\1\u01e3\12\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\16\36\1\u01e4\3\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\15\36\1\u01e5\4\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\1\u01e6\21\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\12\36\1\u01e7\7\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\11\36\1\u01e8\10\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\12\36\1\u01e9\7\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\17\36\1\u01ea\2\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\11\36\1\u01eb\10\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\4\36\1\u01ec\15\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\u01ed\1\0\2\36"+
-    "\1\u01ee\5\36\12\0\22\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\1\36\1\u01ef\20\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\u01f0\1\0\10\36"+
-    "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+
-    "\1\u01f1\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\16\36"+
-    "\1\u01f2\3\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\4\36"+
-    "\1\u01f3\15\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\5\36"+
-    "\1\u01f4\14\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\2\36\1\u01f5\5\36"+
-    "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\13\36"+
-    "\1\u01f6\6\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+
-    "\1\u01f7\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\2\36\1\u01f8\5\36"+
-    "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+
-    "\1\u01f9\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\10\36"+
-    "\1\u01fa\11\36\3\0\1\36\2\0\3\36\17\0\1\u01fa"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\15\36"+
-    "\1\u01fb\4\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\2\36\1\u01fc\5\36"+
-    "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\u01fd"+
-    "\21\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\1\36\1\u01fe"+
-    "\20\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\10\36\1\u01ff"+
-    "\11\36\3\0\1\36\2\0\3\36\17\0\1\u01ff\3\0"+
-    "\1\36\1\0\1\u0200\1\0\10\36\12\0\22\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\1\u0201\21\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\6\36\1\u0202\13\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\11\36\1\u0203\10\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\1\u0204\21\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\2\36\1\u0205\17\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\u0206\1\0"+
-    "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\2\36\1\u0207"+
-    "\5\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
+    "\36\0\1\u01d7\64\0\3\u0175\56\0\1\u0177\22\0\3\u01d8"+
+    "\44\0\1\u01d9\11\0\1\u01da\60\0\1\u01db\45\0\1\u0178"+
+    "\103\0\1\u017a\137\0\1\u01dc\31\0\15\116\1\363\3\116"+
+    "\1\364\1\0\1\116\1\365\25\116\1\u01dd\31\116\15\123"+
+    "\1\375\3\123\1\376\1\123\1\0\1\377\25\123\1\u01de"+
+    "\31\123\15\130\1\u0104\1\u0182\1\130\1\u0182\1\u0105\2\130"+
+    "\1\u0106\74\130\1\u0104\1\u0184\1\130\1\u0184\1\u0105\2\130"+
+    "\1\u0106\74\130\1\u0104\1\132\1\130\1\132\1\u0105\2\130"+
+    "\1\u0106\25\130\1\u01df\31\130\16\u010f\1\u0188\1\u010f\1\u0188"+
+    "\101\u010f\1\u018a\1\u010f\1\u018a\63\u010f\50\0\1\u01e0\62\0"+
+    "\1\u01e1\55\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\5\36\1\u01e2\14\36\3\0\1\36\2\0\3\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\1\u0208\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+
-    "\1\u0209\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\2\36\1\u020a\5\36"+
-    "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\u020b\1\0\10\36\12\0\22\36"+
-    "\3\0\1\36\2\0\3\36\17\0\1\36\11\0\1\u020c"+
-    "\103\0\1\u020d\136\0\1\u020e\44\0\1\u020f\13\0\1\u0210"+
-    "\36\0\1\u0211\35\0\1\u0212\102\0\1\u0213\77\0\1\u0214"+
-    "\103\0\1\u0215\127\0\1\u0216\116\0\1\u0217\42\0\1\36"+
-    "\1\0\1\36\1\0\2\36\1\u0218\5\36\12\0\22\36"+
+    "\3\36\1\u01e3\16\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\u01e4\1\0\10\36\12\0"+
+    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\7\36\1\u01e5"+
+    "\12\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\16\36\1\u01e6"+
+    "\3\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\15\36\1\u01e7"+
+    "\4\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\1\u01e8\21\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\11\36\1\u0219\10\36"+
+    "\1\0\1\36\1\0\10\36\12\0\12\36\1\u01e9\7\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\13\36\1\u021a\6\36"+
+    "\1\0\1\36\1\0\10\36\12\0\11\36\1\u01ea\10\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\5\36\1\u021b\14\36"+
+    "\1\0\1\36\1\0\10\36\12\0\12\36\1\u01eb\7\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\14\36\1\u021c\5\36"+
+    "\1\0\1\36\1\0\10\36\12\0\17\36\1\u01ec\2\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\2\36\1\u021d\5\36\12\0\22\36"+
+    "\1\0\1\36\1\0\10\36\12\0\11\36\1\u01ed\10\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\5\36\1\u021e\14\36"+
+    "\1\0\1\36\1\0\10\36\12\0\4\36\1\u01ee\15\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\1\36\1\u021f\20\36"+
+    "\1\0\1\u01ef\1\0\2\36\1\u01f0\5\36\12\0\22\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\13\36\1\u0220\6\36"+
-    "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\u01d4"+
-    "\1\0\1\u01d4\1\0\10\u01d4\1\0\1\u0221\1\0\1\u0222"+
-    "\6\0\22\u01d4\3\0\1\u01d4\2\0\3\u01d4\17\0\1\u01d4"+
-    "\5\0\1\u0223\2\0\3\u0223\1\0\2\u0223\13\0\22\u0223"+
-    "\3\0\1\u0223\2\0\3\u0223\17\0\1\u0223\5\0\1\u0224"+
-    "\2\0\3\u0224\1\0\2\u0224\13\0\22\u0224\3\0\1\u0224"+
-    "\2\0\3\u0224\17\0\1\u0224\42\0\1\u0225\52\0\1\u0226"+
-    "\77\0\1\u0227\2\0\3\u0227\2\0\1\u0227\13\0\22\u0227"+
-    "\3\0\1\u0227\2\0\3\u0227\17\0\1\u0227\2\0\3\116"+
-    "\1\u0228\2\116\3\u0228\2\116\1\u0228\1\116\1\363\3\116"+
-    "\1\364\1\0\1\116\1\365\2\116\22\u0228\3\116\1\u0228"+
-    "\2\116\3\u0228\17\116\1\u0228\2\116\3\123\1\u0229\2\123"+
-    "\3\u0229\2\123\1\u0229\1\123\1\375\3\123\1\376\1\123"+
-    "\1\0\1\377\2\123\22\u0229\3\123\1\u0229\2\123\3\u0229"+
-    "\17\123\1\u0229\2\123\3\130\1\u022a\2\130\3\u022a\2\130"+
-    "\1\u022a\1\130\1\u0104\1\132\1\130\1\132\1\u0105\2\130"+
-    "\1\u0106\2\130\22\u022a\3\130\1\u022a\2\130\3\u022a\17\130"+
-    "\1\u022a\2\130\16\0\2\u022b\1\u022c\133\0\1\u022d\34\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u022e"+
-    "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u022f"+
-    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\11\36\1\u0230"+
-    "\10\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\1\u0231\21\36"+
+    "\1\0\1\36\1\0\10\36\12\0\1\36\1\u01f1\20\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\1\u0232\21\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\3\36\1\u0233\16\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\2\36\1\u0234\5\36\12\0\22\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\3\36\1\u0235\16\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\2\36\1\u0236\17\36\3\0"+
+    "\1\0\1\u01f2\1\0\10\36\12\0\22\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\1\36\1\u01f3\20\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\16\36\1\u01f4\3\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\4\36\1\u01f5\15\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\5\36\1\u01f6\14\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\2\36\1\u01f7\5\36\12\0\22\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\13\36\1\u01f8\6\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\1\36\1\u01f9\20\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\2\36\1\u01fa\5\36\12\0\22\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\1\36\1\u01fb\20\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\10\36\1\u01fc\11\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\u01fc\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\15\36\1\u01fd\4\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\2\36\1\u01fe\5\36\12\0\22\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\1\u01ff\21\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\1\36\1\u0200\20\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\10\36\1\u0201\11\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\u0201\3\0\1\36\1\0\1\u0202\1\0"+
+    "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\1\u0203\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\6\36"+
+    "\1\u0204\13\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\11\36"+
+    "\1\u0205\10\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\u0206"+
+    "\21\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u0207"+
+    "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\u0208\1\0\10\36\12\0\22\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\2\36\1\u0237\5\36\12\0\22\36\3\0"+
+    "\1\36\1\0\2\36\1\u0209\5\36\12\0\22\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\5\36\1\u0238\14\36\3\0"+
+    "\1\36\1\0\10\36\12\0\1\u020a\21\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\1\36\1\u020b\20\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\2\36\1\u020c\5\36\12\0\22\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u020d"+
+    "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\11\0\1\u020e\103\0\1\u020f\136\0\1\u0210"+
+    "\44\0\1\u0211\13\0\1\u0212\36\0\1\u0213\35\0\1\u0214"+
+    "\102\0\1\u0215\77\0\1\u0216\103\0\1\u0217\127\0\1\u0218"+
+    "\116\0\1\u0219\42\0\1\36\1\0\1\36\1\0\2\36"+
+    "\1\u021a\5\36\12\0\22\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\11\36\1\u021b\10\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\13\36\1\u021c\6\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\5\36\1\u021d\14\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\14\36\1\u021e\5\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\2\36"+
+    "\1\u021f\5\36\12\0\22\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\5\36\1\u0220\14\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\1\36\1\u0221\20\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\13\36\1\u0222\6\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\u01d4\1\0\1\u01d4\1\0\10\u01d4"+
+    "\1\0\1\u0223\1\0\1\u0224\6\0\22\u01d4\3\0\1\u01d4"+
+    "\2\0\3\u01d4\17\0\1\u01d4\5\0\1\u0225\2\0\3\u0225"+
+    "\1\0\2\u0225\13\0\22\u0225\3\0\1\u0225\2\0\3\u0225"+
+    "\17\0\1\u0225\5\0\1\u0226\2\0\3\u0226\1\0\2\u0226"+
+    "\13\0\22\u0226\3\0\1\u0226\2\0\3\u0226\17\0\1\u0226"+
+    "\42\0\1\u0227\61\0\3\u01d8\56\0\1\u01da\60\0\1\u0228"+
+    "\36\0\1\u0229\77\0\1\u022a\2\0\3\u022a\2\0\1\u022a"+
+    "\13\0\22\u022a\3\0\1\u022a\2\0\3\u022a\17\0\1\u022a"+
+    "\2\0\3\116\1\u022b\2\116\3\u022b\2\116\1\u022b\1\116"+
+    "\1\363\3\116\1\364\1\0\1\116\1\365\2\116\22\u022b"+
+    "\3\116\1\u022b\2\116\3\u022b\17\116\1\u022b\2\116\3\123"+
+    "\1\u022c\2\123\3\u022c\2\123\1\u022c\1\123\1\375\3\123"+
+    "\1\376\1\123\1\0\1\377\2\123\22\u022c\3\123\1\u022c"+
+    "\2\123\3\u022c\17\123\1\u022c\2\123\3\130\1\u022d\2\130"+
+    "\3\u022d\2\130\1\u022d\1\130\1\u0104\1\132\1\130\1\132"+
+    "\1\u0105\2\130\1\u0106\2\130\22\u022d\3\130\1\u022d\2\130"+
+    "\3\u022d\17\130\1\u022d\2\130\16\0\2\u022e\1\u022f\133\0"+
+    "\1\u0230\34\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\2\36\1\u0231\17\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\6\36\1\u0232\13\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\11\36\1\u0233\10\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\1\u0234\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\u0235"+
+    "\21\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\3\36\1\u0236"+
+    "\16\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\2\36\1\u0237\5\36\12\0"+
+    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\3\36\1\u0238"+
+    "\16\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u0239"+
+    "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\2\36\1\u023a\5\36\12\0"+
+    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\5\36\1\u023b"+
+    "\14\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\14\36\1\u023c"+
+    "\5\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\13\36\1\u023d"+
+    "\6\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\u023e\1\0\10\36\12\0\22\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\14\36\1\u0239\5\36\3\0"+
+    "\1\36\1\0\10\36\12\0\11\36\1\u023f\10\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\13\36\1\u023a\6\36\3\0"+
+    "\1\36\1\0\10\36\12\0\13\36\1\u0240\6\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\u023b\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\1\36\1\0\10\36\12\0\1\u0241\21\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\6\36\1\u0242\13\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
+    "\1\0\10\36\12\0\21\36\1\u0243\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\11\36\1\u023c\10\36\3\0\1\36\2\0"+
+    "\3\36\1\u0244\4\36\12\0\22\36\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\13\36\1\u023d\6\36\3\0\1\36\2\0"+
+    "\10\36\12\0\5\36\1\u0245\14\36\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\1\u023e\21\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\6\36\1\u023f\13\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\21\36\1\u0240\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\3\36\1\u0241"+
-    "\4\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\5\36\1\u0242\14\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\6\36\1\u0243\13\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\15\36\1\u0244\4\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\5\36\1\u0245\14\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\11\36\1\u0246\10\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\1\0"+
-    "\3\u0247\6\0\22\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\13\36\1\u0248\6\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\6\36\1\u0249\13\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\1\36\1\u024a\20\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\6\36\1\u024b\13\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\43\0\1\u024c\102\0\1\u024d\46\0\1\u024e\13\0"+
-    "\1\u024f\36\0\1\u0250\74\0\1\u0251\53\0\1\u0210\36\0"+
-    "\1\u0211\67\0\1\u0252\71\0\1\u0217\103\0\1\u0253\110\0"+
-    "\1\u0254\102\0\1\u0255\66\0\1\u0217\36\0\1\u0256\26\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\1\u0257\21\36"+
+    "\10\36\12\0\6\36\1\u0246\13\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\15\36\1\u0247\4\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\5\36\1\u0248\14\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\11\36\1\u0249\10\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\1\0\3\u024a\6\0\22\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\13\36\1\u024b\6\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\6\36\1\u024c\13\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\1\36\1\u024d\20\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\6\36\1\u024e\13\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\43\0\1\u024f\102\0\1\u0250\46\0"+
+    "\1\u0251\13\0\1\u0252\36\0\1\u0253\74\0\1\u0254\53\0"+
+    "\1\u0212\36\0\1\u0213\67\0\1\u0255\71\0\1\u0219\103\0"+
+    "\1\u0256\110\0\1\u0257\102\0\1\u0258\66\0\1\u0219\36\0"+
+    "\1\u0259\26\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\1\u025a\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+
+    "\3\0\1\36\2\0\1\36\1\u025b\1\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\u025c\1\0\10\36\12\0\22\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\22\36\3\0\1\36"+
-    "\2\0\1\36\1\u0258\1\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\u0259\1\0\10\36\12\0\22\36\3\0\1\36"+
+    "\1\0\1\36\1\0\10\36\12\0\6\36\1\u025d\13\36"+
+    "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
+    "\1\0\1\u025e\1\0\10\36\12\0\22\36\3\0\1\36"+
     "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\6\36\1\u025a\13\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u025b"+
+    "\1\0\10\36\12\0\10\36\1\u025f\11\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\u025f\3\0\1\36\1\0\1\u0260"+
     "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+
     "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\10\36\1\u025c\11\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\u025c\3\0\1\36\1\0\1\u025d\1\0\10\36"+
-    "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\15\36"+
-    "\1\u025e\4\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+
-    "\1\u025f\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\20\0\1\u0221\66\0\1\u0223\1\0\1\u0223\1\0\10\u0223"+
-    "\5\0\1\u0260\4\0\22\u0223\3\0\1\u0223\2\0\3\u0223"+
-    "\17\0\1\u0223\3\0\1\u0224\1\0\1\u0224\1\0\10\u0224"+
-    "\12\0\22\u0224\3\0\1\u0224\2\0\3\u0224\17\0\1\u0224"+
-    "\1\u0261\30\0\1\u0262\114\0\1\u0263\61\0\1\u022b\115\0"+
-    "\1\u0264\54\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\10\36\1\u0265\11\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\u0265\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\13\36\1\u0266\6\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\u0267\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\1\36\1\u0268"+
-    "\20\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\13\36\1\u0269"+
-    "\6\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u026a"+
-    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\2\36\1\u026b\5\36\12\0"+
-    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\u026c\1\0\10\36\12\0\22\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\2\36\1\u026d\17\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\6\36\1\u026e\13\36\3\0"+
+    "\12\0\15\36\1\u0261\4\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\1\36\1\u0262\20\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\20\0\1\u0223\66\0\1\u0225\1\0\1\u0225"+
+    "\1\0\10\u0225\5\0\1\u0263\4\0\22\u0225\3\0\1\u0225"+
+    "\2\0\3\u0225\17\0\1\u0225\3\0\1\u0226\1\0\1\u0226"+
+    "\1\0\10\u0226\12\0\22\u0226\3\0\1\u0226\2\0\3\u0226"+
+    "\17\0\1\u0226\1\u0264\30\0\1\u0265\63\0\1\u0266\134\0"+
+    "\1\u0267\61\0\1\u022e\115\0\1\u0268\54\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\10\36\1\u0269\11\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\u0269\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\13\36\1\u026a\6\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\u026f\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\1\u026b\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\1\36\1\u0270\20\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\u0271\1\0"+
-    "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\12\36\1\u0272\7\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\7\36\1\u0273\12\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\15\36\1\u0274\4\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\2\36\1\u0275"+
-    "\5\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\13\36\1\u0276\6\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\4\36\1\u0277\15\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\u0278\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\20\0"+
-    "\3\u0247\11\0\1\u0279\52\0\1\36\1\0\1\u027a\1\0"+
+    "\10\36\12\0\1\36\1\u026c\20\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\13\36\1\u026d\6\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\6\36\1\u026e\13\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
+    "\2\36\1\u026f\5\36\12\0\22\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\u0270\1\0"+
     "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\1\36\1\u027b\20\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\21\0\1\u024c\36\0\1\u027c\66\0\1\u027d\51\0"+
-    "\1\u027e\113\0\1\u024f\36\0\1\u0250\30\0\1\u027f\103\0"+
-    "\1\u0217\117\0\1\u0253\36\0\1\u0280\55\0\1\u0281\122\0"+
-    "\1\u027d\35\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\1\36\1\u0282\20\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\1\36\1\u0283\1\36\17\0"+
+    "\2\36\1\u0271\17\36\3\0\1\36\2\0\3\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\1\36\1\u0284\1\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\1\36\1\u0285\20\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\10\36\1\u0286\11\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\u0286\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\10\36\1\u0287\11\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\u0287\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\1\36\1\u0288\1\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\7\36\1\u0289\12\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\1\36\1\u028a\1\36\17\0"+
-    "\1\36\20\0\1\u0221\1\0\1\u0222\101\0\1\u028b\1\0"+
-    "\1\u028c\133\0\1\u028d\51\0\3\u028e\101\0\3\u028f\64\0"+
-    "\1\36\1\0\1\36\1\0\2\36\1\u0290\5\36\12\0"+
+    "\6\36\1\u0272\13\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\u0273\1\0\10\36\12\0"+
     "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\2\36\1\u0291\5\36\12\0"+
-    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u0292"+
-    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\u0293\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\1\36\1\u0274"+
+    "\20\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\u0275\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\12\36\1\u0276\7\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\1\36\1\u0294\20\36\3\0"+
+    "\1\36\1\0\10\36\12\0\7\36\1\u0277\12\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\15\36\1\u0278\4\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\2\36\1\u0279\5\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\13\36\1\u027a\6\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\4\36\1\u027b\15\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\u027c\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\20\0\3\u024a\11\0\1\u027d\52\0"+
+    "\1\36\1\0\1\u027e\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\1\36\1\u027f\20\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\21\0\1\u024f\36\0"+
+    "\1\u0280\66\0\1\u0281\51\0\1\u0282\113\0\1\u0252\36\0"+
+    "\1\u0253\30\0\1\u0283\103\0\1\u0219\117\0\1\u0256\36\0"+
+    "\1\u0284\55\0\1\u0285\122\0\1\u0281\35\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\1\36\1\u0286\20\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\1\36\1\u0287\1\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\1\36\1\u0288\1\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\1\36\1\u0289\20\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\6\36\1\u0295\13\36\3\0"+
+    "\1\36\1\0\10\36\12\0\10\36\1\u028a\11\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\u028a\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\10\36\1\u028b\11\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\u028b\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\1\36\1\u028c\1\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\7\36\1\u028d\12\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
     "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
-    "\1\36\1\u0296\1\36\17\0\1\36\3\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\7\36\1\u0297\12\36\3\0"+
+    "\1\36\1\u028e\1\36\17\0\1\36\20\0\1\u0223\1\0"+
+    "\1\u0224\101\0\1\u028f\1\0\1\u0290\133\0\1\u0291\73\0"+
+    "\1\u0292\61\0\3\u0293\101\0\3\u0294\64\0\1\36\1\0"+
+    "\1\36\1\0\2\36\1\u0295\5\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\2\36\1\u0296\5\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\6\36\1\u0297\13\36\3\0"+
     "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
     "\1\u0298\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\5\36\1\u0299\14\36\3\0\1\36\2\0"+
+    "\10\36\12\0\1\36\1\u0299\20\36\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\5\36\1\u029a\14\36\3\0\1\36\2\0"+
+    "\10\36\12\0\6\36\1\u029a\13\36\3\0\1\36\2\0"+
     "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\6\36\1\u029b\13\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\3\0\1\36\1\0\1\u029c\1\0"+
-    "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\36\1\0\1\u029d\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
-    "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+
-    "\1\36\2\0\1\36\1\u029e\1\36\17\0\1\36\42\0"+
-    "\1\u029f\44\0\1\36\1\0\1\u02a0\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\21\0"+
-    "\1\u027d\36\0\1\u02a1\61\0\1\u024f\107\0\1\u0210\62\0"+
-    "\1\u0281\36\0\1\u02a2\26\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u02a3"+
-    "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u02a4"+
+    "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u029b"+
     "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\1\u02a5\21\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\21\36\1\u02a6\3\0\1\36\2\0\3\36\17\0"+
+    "\10\36\12\0\7\36\1\u029c\12\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\3\0\1\36\1\0\1\u029d\1\0"+
+    "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\22\36\3\0\1\36\2\0\1\36\1\u02a7\1\36\17\0"+
+    "\5\36\1\u029e\14\36\3\0\1\36\2\0\3\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\5\36\1\u029f\14\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
+    "\6\36\1\u02a0\13\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\3\0\1\36\1\0\1\u02a1\1\0\10\36\12\0"+
+    "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\u02a2\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
+    "\1\36\1\u02a3\1\36\17\0\1\36\42\0\1\u02a4\44\0"+
+    "\1\36\1\0\1\u02a5\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\21\0\1\u0281\36\0"+
+    "\1\u02a6\61\0\1\u0252\107\0\1\u0212\62\0\1\u0285\36\0"+
+    "\1\u02a7\26\0\1\36\1\0\1\36\1\0\10\36\12\0"+
     "\22\36\3\0\1\36\2\0\1\36\1\u02a8\1\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\2\36\1\u02a9\17\36\3\0\1\36\2\0\3\36\17\0"+
+    "\22\36\3\0\1\36\2\0\1\36\1\u02a9\1\36\17\0"+
     "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+
-    "\6\36\1\u02aa\13\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\20\0\1\u028b\115\0\1\u02ab\56\0\1\u02ac\2\0"+
-    "\3\u02ac\1\0\2\u02ac\2\0\3\u028e\1\u02ad\5\0\22\u02ac"+
-    "\3\0\1\u02ac\2\0\3\u02ac\17\0\1\u02ac\20\0\3\u028f"+
-    "\21\0\1\u02ae\42\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\11\36\1\u02af\10\36\3\0\1\36\2\0\3\36"+
+    "\1\u02aa\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\21\36"+
+    "\1\u02ab\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\1\36\1\u02ac\1\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\1\36\1\u02ad\1\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u02ae"+
+    "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02af"+
+    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\20\0"+
+    "\1\u028f\115\0\1\u02b0\71\0\3\u02b1\66\0\1\u02b2\2\0"+
+    "\3\u02b2\1\0\2\u02b2\2\0\3\u0293\1\u02b3\5\0\22\u02b2"+
+    "\3\0\1\u02b2\2\0\3\u02b2\17\0\1\u02b2\20\0\3\u0294"+
+    "\21\0\1\u02b4\42\0\1\36\1\0\1\36\1\0\10\36"+
+    "\12\0\11\36\1\u02b5\10\36\3\0\1\36\2\0\3\36"+
     "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\6\36\1\u02b0\13\36\3\0\1\36\2\0\3\36"+
+    "\12\0\6\36\1\u02b6\13\36\3\0\1\36\2\0\3\36"+
     "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\15\36\1\u02b1\4\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\u02b2\1\0\10\36"+
+    "\12\0\15\36\1\u02b7\4\36\3\0\1\36\2\0\3\36"+
+    "\17\0\1\36\3\0\1\36\1\0\1\u02b8\1\0\10\36"+
     "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+
-    "\1\u02b3\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\1\u02b9\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\3\36"+
-    "\1\u02b4\16\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\1\u02ba\16\36\3\0\1\36\2\0\3\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+
-    "\1\u02b5\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\1\u02bb\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+
-    "\1\u02b6\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\u02b7\1\0\10\36\12\0\22\36"+
+    "\1\u02bc\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\u02bd\1\0\10\36\12\0\22\36"+
     "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\7\36\1\u02b8\12\36"+
-    "\3\0\1\36\2\0\3\36\17\0\1\36\40\0\1\u02b9"+
+    "\1\0\1\36\1\0\10\36\12\0\7\36\1\u02be\12\36"+
+    "\3\0\1\36\2\0\3\36\17\0\1\36\40\0\1\u02bf"+
     "\46\0\1\36\1\0\1\36\1\0\10\36\12\0\2\36"+
-    "\1\u02ba\17\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\1\u02c0\17\36\3\0\1\36\2\0\3\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+
-    "\3\0\1\36\2\0\1\36\1\u02bb\1\36\17\0\1\36"+
+    "\3\0\1\36\2\0\1\36\1\u02c1\1\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+
-    "\1\u02bc\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\3\0\1\36\1\0\1\36\1\0\2\36\1\u02bd\5\36"+
+    "\1\u02c2\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\3\0\1\36\1\0\1\36\1\0\2\36\1\u02c3\5\36"+
     "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+
-    "\3\0\1\36\2\0\1\36\1\u02be\1\36\17\0\1\36"+
+    "\3\0\1\36\2\0\1\36\1\u02c4\1\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+
-    "\3\0\1\36\2\0\1\36\1\u02bf\1\36\17\0\1\36"+
+    "\3\0\1\36\2\0\1\36\1\u02c5\1\36\17\0\1\36"+
     "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+
-    "\1\u02c0\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
-    "\20\0\3\u02ab\31\0\1\360\32\0\1\u02ac\1\0\1\u02ac"+
-    "\1\0\10\u02ac\1\0\3\u02c1\6\0\22\u02ac\3\0\1\u02ac"+
-    "\2\0\3\u02ac\12\0\1\u02c2\4\0\1\u02ac\5\0\1\u02ac"+
-    "\2\0\3\u02ac\1\0\2\u02ac\13\0\22\u02ac\3\0\1\u02ac"+
-    "\2\0\3\u02ac\17\0\1\u02ac\11\0\1\u02c3\75\0\1\36"+
-    "\1\0\1\u02c4\1\0\10\36\12\0\22\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\15\36\1\u02c5\4\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\5\36\1\u02c6\14\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\3\36\1\u02c7\16\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\10\36\1\u02c8\11\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\u02c8\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\5\36\1\u02c9\14\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\45\0\1\u02ca\41\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\5\36\1\u02cb\14\36"+
-    "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\6\36\1\u02cc\13\36"+
-    "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\22\36\3\0\1\36"+
-    "\2\0\1\36\1\u02cd\1\36\17\0\1\36\3\0\1\36"+
-    "\1\0\1\36\1\0\10\36\12\0\14\36\1\u02ce\5\36"+
-    "\3\0\1\36\2\0\3\36\17\0\1\36\5\0\1\u02cf"+
-    "\2\0\3\u02cf\1\0\2\u02cf\1\0\1\u02d0\3\u02c1\6\0"+
-    "\22\u02cf\3\0\1\u02cf\2\0\3\u02cf\17\0\1\u02cf\5\0"+
-    "\1\u02d1\2\0\3\u02d1\1\0\2\u02d1\6\0\1\u02c2\4\0"+
-    "\22\u02d1\3\0\1\u02d1\2\0\3\u02d1\13\0\1\u02d2\3\0"+
-    "\1\u02d1\1\u02c2\35\0\1\u02d3\50\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\6\36\1\u02d4\13\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\6\36\1\u02d5\13\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+
-    "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\1\36"+
-    "\1\u02d6\1\36\17\0\1\36\3\0\1\36\1\0\1\u02d7"+
-    "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+
-    "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\21\36\1\u02d8\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\3\0\1\u02cf\1\0\1\u02cf\1\0\10\u02cf\1\u02d0"+
-    "\3\u02d9\6\0\22\u02cf\3\0\1\u02cf\2\0\3\u02cf\2\0"+
-    "\1\u02da\3\0\1\u02db\3\0\1\u02dc\4\0\1\u02cf\5\0"+
-    "\1\u02cf\2\0\3\u02cf\1\0\2\u02cf\13\0\22\u02cf\3\0"+
-    "\1\u02cf\2\0\3\u02cf\17\0\1\u02cf\3\0\1\u02d1\1\0"+
-    "\1\u02d1\1\0\10\u02d1\5\0\1\u02c2\4\0\22\u02d1\3\0"+
-    "\1\u02d1\2\0\3\u02d1\13\0\1\u02d2\3\0\1\u02d1\1\u02c2"+
-    "\17\0\3\u02c1\53\0\1\u02c2\56\0\1\u02dd\35\0\1\36"+
-    "\1\0\1\u02de\1\0\10\36\12\0\22\36\3\0\1\36"+
-    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u02df"+
+    "\1\u02c6\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+
+    "\20\0\3\u02b0\31\0\1\360\34\0\1\u02c7\2\0\3\u02c7"+
+    "\1\0\2\u02c7\1\0\1\u02c8\3\u02b1\6\0\22\u02c7\3\0"+
+    "\1\u02c7\2\0\3\u02c7\17\0\1\u02c7\3\0\1\u02b2\1\0"+
+    "\1\u02b2\1\0\10\u02b2\1\0\3\u02c9\6\0\22\u02b2\3\0"+
+    "\1\u02b2\2\0\3\u02b2\12\0\1\u02ca\4\0\1\u02b2\5\0"+
+    "\1\u02b2\2\0\3\u02b2\1\0\2\u02b2\13\0\22\u02b2\3\0"+
+    "\1\u02b2\2\0\3\u02b2\17\0\1\u02b2\11\0\1\u02cb\75\0"+
+    "\1\36\1\0\1\u02cc\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\15\36\1\u02cd\4\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\5\36\1\u02ce\14\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\3\36\1\u02cf\16\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\10\36\1\u02d0\11\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\u02d0\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\5\36\1\u02d1\14\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\45\0\1\u02d2\41\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\5\36\1\u02d3"+
+    "\14\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02d4"+
+    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\1\36\1\u02d5\1\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\14\36\1\u02d6"+
+    "\5\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\u02c7\1\0\1\u02c7\1\0\10\u02c7\1\u02c8\3\u02d7\6\0"+
+    "\22\u02c7\3\0\1\u02c7\2\0\3\u02c7\6\0\1\u02d8\3\0"+
+    "\1\u02d9\4\0\1\u02c7\5\0\1\u02c7\2\0\3\u02c7\1\0"+
+    "\2\u02c7\13\0\22\u02c7\3\0\1\u02c7\2\0\3\u02c7\17\0"+
+    "\1\u02c7\5\0\1\u02da\2\0\3\u02da\1\0\2\u02da\1\0"+
+    "\1\u02db\3\u02c9\6\0\22\u02da\3\0\1\u02da\2\0\3\u02da"+
+    "\17\0\1\u02da\5\0\1\u02dc\2\0\3\u02dc\1\0\2\u02dc"+
+    "\6\0\1\u02ca\4\0\22\u02dc\3\0\1\u02dc\2\0\3\u02dc"+
+    "\13\0\1\u02dd\3\0\1\u02dc\1\u02ca\35\0\1\u02de\50\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02df"+
+    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02e0"+
+    "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\1\36\1\u02e1\1\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\u02e2\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+
+    "\1\36\1\0\10\36\12\0\21\36\1\u02e3\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\20\0\3\u02d7\1\u02e4\65\0"+
+    "\1\u02c7\2\0\3\u02c7\1\0\2\u02c7\1\0\1\u02c8\11\0"+
+    "\22\u02c7\3\0\1\u02c7\2\0\3\u02c7\17\0\1\u02c7\77\0"+
+    "\1\u02e5\7\0\1\u02da\1\0\1\u02da\1\0\10\u02da\1\u02db"+
+    "\3\u02e6\6\0\22\u02da\3\0\1\u02da\2\0\3\u02da\2\0"+
+    "\1\u02e7\3\0\1\u02e8\3\0\1\u02e9\4\0\1\u02da\5\0"+
+    "\1\u02da\2\0\3\u02da\1\0\2\u02da\13\0\22\u02da\3\0"+
+    "\1\u02da\2\0\3\u02da\17\0\1\u02da\3\0\1\u02dc\1\0"+
+    "\1\u02dc\1\0\10\u02dc\5\0\1\u02ca\4\0\22\u02dc\3\0"+
+    "\1\u02dc\2\0\3\u02dc\13\0\1\u02dd\3\0\1\u02dc\1\u02ca"+
+    "\17\0\3\u02c9\53\0\1\u02ca\56\0\1\u02ea\35\0\1\36"+
+    "\1\0\1\u02eb\1\0\10\36\12\0\22\36\3\0\1\36"+
+    "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u02ec"+
     "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+
     "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02e0\1\36"+
+    "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02ed\1\36"+
     "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02e1\1\36"+
+    "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02ee\1\36"+
     "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+
-    "\12\0\1\u02e2\21\36\3\0\1\36\2\0\3\36\17\0"+
-    "\1\36\20\0\3\u02d9\43\0\1\u02da\104\0\1\u02e3\21\0"+
-    "\1\u02cf\2\0\3\u02cf\1\0\2\u02cf\1\0\1\u02d0\11\0"+
-    "\22\u02cf\3\0\1\u02cf\2\0\3\u02cf\17\0\1\u02cf\77\0"+
-    "\1\u02e4\41\0\1\u02e5\51\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u02e6"+
-    "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+
-    "\10\36\12\0\13\36\1\u02e7\6\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\20\0\3\u02d9\43\0\1\u02da\3\0"+
-    "\1\u02db\3\0\1\u02dc\16\0\1\u02e8\75\0\1\36\1\0"+
-    "\1\u02e9\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+
-    "\3\36\17\0\1\36\51\0\1\u02ea\35\0\1\36\1\0"+
-    "\1\36\1\0\10\36\12\0\11\36\1\u02eb\10\36\3\0"+
-    "\1\36\2\0\3\36\17\0\1\36\5\0\1\u02ec\101\0"+
+    "\12\0\1\u02ef\21\36\3\0\1\36\2\0\3\36\17\0"+
+    "\1\36\5\0\1\u02f0\2\0\3\u02f0\1\0\2\u02f0\13\0"+
+    "\22\u02f0\3\0\1\u02f0\2\0\3\u02f0\17\0\1\u02f0\20\0"+
+    "\3\u02d7\47\0\1\u02d8\3\0\1\u02d9\25\0\3\u02e6\43\0"+
+    "\1\u02e7\104\0\1\u02f1\21\0\1\u02da\2\0\3\u02da\1\0"+
+    "\2\u02da\1\0\1\u02db\11\0\22\u02da\3\0\1\u02da\2\0"+
+    "\3\u02da\17\0\1\u02da\77\0\1\u02f2\41\0\1\u02f3\51\0"+
     "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+
-    "\1\36\1\u02ed\1\0\3\36\17\0\1\36\20\0\3\u02ec"+
-    "\5\0\1\u02ee\133\0\1\u02ef\43\0\3\u02ee\1\0\1\u02f0"+
-    "\25\0\1\u02f1\31\0\1\u02f2\26\0\1\u02f3\126\0\1\u02f4"+
-    "\77\0\1\u02f5\107\0\1\u02f6\77\0\1\u02f7\107\0\1\u02f8"+
-    "\77\0\1\u02f9\107\0\1\u02fa\51\0\3\u02f8\31\0\1\u02fb"+
-    "\101\0\1\u02fc\55\0\1\u02f8\163\0\1\u02f8\1\0";
+    "\1\36\2\0\1\36\1\u02f4\1\36\17\0\1\36\3\0"+
+    "\1\36\1\0\1\36\1\0\10\36\12\0\13\36\1\u02f5"+
+    "\6\36\3\0\1\36\2\0\3\36\17\0\1\36\2\0"+
+    "\1\u02f6\1\u02f0\1\u02f6\1\u02f0\1\u02f6\10\u02f0\1\u02f6\3\u02f7"+
+    "\6\u02f6\22\u02f0\3\u02f6\1\u02f0\2\u02f6\3\u02f0\2\u02f6\1\u02f8"+
+    "\7\u02f6\1\u02f9\4\u02f6\1\u02f0\2\u02f6\16\0\3\u02e6\43\0"+
+    "\1\u02e7\3\0\1\u02e8\3\0\1\u02e9\16\0\1\u02fa\75\0"+
+    "\1\36\1\0\1\u02fb\1\0\10\36\12\0\22\36\3\0"+
+    "\1\36\2\0\3\36\17\0\1\36\2\0\16\u02f6\1\0"+
+    "\1\u02f6\1\0\43\u02f6\1\u02f8\35\u02f6\3\u02f7\43\u02f6\1\u02f8"+
+    "\35\u02f6\1\0\1\u02f6\1\0\43\u02f6\1\u02f8\1\u02fc\21\u02f6"+
+    "\1\u02fd\2\u02f6\3\u02fd\1\u02f6\2\u02fd\2\u02f6\1\0\1\u02f6"+
+    "\1\0\1\u02f6\1\u02f9\4\u02f6\22\u02fd\3\u02f6\1\u02fd\2\u02f6"+
+    "\3\u02fd\2\u02f6\1\u02f8\10\u02f6\1\u02fe\3\u02f6\1\u02fd\1\u02f9"+
+    "\1\u02f6\47\0\1\u02ff\35\0\1\36\1\0\1\36\1\0"+
+    "\10\36\12\0\11\36\1\u0300\10\36\3\0\1\36\2\0"+
+    "\3\36\17\0\1\36\2\0\1\u02f6\1\u02fd\1\u02f6\1\u02fd"+
+    "\1\u02f6\10\u02fd\1\u02f6\1\0\1\u02f6\1\0\1\u02f6\1\u02f9"+
+    "\4\u02f6\22\u02fd\3\u02f6\1\u02fd\2\u02f6\3\u02fd\2\u02f6\1\u02f8"+
+    "\10\u02f6\1\u02fe\3\u02f6\1\u02fd\1\u02f9\17\u02f6\3\u02f7\43\u02f6"+
+    "\1\u02f8\7\u02f6\1\u02f9\7\u02f6\3\0\1\u0301\101\0\1\36"+
+    "\1\0\1\36\1\0\10\36\12\0\22\36\3\0\1\36"+
+    "\1\u0302\1\0\3\36\17\0\1\36\20\0\3\u0301\5\0"+
+    "\1\u0303\133\0\1\u0304\43\0\3\u0303\1\0\1\u0305\25\0"+
+    "\1\u0306\31\0\1\u0307\26\0\1\u0308\126\0\1\u0309\77\0"+
+    "\1\u030a\107\0\1\u030b\77\0\1\u030c\107\0\1\u030d\77\0"+
+    "\1\u030e\107\0\1\u030f\51\0\3\u030d\31\0\1\u0310\101\0"+
+    "\1\u0311\55\0\1\u030d\163\0\1\u030d\1\0";
 
   private static int [] zzUnpackTrans() {
-    int [] result = new int[38080];
+    int [] result = new int[39440];
     int offset = 0;
     offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
     return result;
@@ -1280,18 +1309,18 @@ private static int zzUnpackTrans(String packed, int offset, int [] result) {
     "\1\1\12\0\10\1\3\11\2\0\1\11\1\0\1\1"+
     "\1\0\1\11\1\1\1\11\1\1\1\0\1\11\4\1"+
     "\1\11\5\1\1\11\1\0\1\1\1\0\2\1\1\11"+
-    "\2\0\60\1\12\0\11\1\4\0\1\11\2\0\3\1"+
+    "\2\0\60\1\12\0\11\1\5\0\1\11\3\0\3\1"+
     "\2\0\54\1\5\0\1\11\6\0\11\1\1\11\1\1"+
-    "\4\0\1\11\3\1\1\11\1\1\1\0\31\1\1\0"+
-    "\4\1\4\0\1\11\5\0\1\11\11\1\5\0\24\1"+
+    "\5\0\1\11\3\1\1\11\1\1\1\0\31\1\1\0"+
+    "\4\1\4\0\1\11\5\0\1\11\11\1\6\0\24\1"+
     "\1\0\2\1\1\11\3\0\1\11\1\0\11\1\1\11"+
-    "\1\1\3\0\17\1\1\0\1\1\2\11\10\1\4\0"+
-    "\12\1\1\0\7\1\3\0\6\1\1\11\4\1\5\0"+
-    "\5\1\5\0\5\1\1\11\2\0\2\1\1\0\1\1"+
-    "\1\0\1\1\7\0\1\11\7\0\1\11\1\0";
+    "\1\1\4\0\17\1\1\0\1\1\2\11\10\1\5\0"+
+    "\12\1\1\0\7\1\5\0\6\1\1\11\4\1\10\0"+
+    "\5\1\7\0\5\1\1\0\1\11\2\0\2\1\5\0"+
+    "\2\1\3\0\1\1\7\0\1\11\7\0\1\11\1\0";
 
   private static int [] zzUnpackAttribute() {
-    int [] result = new int[764];
+    int [] result = new int[785];
     int offset = 0;
     offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
     return result;
@@ -1904,10 +1933,15 @@ else if (zzAtEOF) {
       zzMarkedPos = zzMarkedPosL;
 
       switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+        case 205:
+          { comment = yytext();
+    handleVarComment();
+          }
+        case 207: break;
         case 188:
           { return createFullSymbol(ASTPHP5Symbols.T_INTERFACE);
           }
-        case 206: break;
+        case 208: break;
         case 153:
           { int removeChars = (yytext().charAt(0) == 'b')?4:3;
     heredoc = yytext().substring(removeChars).trim();    // for 'b<<<' or '<<<'
@@ -1917,51 +1951,51 @@ else if (zzAtEOF) {
     yybegin(ST_START_HEREDOC);
     return createSymbol(ASTPHP5Symbols.T_START_HEREDOC);
           }
-        case 207: break;
+        case 209: break;
         case 27:
           { return createSymbol(ASTPHP5Symbols.T_OR);
           }
-        case 208: break;
+        case 210: break;
         case 151:
           { return createFullSymbol(ASTPHP5Symbols.T_PRINT);
           }
-        case 209: break;
+        case 211: break;
         case 175:
           { return createSymbol(ASTPHP5Symbols.T_UNSET_CAST);
           }
-        case 210: break;
+        case 212: break;
         case 36:
           { handleCommentStart();
 	yybegin(ST_ONE_LINE_COMMENT);
 //	yymore();
           }
-        case 211: break;
+        case 213: break;
         case 2:
           { return createSymbol(ASTPHP5Symbols.T_INLINE_HTML);
           }
-        case 212: break;
+        case 214: break;
         case 22:
           { return createSymbol(ASTPHP5Symbols.T_RGREATER);
           }
-        case 213: break;
+        case 215: break;
         case 125:
           { yypushback(1);
 	pushState(ST_VAR_OFFSET);
 	return createFullSymbol(ASTPHP5Symbols.T_VARIABLE);
           }
-        case 214: break;
+        case 216: break;
         case 162:
           { return createFullSymbol(ASTPHP5Symbols.T_GLOBAL);
           }
-        case 215: break;
+        case 217: break;
         case 57:
           { //	yymore();
           }
-        case 216: break;
+        case 218: break;
         case 23:
           { return createSymbol(ASTPHP5Symbols.T_TIMES);
           }
-        case 217: break;
+        case 219: break;
         case 108:
           { String text = yytext();
     if ((text.charAt(1)=='%' && asp_tags)
@@ -1972,30 +2006,30 @@ else if (zzAtEOF) {
         return createSymbol(ASTPHP5Symbols.T_INLINE_HTML);
     }
           }
-        case 218: break;
+        case 220: break;
         case 74:
           { return createSymbol(ASTPHP5Symbols.T_MINUS_EQUAL);
           }
-        case 219: break;
+        case 221: break;
         case 92:
           { return createSymbol(ASTPHP5Symbols.T_BOOLEAN_OR);
           }
-        case 220: break;
+        case 222: break;
         case 13:
           { pushState(ST_IN_SCRIPTING);
     bracket++;
     return createSymbol(ASTPHP5Symbols.T_CURLY_OPEN);
           }
-        case 221: break;
+        case 223: break;
         case 41:
           { yypushback(1);
 	yybegin(ST_HEREDOC);
           }
-        case 222: break;
+        case 224: break;
         case 20:
           { return createSymbol(ASTPHP5Symbols.T_CLOSE_PARENTHESE);
           }
-        case 223: break;
+        case 225: break;
         case 101:
           { String text = yytext();
     int length = text.length() - 1;
@@ -2015,58 +2049,58 @@ else if (zzAtEOF) {
     	   yybegin(ST_HEREDOC);
     }
           }
-        case 224: break;
+        case 226: break;
         case 45:
           { yypushback(yylength());
     popState();
           }
-        case 225: break;
+        case 227: break;
         case 21:
           { return createSymbol(ASTPHP5Symbols.T_NOT);
           }
-        case 226: break;
+        case 228: break;
         case 154:
           { yypushback(3);
 	pushState(ST_LOOKING_FOR_PROPERTY);
 	return createFullSymbol(ASTPHP5Symbols.T_VARIABLE);
           }
-        case 227: break;
+        case 229: break;
         case 29:
           { return createSymbol(ASTPHP5Symbols.T_QUESTION_MARK);
           }
-        case 228: break;
+        case 230: break;
         case 119:
           { return createFullSymbol(ASTPHP5Symbols.T_VAR);
           }
-        case 229: break;
+        case 231: break;
         case 202:
           { return createFullSymbol(ASTPHP5Symbols.T_FUNC_C);
           }
-        case 230: break;
+        case 232: break;
         case 141:
           { return createFullSymbol(ASTPHP5Symbols.T_TRAIT);
           }
-        case 231: break;
+        case 233: break;
         case 159:
           { return createFullSymbol(ASTPHP5Symbols.T_STATIC);
           }
-        case 232: break;
+        case 234: break;
         case 131:
           { return createFullSymbol(ASTPHP5Symbols.T_EVAL);
           }
-        case 233: break;
+        case 235: break;
         case 161:
           { return createFullSymbol(ASTPHP5Symbols.T_RETURN);
           }
-        case 234: break;
+        case 236: break;
         case 144:
           { return createFullSymbol(ASTPHP5Symbols.T_UNSET);
           }
-        case 235: break;
+        case 237: break;
         case 85:
           { return createSymbol(ASTPHP5Symbols.T_DIV_EQUAL);
           }
-        case 236: break;
+        case 238: break;
         case 126:
           { String text = yytext();
 
@@ -2091,44 +2125,44 @@ else if (zzAtEOF) {
 	}
 	yypushback(1);
           }
-        case 237: break;
+        case 239: break;
         case 46:
           { popState();
     return createFullSymbol(ASTPHP5Symbols.T_STRING);
           }
-        case 238: break;
+        case 240: break;
         case 199:
           { return createFullSymbol(ASTPHP5Symbols.T_METHOD_C);
           }
-        case 239: break;
+        case 241: break;
         case 195:
           { return createFullSymbol(ASTPHP5Symbols.T_ENDFOREACH);
           }
-        case 240: break;
+        case 242: break;
         case 170:
           { return createFullSymbol(ASTPHP5Symbols.T_FINALLY);
           }
-        case 241: break;
+        case 243: break;
         case 81:
           { return createSymbol(ASTPHP5Symbols.T_IS_SMALLER_OR_EQUAL);
           }
-        case 242: break;
+        case 244: break;
         case 68:
           { return createFullSymbol(ASTPHP5Symbols.T_CONSTANT_ENCAPSED_STRING);
           }
-        case 243: break;
+        case 245: break;
         case 111:
           { return createFullSymbol(ASTPHP5Symbols.T_LOGICAL_AND);
           }
-        case 244: break;
+        case 246: break;
         case 146:
           { return createFullSymbol(ASTPHP5Symbols.T_CONST);
           }
-        case 245: break;
+        case 247: break;
         case 134:
           { return createFullSymbol(ASTPHP5Symbols.T_GOTO);
           }
-        case 246: break;
+        case 248: break;
         case 102:
           { String text = yytext();
     int length = text.length() - 1;
@@ -2148,36 +2182,36 @@ else if (zzAtEOF) {
         yybegin(ST_NOWDOC);
     }
           }
-        case 247: break;
+        case 249: break;
         case 114:
           { return createFullSymbol(ASTPHP5Symbols.T_EXIT);
           }
-        case 248: break;
+        case 250: break;
         case 38:
           { yybegin(ST_IN_SCRIPTING);
     return createSymbol(ASTPHP5Symbols.T_QUATE);
           }
-        case 249: break;
+        case 251: break;
         case 181:
           { return createFullSymbol(ASTPHP5Symbols.T_CALLABLE);
           }
-        case 250: break;
+        case 252: break;
         case 120:
           { return createSymbol(ASTPHP5Symbols.T_IS_NOT_IDENTICAL);
           }
-        case 251: break;
+        case 253: break;
         case 44:
           { nowdoc=null;
     nowdoc_len=0;
     yybegin(ST_IN_SCRIPTING);
     return createSymbol(ASTPHP5Symbols.T_END_NOWDOC);
           }
-        case 252: break;
+        case 254: break;
         case 158:
           { /* not a keyword, hust for recognize constans.*/
     return createFullSymbol(ASTPHP5Symbols.T_DEFINE);
           }
-        case 253: break;
+        case 255: break;
         case 58:
           { String yytext = yytext();
 	switch (yytext.charAt(yytext.length() - 1)) {
@@ -2192,214 +2226,214 @@ else if (zzAtEOF) {
 	}
 //	yymore();
           }
-        case 254: break;
+        case 256: break;
         case 91:
           { return createSymbol(ASTPHP5Symbols.T_OR_EQUAL);
           }
-        case 255: break;
+        case 257: break;
         case 139:
           { return createFullSymbol(ASTPHP5Symbols.T_BREAK);
           }
-        case 256: break;
-        case 205:
+        case 258: break;
+        case 206:
           { yybegin(ST_HALTED_COMPILER);
 	return createSymbol(ASTPHP5Symbols.T_HALT_COMPILER);
           }
-        case 257: break;
+        case 259: break;
         case 59:
           { yybegin(ST_IN_SCRIPTING);
     return createSymbol(ASTPHP5Symbols.T_ECHO);
           }
-        case 258: break;
+        case 260: break;
         case 160:
           { return createFullSymbol(ASTPHP5Symbols.T_SWITCH);
           }
-        case 259: break;
+        case 261: break;
         case 54:
           { popState();
 	return createSymbol(ASTPHP5Symbols.T_CLOSE_RECT);
           }
-        case 260: break;
+        case 262: break;
         case 33:
           { return createSymbol(ASTPHP5Symbols.T_TILDA);
           }
-        case 261: break;
+        case 263: break;
         case 71:
           { return createFullSymbol(ASTPHP5Symbols.T_IF);
           }
-        case 262: break;
+        case 264: break;
         case 172:
           { return createFullSymbol(ASTPHP5Symbols.T_REQUIRE);
           }
-        case 263: break;
+        case 265: break;
         case 18:
           { return createSymbol(ASTPHP5Symbols.T_NEKUDOTAIM);
           }
-        case 264: break;
+        case 266: break;
         case 26:
           { return createSymbol(ASTPHP5Symbols.T_REFERENCE);
           }
-        case 265: break;
+        case 267: break;
         case 86:
           { handleCommentStart();
     yybegin(ST_COMMENT);
           }
-        case 266: break;
+        case 268: break;
         case 42:
           { heredoc = null;
 	yybegin(ST_IN_SCRIPTING);
 	return createSymbol(ASTPHP5Symbols.T_END_HEREDOC);
           }
-        case 267: break;
+        case 269: break;
         case 190:
           { return createFullSymbol(ASTPHP5Symbols.T_NAMESPACE);
           }
-        case 268: break;
+        case 270: break;
         case 197:
           { return createFullSymbol(ASTPHP5Symbols.T_IMPLEMENTS);
           }
-        case 269: break;
+        case 271: break;
         case 149:
           { return createFullSymbol(ASTPHP5Symbols.T_YIELD);
           }
-        case 270: break;
+        case 272: break;
         case 16:
           { return createSymbol(ASTPHP5Symbols.T_MINUS);
           }
-        case 271: break;
+        case 273: break;
         case 193:
           { return createFullSymbol(ASTPHP5Symbols.T_CLASS_C);
           }
-        case 272: break;
+        case 274: break;
         case 106:
           { handlePHPDocEnd();
      yybegin(ST_IN_SCRIPTING);
           }
-        case 273: break;
+        case 275: break;
         case 204:
           { return createFullSymbol(ASTPHP5Symbols.T_NS_C);
           }
-        case 274: break;
+        case 276: break;
         case 152:
           { return createSymbol(ASTPHP5Symbols.T_INT_CAST);
           }
-        case 275: break;
+        case 277: break;
         case 157:
           { return createFullSymbol(ASTPHP5Symbols.T_ELSEIF);
           }
-        case 276: break;
+        case 278: break;
         case 95:
           { return createSymbol(ASTPHP5Symbols.T_COALESCE);
           }
-        case 277: break;
+        case 279: break;
         case 194:
           { return createFullSymbol(ASTPHP5Symbols.T_ENDDECLARE);
           }
-        case 278: break;
+        case 280: break;
         case 75:
           { return createSymbol(ASTPHP5Symbols.T_DEC);
           }
-        case 279: break;
+        case 281: break;
         case 96:
           { yypushback(1);
     /*<ST_DOUBLE_QUOTES>{DOUBLE_QUOTES_CHARS}*("{""{"+|"$""$"+|(("{"+|"$"+)[\"]))*/
     return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 280: break;
+        case 282: break;
         case 179:
           { return createFullSymbol(ASTPHP5Symbols.T_ABSTRACT);
           }
-        case 281: break;
+        case 283: break;
         case 130:
           { return createFullSymbol(ASTPHP5Symbols.T_ELSE);
           }
-        case 282: break;
+        case 284: break;
         case 189:
           { return createFullSymbol(ASTPHP5Symbols.T_INSTEADOF);
           }
-        case 283: break;
+        case 285: break;
         case 76:
           { pushState(ST_LOOKING_FOR_PROPERTY);
     return createSymbol(ASTPHP5Symbols.T_OBJECT_OPERATOR);
           }
-        case 284: break;
+        case 286: break;
         case 14:
           { return createSymbol(ASTPHP5Symbols.T_SEMICOLON);
           }
-        case 285: break;
+        case 287: break;
         case 3:
           { // do nothing
           }
-        case 286: break;
+        case 288: break;
         case 48:
           { popState();
     pushState(ST_IN_SCRIPTING);
     return createFullSymbol(ASTPHP5Symbols.T_STRING_VARNAME);
           }
-        case 287: break;
+        case 289: break;
         case 17:
           { return createSymbol(ASTPHP5Symbols.T_LGREATER);
           }
-        case 288: break;
+        case 290: break;
         case 133:
           { return createFullSymbol(ASTPHP5Symbols.T_LIST);
           }
-        case 289: break;
+        case 291: break;
         case 105:
           { handleMultilineCommentEnd();
     yybegin(ST_IN_SCRIPTING);
           }
-        case 290: break;
+        case 292: break;
         case 156:
           { return createFullSymbol(ASTPHP5Symbols.T_ENDFOR);
           }
-        case 291: break;
+        case 293: break;
         case 4:
           { return createFullSymbol(ASTPHP5Symbols.T_LNUMBER);
           }
-        case 292: break;
+        case 294: break;
         case 99:
           { yypushback(1);
         /*<ST_BACKQUOTE>{BACKQUOTE_CHARS}*("{""{"+|"$""$"+|(("{"+|"$"+)[`]))*/
 	return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 293: break;
+        case 295: break;
         case 135:
           { handleCommentStart();
           }
-        case 294: break;
+        case 296: break;
         case 138:
           { return createFullSymbol(ASTPHP5Symbols.T_ARRAY);
           }
-        case 295: break;
+        case 297: break;
         case 129:
           { return createFullSymbol(ASTPHP5Symbols.T_ECHO);
           }
-        case 296: break;
+        case 298: break;
         case 49:
           { return createFullSymbol(ASTPHP5Symbols.T_NUM_STRING);
           }
-        case 297: break;
+        case 299: break;
         case 89:
           { return createSymbol(ASTPHP5Symbols.T_AND_EQUAL);
           }
-        case 298: break;
+        case 300: break;
         case 53:
           { bracket++; return createSymbol(ASTPHP5Symbols.T_CURLY_OPEN);
           }
-        case 299: break;
+        case 301: break;
         case 142:
           { return createFullSymbol(ASTPHP5Symbols.T_THROW);
           }
-        case 300: break;
+        case 302: break;
         case 150:
           { return createFullSymbol(ASTPHP5Symbols.T_WHILE);
           }
-        case 301: break;
+        case 303: break;
         case 187:
           { return createFullSymbol(ASTPHP5Symbols.T_ENDSWITCH);
           }
-        case 302: break;
+        case 304: break;
         case 60:
           { if (asp_tags) {
         yybegin(ST_IN_SCRIPTING);
@@ -2409,44 +2443,44 @@ else if (zzAtEOF) {
         return createSymbol(ASTPHP5Symbols.T_INLINE_HTML);
     }
           }
-        case 303: break;
+        case 305: break;
         case 174:
           { return createSymbol(ASTPHP5Symbols.T_ARRAY_CAST);
           }
-        case 304: break;
+        case 306: break;
         case 98:
           { pushState(ST_IN_SCRIPTING);
     yypushback(yylength()-1);
     bracket++;
     return createSymbol(ASTPHP5Symbols.T_CURLY_OPEN_WITH_DOLAR);
           }
-        case 305: break;
+        case 307: break;
         case 168:
           { return createFullSymbol(ASTPHP5Symbols.T_DEFAULT);
           }
-        case 306: break;
+        case 308: break;
         case 165:
           { return createSymbol(ASTPHP5Symbols.T_DOUBLE_CAST);
           }
-        case 307: break;
+        case 309: break;
         case 12:
           { yybegin(ST_BACKQUOTE);
     return createSymbol(ASTPHP5Symbols.T_BACKQUATE);
           }
-        case 308: break;
+        case 310: break;
         case 31:
           { return createSymbol(ASTPHP5Symbols.T_OPEN_RECT);
           }
-        case 309: break;
+        case 311: break;
         case 145:
           { return createFullSymbol(ASTPHP5Symbols.T_CATCH);
           }
-        case 310: break;
+        case 312: break;
         case 97:
           { pushState(ST_LOOKING_FOR_VARNAME);
     return createSymbol(ASTPHP5Symbols.T_DOLLAR_OPEN_CURLY_BRACES);
           }
-        case 311: break;
+        case 313: break;
         case 35:
           { /* This is a temporary fix which is dependant on flex and it's implementation */
     if (!stack.isEmpty()) {
@@ -2455,85 +2489,85 @@ else if (zzAtEOF) {
     bracket--;
     return createSymbol(ASTPHP5Symbols.T_CURLY_CLOSE);
           }
-        case 312: break;
+        case 314: break;
         case 87:
           { return createSymbol(ASTPHP5Symbols.T_MOD_EQUAL);
           }
-        case 313: break;
+        case 315: break;
         case 24:
           { return createSymbol(ASTPHP5Symbols.T_DIV);
           }
-        case 314: break;
+        case 316: break;
         case 32:
           { return createSymbol(ASTPHP5Symbols.T_CLOSE_RECT);
           }
-        case 315: break;
+        case 317: break;
         case 121:
           { return createSymbol(ASTPHP5Symbols.T_SPACESHIP);
           }
-        case 316: break;
+        case 318: break;
         case 7:
           { return createSymbol(ASTPHP5Symbols.T_PLUS);
           }
-        case 317: break;
+        case 319: break;
         case 147:
           { return createFullSymbol(ASTPHP5Symbols.T_CLASS);
           }
-        case 318: break;
+        case 320: break;
         case 115:
           { return createFullSymbol(ASTPHP5Symbols.T_FOR);
           }
-        case 319: break;
+        case 321: break;
         case 77:
           { return createSymbol(ASTPHP5Symbols.T_IS_GREATER_OR_EQUAL);
           }
-        case 320: break;
+        case 322: break;
         case 72:
           { return createFullSymbol(ASTPHP5Symbols.T_DO);
           }
-        case 321: break;
+        case 323: break;
         case 39:
           { /*<ST_BACKQUOTE>{BACKQUOTE_CHARS}+*/
 	return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 322: break;
+        case 324: break;
         case 37:
           { /*<ST_DOUBLE_QUOTES>{DOUBLE_QUOTES_CHARS}+*/
 	return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 323: break;
+        case 325: break;
         case 90:
           { return createSymbol(ASTPHP5Symbols.T_BOOLEAN_AND);
           }
-        case 324: break;
+        case 326: break;
         case 6:
           { return createFullSymbol(ASTPHP5Symbols.T_STRING);
           }
-        case 325: break;
+        case 327: break;
         case 167:
           { return createFullSymbol(ASTPHP5Symbols.T_INCLUDE);
           }
-        case 326: break;
+        case 328: break;
         case 5:
           { return createSymbol(ASTPHP5Symbols.T_NEKUDA);
           }
-        case 327: break;
+        case 329: break;
         case 136:
           { return createFullSymbol(ASTPHP5Symbols.T_ENDIF);
           }
-        case 328: break;
+        case 330: break;
         case 117:
           { return createFullSymbol(ASTPHP5Symbols.T_NEW);
           }
-        case 329: break;
+        case 331: break;
         case 55:
           { bracket--; return createSymbol(ASTPHP5Symbols.T_CURLY_CLOSE);
           }
-        case 330: break;
+        case 332: break;
         case 196:
           { return createFullSymbol(ASTPHP5Symbols.T_INSTANCEOF);
           }
-        case 331: break;
+        case 333: break;
         case 177:
           { int bprefix = (yytext().charAt(0) != '<') ? 1 : 0;
         int startString=3+bprefix;
@@ -2549,13 +2583,13 @@ else if (zzAtEOF) {
         yybegin(ST_START_NOWDOC);
         return createSymbol(ASTPHP5Symbols.T_START_NOWDOC);
           }
-        case 332: break;
+        case 334: break;
         case 47:
           { yypushback(yylength());
     popState();
     pushState(ST_IN_SCRIPTING);
           }
-        case 333: break;
+        case 335: break;
         case 155:
           { isEndedPhp = false;
     whitespaceEndPosition = getTokenStartPosition() + yylength();
@@ -2563,47 +2597,47 @@ else if (zzAtEOF) {
     //return T_OPEN_TAG;
     //return createSymbol(ASTPHP5Symbols.T_OPEN_TAG);
           }
-        case 334: break;
+        case 336: break;
         case 65:
           { return createSymbol(ASTPHP5Symbols.T_PLUS_EQUAL);
           }
-        case 335: break;
+        case 337: break;
         case 9:
           { whitespaceEndPosition = getTokenStartPosition() + yylength();
           }
-        case 336: break;
+        case 338: break;
         case 173:
           { return createFullSymbol(ASTPHP5Symbols.T_PRIVATE);
           }
-        case 337: break;
+        case 339: break;
         case 201:
           { return createFullSymbol(ASTPHP5Symbols.T_REQUIRE_ONCE);
           }
-        case 338: break;
+        case 340: break;
         case 171:
           { return createFullSymbol(ASTPHP5Symbols.T_FOREACH);
           }
-        case 339: break;
+        case 341: break;
         case 148:
           { return createFullSymbol(ASTPHP5Symbols.T_CLONE);
           }
-        case 340: break;
+        case 342: break;
         case 140:
           { return createFullSymbol(ASTPHP5Symbols.T_ISSET);
           }
-        case 341: break;
+        case 343: break;
         case 19:
           { return createSymbol(ASTPHP5Symbols.T_OPEN_PARENTHESE);
           }
-        case 342: break;
+        case 344: break;
         case 163:
           { return createFullSymbol(ASTPHP5Symbols.T_PUBLIC);
           }
-        case 343: break;
+        case 345: break;
         case 118:
           { return createSymbol(ASTPHP5Symbols.T_SR_EQUAL);
           }
-        case 344: break;
+        case 346: break;
         case 61:
           { if (short_tags_allowed || yylength()>2) { /* yyleng>2 means it's not <? but <script> */
         yybegin(ST_IN_SCRIPTING);
@@ -2613,90 +2647,90 @@ else if (zzAtEOF) {
         return createSymbol(ASTPHP5Symbols.T_INLINE_HTML);
     }
           }
-        case 345: break;
+        case 347: break;
         case 137:
           { return createFullSymbol(ASTPHP5Symbols.T_EMPTY);
           }
-        case 346: break;
+        case 348: break;
         case 80:
           { return createSymbol(ASTPHP5Symbols.T_IS_NOT_EQUAL);
           }
-        case 347: break;
+        case 349: break;
         case 83:
           { return createSymbol(ASTPHP5Symbols.T_MUL_EQUAL);
           }
-        case 348: break;
+        case 350: break;
         case 124:
           { if (!parsePHPDoc()) {
 handleCommentStart();
 yybegin(ST_DOCBLOCK);
 }
           }
-        case 349: break;
+        case 351: break;
         case 122:
           { return createSymbol(ASTPHP5Symbols.T_SL_EQUAL);
           }
-        case 350: break;
+        case 352: break;
         case 113:
           { return createFullSymbol(ASTPHP5Symbols.T_TRY);
           }
-        case 351: break;
+        case 353: break;
         case 128:
           { int len = yylength();
         yypushback(2); // go back to mark end of comment in the next token
         comment = yytext();
           }
-        case 352: break;
+        case 354: break;
         case 143:
           { return createFullSymbol(ASTPHP5Symbols.T_FINAL);
           }
-        case 353: break;
+        case 355: break;
         case 184:
           { return createSymbol(ASTPHP5Symbols.T_OBJECT_CAST);
           }
-        case 354: break;
+        case 356: break;
         case 100:
           { yypushback(1);
     /*<ST_HEREDOC>{HEREDOC_CHARS}*({HEREDOC_NEWLINE}+({LABEL}";"?)?)?("{""{"+|"$""$"+)*/
     return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 355: break;
+        case 357: break;
         case 164:
           { return createSymbol(ASTPHP5Symbols.T_BOOL_CAST);
           }
-        case 356: break;
+        case 358: break;
         case 40:
           { yybegin(ST_IN_SCRIPTING);
     return createSymbol(ASTPHP5Symbols.T_BACKQUATE);
           }
-        case 357: break;
+        case 359: break;
         case 8:
           { return createSymbol(ASTPHP5Symbols.T_NS_SEPARATOR);
           }
-        case 358: break;
+        case 360: break;
         case 183:
           { return createSymbol(ASTPHP5Symbols.T_STRING_CAST);
           }
-        case 359: break;
+        case 361: break;
         case 110:
           { return createFullSymbol(ASTPHP5Symbols.T_LOGICAL_XOR);
           }
-        case 360: break;
+        case 362: break;
         case 50:
           { yypushback(1);
 	popState();
         /*<ST_VAR_OFFSET>[ \n\r\t\\'#]*/
 	return createSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 361: break;
+        case 363: break;
         case 62:
           { return createFullSymbol(ASTPHP5Symbols.T_DNUMBER);
           }
-        case 362: break;
+        case 364: break;
         case 25:
           { return createSymbol(ASTPHP5Symbols.T_PRECENT);
           }
-        case 363: break;
+        case 365: break;
         case 203:
           { comment = yytext();
     handleVarComment();
@@ -2704,13 +2738,13 @@ else if (zzAtEOF) {
     // but it needs some changes in parser grammar. see issue #154967
     //return createFullSymbol(ASTPHP5Symbols.T_VAR_COMMENT);
           }
-        case 364: break;
+        case 366: break;
         case 94:
           { isEndedPhp = true;
     yybegin(YYINITIAL);
     return createSymbol(ASTPHP5Symbols.T_SEMICOLON);  /* implicit ';' at php-end tag */
           }
-        case 365: break;
+        case 367: break;
         case 88:
           { if (asp_tags) {
         yybegin(YYINITIAL);
@@ -2719,69 +2753,69 @@ else if (zzAtEOF) {
         return createSymbol(ASTPHP5Symbols.T_INLINE_HTML);
     }
           }
-        case 366: break;
+        case 368: break;
         case 180:
           { return createFullSymbol(ASTPHP5Symbols.T_FUNCTION);
           }
-        case 367: break;
+        case 369: break;
         case 178:
           { return createFullSymbol(ASTPHP5Symbols.T_ENDWHILE);
           }
-        case 368: break;
+        case 370: break;
         case 28:
           { return createSymbol(ASTPHP5Symbols.T_KOVA);
           }
-        case 369: break;
+        case 371: break;
         case 11:
           { yybegin(ST_DOUBLE_QUOTES);
     return createSymbol(ASTPHP5Symbols.T_QUATE);
           }
-        case 370: break;
+        case 372: break;
         case 182:
           { return createFullSymbol(ASTPHP5Symbols.T_CONTINUE);
           }
-        case 371: break;
+        case 373: break;
         case 1:
           { /*<ST_HEREDOC>{HEREDOC_CHARS}*({HEREDOC_NEWLINE}+({LABEL}";"?)?)?*/
 	return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE);
           }
-        case 372: break;
+        case 374: break;
         case 112:
           { return createSymbol(ASTPHP5Symbols.T_IS_IDENTICAL);
           }
-        case 373: break;
+        case 375: break;
         case 70:
           { return createSymbol(ASTPHP5Symbols.T_DOUBLE_ARROW);
           }
-        case 374: break;
+        case 376: break;
         case 192:
           { return createFullSymbol(ASTPHP5Symbols.T_TRAIT_C);
           }
-        case 375: break;
+        case 377: break;
         case 79:
           { return createSymbol(ASTPHP5Symbols.T_PAAMAYIM_NEKUDOTAYIM);
           }
-        case 376: break;
+        case 378: break;
         case 116:
           { return createFullSymbol(ASTPHP5Symbols.T_USE);
           }
-        case 377: break;
+        case 379: break;
         case 78:
           { return createSymbol(ASTPHP5Symbols.T_SR);
           }
-        case 378: break;
+        case 380: break;
         case 15:
           { return createSymbol(ASTPHP5Symbols.T_EQUAL);
           }
-        case 379: break;
+        case 381: break;
         case 30:
           { return createSymbol(ASTPHP5Symbols.T_COMMA);
           }
-        case 380: break;
+        case 382: break;
         case 176:
           { return createFullSymbol(ASTPHP5Symbols.T_DIR);
           }
-        case 381: break;
+        case 383: break;
         case 107:
           { if (asp_tags || yytext().charAt(0)!='%') { /* asp comment? */
         isEndedPhp = true;
@@ -2791,41 +2825,41 @@ else if (zzAtEOF) {
 		//return T_COMMENT;
 	}
           }
-        case 382: break;
+        case 384: break;
         case 191:
           { return createFullSymbol(ASTPHP5Symbols.T_PROTECTED);
           }
-        case 383: break;
+        case 385: break;
         case 63:
           { return createSymbol(ASTPHP5Symbols.T_CONCAT_EQUAL);
           }
-        case 384: break;
+        case 386: break;
         case 104:
           { /* treat numbers (almost) as strings inside encapsulated strings */
     return createFullSymbol(ASTPHP5Symbols.T_NUM_STRING);
           }
-        case 385: break;
+        case 387: break;
         case 10:
           { return createSymbol(ASTPHP5Symbols.T_DOLLAR);
           }
-        case 386: break;
+        case 388: break;
         case 64:
           { return createSymbol(ASTPHP5Symbols.T_INC);
           }
-        case 387: break;
+        case 389: break;
         case 43:
           { yypushback(1);
 	yybegin(ST_NOWDOC);
           }
-        case 388: break;
+        case 390: break;
         case 73:
           { return createFullSymbol(ASTPHP5Symbols.T_LOGICAL_OR);
           }
-        case 389: break;
+        case 391: break;
         case 82:
           { return createSymbol(ASTPHP5Symbols.T_SL);
           }
-        case 390: break;
+        case 392: break;
         case 127:
           { String text = yytext();
 
@@ -2848,83 +2882,83 @@ else if (zzAtEOF) {
     }
     yypushback(1);
           }
-        case 391: break;
+        case 393: break;
         case 66:
           { return createFullSymbol(ASTPHP5Symbols.T_AS);
           }
-        case 392: break;
+        case 394: break;
         case 200:
           { return createFullSymbol(ASTPHP5Symbols.T_INCLUDE_ONCE);
           }
-        case 393: break;
+        case 395: break;
         case 123:
           { return createSymbol(ASTPHP5Symbols.T_POW_EQUAL);
           }
-        case 394: break;
+        case 396: break;
         case 69:
           { return createSymbol(ASTPHP5Symbols.T_IS_EQUAL);
           }
-        case 395: break;
+        case 397: break;
         case 34:
           { return createSymbol(ASTPHP5Symbols.T_AT);
           }
-        case 396: break;
+        case 398: break;
         case 51:
           { return createSymbol(ASTPHP5Symbols.T_QUATE);
           }
-        case 397: break;
+        case 399: break;
         case 186:
           { return createFullSymbol(ASTPHP5Symbols.T_LINE);
           }
-        case 398: break;
+        case 400: break;
         case 166:
           { return createFullSymbol(ASTPHP5Symbols.T_EXTENDS);
           }
-        case 399: break;
+        case 401: break;
         case 67:
           { return createFullSymbol(ASTPHP5Symbols.T_VARIABLE);
           }
-        case 400: break;
+        case 402: break;
         case 198:
           { return createSymbol(ASTPHP5Symbols.T_YIELD_FROM);
           }
-        case 401: break;
+        case 403: break;
         case 169:
           { return createFullSymbol(ASTPHP5Symbols.T_DECLARE);
           }
-        case 402: break;
+        case 404: break;
         case 93:
           { return createSymbol(ASTPHP5Symbols.T_XOR_EQUAL);
           }
-        case 403: break;
+        case 405: break;
         case 84:
           { return createSymbol(ASTPHP5Symbols.T_POW);
           }
-        case 404: break;
+        case 406: break;
         case 132:
           { return createFullSymbol(ASTPHP5Symbols.T_CASE);
           }
-        case 405: break;
+        case 407: break;
         case 185:
           { return createFullSymbol(ASTPHP5Symbols.T_FILE);
           }
-        case 406: break;
+        case 408: break;
         case 103:
           { return createSymbol(ASTPHP5Symbols.T_OBJECT_OPERATOR);
           }
-        case 407: break;
+        case 409: break;
         case 109:
           { return createSymbol(ASTPHP5Symbols.T_ELLIPSIS);
           }
-        case 408: break;
+        case 410: break;
         case 52:
           { return createSymbol(ASTPHP5Symbols.T_BACKQUATE);
           }
-        case 409: break;
+        case 411: break;
         case 56:
           {
           }
-        case 410: break;
+        case 412: break;
         default:
           if (zzInput == YYEOF && (zzStartRead == zzCurrentPos || zzLexicalState == ST_DOCBLOCK)) {
             zzAtEOF = true;
@@ -2939,7 +2973,7 @@ else if (zzAtEOF) {
                 return createSymbol(ASTPHP5Symbols.EOF);
               }
             }
-            case 765: break;
+            case 786: break;
             default:
               {     return createSymbol(ASTPHP5Symbols.EOF);
  }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Symbols.java b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Symbols.java
index c170dec185..9ccaa18b51 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Symbols.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Symbols.java
@@ -42,7 +42,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.11a beta 20060608
-// Sun Jul 30 19:42:18 JST 2017
+// Sun Jun 10 08:20:09 JST 2018
 //----------------------------------------------------
 
 package org.netbeans.modules.php.editor.parser;
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable1.java b/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable1.java
index 9a96cd326b..1e14bc13b9 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable1.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable1.java
@@ -51,7 +51,7 @@ public String getTableData() {
     }
     protected EncodedActionTable1() {
         sb = new StringBuilder();
-        sb.append("\000\u0537\000\256\002\uffaa\003\uffaa\004\uffaa\005\uffaa\006");
+        sb.append("\000\u0538\000\256\002\uffaa\003\uffaa\004\uffaa\005\uffaa\006");
         sb.append("\uffaa\007\uffaa\010\uffaa\011\uffaa\012\uffaa\014\uffaa\015\uffaa");
         sb.append("\016\uffaa\017\uffaa\020\uffaa\021\uffaa\023\uffaa\025\uffaa\027");
         sb.append("\uffaa\032\uffaa\034\uffaa\040\uffaa\041\uffaa\042\uffaa\043\uffaa");
@@ -64,7 +64,7 @@ protected EncodedActionTable1() {
         sb.append("\174\uffaa\175\uffaa\177\uffaa\200\uffaa\201\uffaa\202\uffaa\203");
         sb.append("\uffaa\204\uffaa\205\uffaa\206\uffaa\207\uffaa\210\uffaa\211\uffaa");
         sb.append("\213\uffaa\217\uffaa\220\uffaa\221\uffaa\225\uffaa\230\uffaa\231");
-        sb.append("\uffaa\232\uffaa\233\uffaa\235\uffaa\001\002\000\004\002\u0539");
+        sb.append("\uffaa\232\uffaa\233\uffaa\235\uffaa\001\002\000\004\002\u053a");
         sb.append("\001\002\000\256\002\001\003\142\004\174\005\211\006");
         sb.append("\130\007\012\010\036\011\063\012\072\014\113\015\160");
         sb.append("\016\154\017\150\020\145\021\051\023\035\025\121\027");
@@ -84,7 +84,7 @@ protected EncodedActionTable1() {
         sb.append("\153\ufe27\154\ufe27\155\ufe27\156\ufe27\157\ufe27\160\ufe27\161");
         sb.append("\ufe27\162\ufe27\163\ufe27\164\ufe27\165\ufe27\166\ufe27\167\ufe27");
         sb.append("\170\ufe27\171\ufe27\172\ufe27\173\ufe27\176\ufe27\212\ufe27\226");
-        sb.append("\ufe27\227\ufe27\237\ufe27\242\ufe27\001\002\000\004\225\u0536");
+        sb.append("\ufe27\227\ufe27\237\ufe27\242\ufe27\001\002\000\004\225\u0537");
         sb.append("\001\002\000\304\002\uff6c\003\uff6c\004\uff6c\005\uff6c\006");
         sb.append("\uff6c\007\uff6c\010\uff6c\011\uff6c\012\uff6c\014\uff6c\015\uff6c");
         sb.append("\016\uff6c\017\uff6c\020\uff6c\021\uff6c\022\uff6c\023\uff6c\024");
@@ -100,7 +100,7 @@ protected EncodedActionTable1() {
         sb.append("\202\uff6c\203\uff6c\204\uff6c\205\uff6c\206\uff6c\207\uff6c\210");
         sb.append("\uff6c\211\uff6c\213\uff6c\214\uff6c\215\uff6c\216\uff6c\217\uff6c");
         sb.append("\220\uff6c\221\uff6c\225\uff6c\230\uff6c\231\uff6c\232\uff6c\233");
-        sb.append("\uff6c\235\uff6c\001\002\000\006\012\u052b\230\u052c\001\002");
+        sb.append("\uff6c\235\uff6c\001\002\000\006\012\u052c\230\u052d\001\002");
         sb.append("\000\114\031\ufe2a\033\ufe2a\070\ufe2a\107\ufe2a\124\ufe2a\125");
         sb.append("\ufe2a\126\ufe2a\127\ufe2a\145\ufe2a\146\ufe2a\147\ufe2a\150\ufe2a");
         sb.append("\151\ufe2a\152\ufe2a\153\ufe2a\154\ufe2a\155\ufe2a\156\ufe2a\157");
@@ -121,7 +121,7 @@ protected EncodedActionTable1() {
         sb.append("\030\202\163\203\042\204\153\205\110\206\164\207\104");
         sb.append("\210\040\211\061\212\ufdd1\213\114\217\215\225\203\226");
         sb.append("\ufdd1\227\ufdd1\230\120\231\134\232\070\233\143\237\ufdd1");
-        sb.append("\242\ufdd1\001\002\000\004\225\u0522\001\002\000\156\004");
+        sb.append("\242\ufdd1\001\002\000\004\225\u0523\001\002\000\156\004");
         sb.append("\174\006\130\007\012\010\214\011\063\012\072\015\160");
         sb.append("\016\154\032\123\043\217\060\201\061\032\071\202\072");
         sb.append("\014\074\021\075\141\076\053\077\054\100\162\101\006");
@@ -142,7 +142,7 @@ protected EncodedActionTable1() {
         sb.append("\155\252\156\232\157\247\160\264\161\263\162\245\163");
         sb.append("\243\164\262\165\256\166\251\167\266\170\244\171\255");
         sb.append("\172\253\173\233\176\240\212\ufdc5\226\ufdc5\227\ufdc5\237");
-        sb.append("\242\242\234\001\002\000\004\063\u0520\001\002\000\114");
+        sb.append("\242\242\234\001\002\000\004\063\u0521\001\002\000\114");
         sb.append("\031\ufe25\033\ufe25\070\ufe25\107\ufe25\124\ufe25\125\ufe25\126");
         sb.append("\ufe25\127\ufe25\145\ufe25\146\ufe25\147\ufe25\150\ufe25\151\ufe25");
         sb.append("\152\ufe25\153\ufe25\154\ufe25\155\ufe25\156\ufe25\157\ufe25\160");
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable13.java b/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable13.java
index f8bad2a53f..5675590fe1 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable13.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/EncodedActionTable13.java
@@ -1766,9 +1766,9 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\012"); 
         sb.append("\033"); 
-        sb.append("\u051b"); 
+        sb.append("\u051c"); 
         sb.append("\114"); 
-        sb.append("\u051a"); 
+        sb.append("\u051b"); 
         sb.append("\124"); 
         sb.append("\uff9c"); 
         sb.append("\146"); 
@@ -2276,7 +2276,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\006"); 
         sb.append("\107"); 
-        sb.append("\uff96"); 
+        sb.append("\ufdd8"); 
         sb.append("\124"); 
         sb.append("\u0510"); 
         sb.append("\001"); 
@@ -2322,18 +2322,26 @@ protected EncodedActionTable13() {
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
-        sb.append("\012"); 
+        sb.append("\014"); 
         sb.append("\010"); 
         sb.append("\315"); 
         sb.append("\043"); 
         sb.append("\u0508"); 
         sb.append("\044"); 
         sb.append("\u0509"); 
+        sb.append("\107"); 
+        sb.append("\ufdd7"); 
         sb.append("\116"); 
         sb.append("\065"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
+        sb.append("\004"); 
+        sb.append("\107"); 
+        sb.append("\uff96"); 
+        sb.append("\001"); 
+        sb.append("\002"); 
+        sb.append("\000"); 
         sb.append("\006"); 
         sb.append("\107"); 
         sb.append("\uff94"); 
@@ -2344,7 +2352,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\012"); 
         sb.append("\033"); 
-        sb.append("\u0513"); 
+        sb.append("\u0514"); 
         sb.append("\107"); 
         sb.append("\uff8e"); 
         sb.append("\114"); 
@@ -2356,7 +2364,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\004"); 
         sb.append("\010"); 
-        sb.append("\u0514"); 
+        sb.append("\u0515"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -2370,7 +2378,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\012"); 
         sb.append("\033"); 
-        sb.append("\u0516"); 
+        sb.append("\u0517"); 
         sb.append("\107"); 
         sb.append("\uff90"); 
         sb.append("\114"); 
@@ -2382,7 +2390,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\004"); 
         sb.append("\010"); 
-        sb.append("\u0517"); 
+        sb.append("\u0518"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -2398,7 +2406,7 @@ protected EncodedActionTable13() {
         sb.append("\124"); 
         sb.append("\u04fd"); 
         sb.append("\146"); 
-        sb.append("\u0519"); 
+        sb.append("\u051a"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -2584,13 +2592,13 @@ protected EncodedActionTable13() {
         sb.append("\010"); 
         sb.append("\323"); 
         sb.append("\106"); 
-        sb.append("\u051d"); 
+        sb.append("\u051e"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
         sb.append("\004"); 
         sb.append("\010"); 
-        sb.append("\u051c"); 
+        sb.append("\u051d"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -2618,7 +2626,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\004"); 
         sb.append("\107"); 
-        sb.append("\u051f"); 
+        sb.append("\u0520"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -2834,7 +2842,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\004"); 
         sb.append("\226"); 
-        sb.append("\u0524"); 
+        sb.append("\u0525"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -2928,7 +2936,7 @@ protected EncodedActionTable13() {
         sb.append("\033"); 
         sb.append("\ufdce"); 
         sb.append("\070"); 
-        sb.append("\u0528"); 
+        sb.append("\u0529"); 
         sb.append("\107"); 
         sb.append("\ufdce"); 
         sb.append("\124"); 
@@ -3348,9 +3356,9 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\006"); 
         sb.append("\124"); 
-        sb.append("\u0533"); 
-        sb.append("\146"); 
         sb.append("\u0534"); 
+        sb.append("\146"); 
+        sb.append("\u0535"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -3372,7 +3380,7 @@ protected EncodedActionTable13() {
         sb.append("\072"); 
         sb.append("\014"); 
         sb.append("\106"); 
-        sb.append("\u0530"); 
+        sb.append("\u0531"); 
         sb.append("\111"); 
         sb.append("\u0106"); 
         sb.append("\114"); 
@@ -3530,7 +3538,7 @@ protected EncodedActionTable13() {
         sb.append("\031"); 
         sb.append("\257"); 
         sb.append("\107"); 
-        sb.append("\u0532"); 
+        sb.append("\u0533"); 
         sb.append("\125"); 
         sb.append("\246"); 
         sb.append("\126"); 
@@ -3600,9 +3608,9 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\006"); 
         sb.append("\012"); 
-        sb.append("\u052b"); 
-        sb.append("\230"); 
         sb.append("\u052c"); 
+        sb.append("\230"); 
+        sb.append("\u052d"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
@@ -3932,7 +3940,7 @@ protected EncodedActionTable13() {
         sb.append("\000"); 
         sb.append("\004"); 
         sb.append("\226"); 
-        sb.append("\u0538"); 
+        sb.append("\u0539"); 
         sb.append("\001"); 
         sb.append("\002"); 
         sb.append("\000"); 
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java b/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
index 9128cc7af1..9aa48c0523 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
@@ -255,7 +255,7 @@ private PHPDocTag createTag(int start, int end, AnnotationParsedLine type, Strin
                     }
                 }
                 return null;
-            } else if (type.equals(PHPDocTag.Type.RETURN) || type.equals(PHPDocTag.Type.VAR)) {
+            } else if (type.equals(PHPDocTag.Type.RETURN) || type.equals(PHPDocTag.Type.VAR) || type.equals(PHPDocTag.Type.MIXIN)) {
                 return new PHPDocTypeTag(start, end, type, description, docTypes);
             }
             return new PHPDocTag(start, end, type, description);
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java b/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
index d7ceb482af..d8cf676b3c 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
@@ -51,6 +51,13 @@
 import org.netbeans.modules.php.editor.parser.astnodes.PHPVarComment;
 
 /**
+ * PHPVarComment pattern: The first one is the IDE's own pattern. See
+ * {@link https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md}
+ * about the second one.
+ * <pre>
+ * &#47;*  @var $variableName TypeName *&#47;
+ * &#47;** @var TypeName $variableName Description *&#47;
+ * </pre>
  *
  * @author Petr Pisl
  */
@@ -59,6 +66,10 @@
     private static final String PHPDOCTAG = "@" + PHPDocTag.Type.VAR.name().toLowerCase(); //NOI18N
 
     PHPVarComment parse(final int startOffset, final int endOffset, final String comment) {
+        boolean isPHPDoc = comment.startsWith("/**"); // NOI18N
+        int variableIndex = isPHPDoc ? 2 : 1;
+        int typeIndex = isPHPDoc ? 1 : 2;
+
         int index = comment.indexOf(PHPDOCTAG);
         if (index > -1) {
             String definition = comment.substring(index);
@@ -69,13 +80,14 @@ PHPVarComment parse(final int startOffset, final int endOffset, final String com
             int startDocNode;
             int endPosition = 0;
             String[] parts = definition.split("[ \t]+"); //NOI18N
-            if (parts.length == 3 && parts[1].charAt(0) == '$') { //NOI18N
+            if (isExpectedPartsLength(isPHPDoc, parts)
+                    && parts[variableIndex].charAt(0) == '$') { //NOI18N
                 //counting types
-                String[] types = parts[2].split("[|]"); //NOI18N
-                int typePosition = startOffset + comment.indexOf(parts[2]);
+                String[] types = parts[typeIndex].split("[|]"); //NOI18N
+                int typePosition = startOffset + comment.indexOf(parts[typeIndex]);
                 ArrayList<PHPDocTypeNode> typeNodes = new ArrayList<>();
                 for (String type: types) {
-                    startDocNode = typePosition + parts[2].indexOf(type);
+                    startDocNode = typePosition + parts[typeIndex].indexOf(type);
                     index = type.indexOf("::"); //NOI18N
                     boolean isArray = (type.indexOf('[') > 0  && type.indexOf(']') > 0);
                     if (isArray) {
@@ -95,10 +107,10 @@ PHPVarComment parse(final int startOffset, final int endOffset, final String com
                     typeNodes.add(docType);
                 }
                 // counting variable
-                String variableName = parts[1];
-                int indexOfArrayDimension = parts[1].indexOf("["); //NOI18N
+                String variableName = parts[variableIndex];
+                int indexOfArrayDimension = parts[variableIndex].indexOf("["); //NOI18N
                 if (indexOfArrayDimension != -1) {
-                    variableName = parts[1].substring(0, indexOfArrayDimension);
+                    variableName = parts[variableIndex].substring(0, indexOfArrayDimension);
                 }
                 startDocNode = startOffset + comment.indexOf(variableName);
                 PHPDocNode variableNode = new PHPDocNode(startDocNode, startDocNode + variableName.length(), variableName);
@@ -109,4 +121,11 @@ PHPVarComment parse(final int startOffset, final int endOffset, final String com
         }
         return null;
     }
+
+    private boolean isExpectedPartsLength(boolean isPHPDoc, String[] parts) {
+        if (isPHPDoc) {
+            return parts.length >= 3;
+        }
+        return parts.length == 3;
+    }
 }
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/GroupUseStatementPart.java b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/GroupUseStatementPart.java
index 476c2f8dc3..e994163747 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/GroupUseStatementPart.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/GroupUseStatementPart.java
@@ -51,6 +51,7 @@
  * <pre>
  * some\namespace\{ClassA, sub\ClassB, ClassC as C};
  * some\namespace\{ClassA, function sub\myfnc, const MY_CONST as C};
+ * some\namespace\{ClassA,}; // PHP7.2
  * </pre>
  */
 public class GroupUseStatementPart extends UseStatementPart {
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocTag.java b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocTag.java
index 21dc094b01..79dd6bf91f 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocTag.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocTag.java
@@ -59,6 +59,7 @@
         PARAM("param"), //NOI18N
         RETURN("return"), //NOI18N
         VAR("var"), //NOI18N
+        MIXIN("mixin"), // NOI18N
         DEPRECATED("deprecated"); //NOI18N
 
         private final String name;
diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java
index 39045f2a45..956a1a3578 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java
@@ -46,6 +46,12 @@
  * Represents a single line comment, where user is able to assigna a type to variable
  * <pre> @var $variable type </pre> . It has to be single line comment. Also it can
  * contains mixed type. e.g. <pre> @var $variable type1|type2 </pre>
+ *
+ * <b>NOTE:</b> There is an order difference.
+ * <pre>
+ * &#47;*  @var $variableName TypeName *&#47;
+ * &#47;** @var TypeName $variableName Description *&#47;
+ * </pre>
  * @author Petr Pisl
  */
 public class PHPVarComment extends Comment {
diff --git a/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml b/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml
index 40a3b28a81..63a1f1c0e8 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml
+++ b/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml
@@ -321,7 +321,12 @@ ${cursor}]]>
 <![CDATA[throw new ${Exception};]]>
         </code>
     </codetemplate>
-<codetemplate uuid="org.netbeans.modules.php.editor.codetemplate.vdoc" abbreviation="vdoc" contexts="php-code">
+    <codetemplate uuid="org.netbeans.modules.php.editor.codetemplate.vdoc" abbreviation="vdoc" contexts="php-code">
+        <code>
+<![CDATA[/** @var ${VAR_TYPE variableFromNextAssignmentType default="ClassName"} $$${VARIABLE variableFromNextAssignmentName default="variable"} */]]>
+        </code>
+    </codetemplate>
+    <codetemplate uuid="org.netbeans.modules.php.editor.codetemplate.vdocl" abbreviation="vdocl" contexts="php-code">
         <code>
 <![CDATA[/* @var $$${VARIABLE variableFromNextAssignmentName default="variable"} ${VAR_TYPE variableFromNextAssignmentType default="ClassName"} */]]>
         </code>
diff --git a/php.editor/src/org/netbeans/modules/php/editor/resources/layer.xml b/php.editor/src/org/netbeans/modules/php/editor/resources/layer.xml
index 5a337aad2f..cfd4534d30 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/resources/layer.xml
+++ b/php.editor/src/org/netbeans/modules/php/editor/resources/layer.xml
@@ -435,6 +435,7 @@ Contributor(s):
                     <file name="org-netbeans-modules-php-editor-verification-PHP56UnhandledError.instance"/>
                     <file name="org-netbeans-modules-php-editor-verification-PHP70UnhandledError.instance"/>
                     <file name="org-netbeans-modules-php-editor-verification-PHP71UnhandledError.instance"/>
+                    <file name="org-netbeans-modules-php-editor-verification-PHP72UnhandledError.instance"/>
                     <file name="org-netbeans-modules-php-editor-verification-ReturnTypeHintError.instance"/>
                     <file name="org-netbeans-modules-php-editor-verification-TypeRedeclarationHintError.instance"/>
                 </folder>
diff --git a/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptor.java b/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptor.java
index 9c8fe22579..98f8e182f4 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptor.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptor.java
@@ -76,9 +76,15 @@
      * does not also have code on the same line).
      */
     static final boolean CONTINUE_COMMENTS = Boolean.getBoolean("php.cont.comment"); // NOI18N
+    // for unit tests
+    private static Boolean INSERT_ASTERISK_TO_PHP_COMMENT = null;
 
     private PhpDocBodyGenerator phpDocBodyGenerator = PhpDocBodyGenerator.NONE;
 
+    static void setInsertAsteriskToPHPComment(Boolean insert) {
+        PhpTypedBreakInterceptor.INSERT_ASTERISK_TO_PHP_COMMENT = insert;
+    }
+
     @Override
     public void insert(MutableContext context) throws BadLocationException {
         final BaseDocument doc = (BaseDocument) context.getDocument();
@@ -621,6 +627,7 @@ private static char extractStringDelimiter(TokenSequence<? extends PHPTokenId> t
             PHPTokenId commentEnd,
             MutableContext context) throws BadLocationException {
         PHPTokenId id = ts.token().id();
+        boolean insertAsterisk = insertAsterisk(commentStart);
         if (id == commentBody || id == commentStart) {
             int insertOffset;
             if (id == commentStart) {
@@ -642,14 +649,18 @@ private static char extractStringDelimiter(TokenSequence<? extends PHPTokenId> t
             StringBuilder sb = new StringBuilder("\n");
             if (offset > afterLastNonWhite) {
                 sb.append(org.netbeans.modules.editor.indent.api.IndentUtils.createIndentString(doc, indent));
-                sb.append(" * "); // NOI18N
+                if (insertAsterisk) {
+                    sb.append(" * "); // NOI18N
+                }
                 newCaretOffset = sb.length();
             } else {
                 // I'm inserting a newline in the middle of a sentence, such as the scenario in #118656
                 // I should insert the end AFTER the text on the line
                 String restOfLine = doc.getText(insertOffset, LineDocumentUtils.getLineEnd(doc, afterLastNonWhite) - insertOffset);
                 sb.append(org.netbeans.modules.editor.indent.api.IndentUtils.createIndentString(doc, indent));
-                sb.append(" * "); // NOI18N
+                if (insertAsterisk) {
+                    sb.append(" * "); // NOI18N
+                }
                 newCaretOffset = sb.length();
                 sb.append(restOfLine);
                 doc.remove(insertOffset, restOfLine.length());
@@ -658,7 +669,11 @@ private static char extractStringDelimiter(TokenSequence<? extends PHPTokenId> t
                 // add the closing tag
                 sb.append("\n");
                 sb.append(org.netbeans.modules.editor.indent.api.IndentUtils.createIndentString(doc, indent));
-                sb.append(" */"); // NOI18N
+                if (insertAsterisk) {
+                    sb.append(" */"); // NOI18N
+                } else {
+                    sb.append("*/"); // NOI18N
+                }
             }
             context.setText(sb.toString(), 0, newCaretOffset);
             return new Object[]{insertOffset + newCaretOffset, addClosingTag};
@@ -681,7 +696,9 @@ private static char extractStringDelimiter(TokenSequence<? extends PHPTokenId> t
             if (beforeFirstNonWhite >= insertOffset) {
                 // only whitespace in front of */
                 sb.append(org.netbeans.modules.editor.indent.api.IndentUtils.createIndentString(doc, indent));
-                sb.append(" * ");
+                if (insertAsterisk) {
+                    sb.append(" * "); // NOI18N
+                }
                 newCaretOffset = sb.length();
                 newCaretOffset2 = rowStart + newCaretOffset;
                 sb.append(org.netbeans.modules.editor.indent.api.IndentUtils.createIndentString(doc, indent));
@@ -697,6 +714,18 @@ private static char extractStringDelimiter(TokenSequence<? extends PHPTokenId> t
         return new Object[]{-1, false};
     }
 
+    private static boolean insertAsterisk(PHPTokenId commentStart) {
+        return commentStart == PHPTokenId.PHPDOC_COMMENT_START
+                || (commentStart == PHPTokenId.PHP_COMMENT_START && insertAsteriskToPHPComment());
+    }
+
+    private static boolean insertAsteriskToPHPComment() {
+        if (INSERT_ASTERISK_TO_PHP_COMMENT != null) {
+            return INSERT_ASTERISK_TO_PHP_COMMENT;
+        }
+        return OptionsUtils.autoCompletionCommentAsterisk();
+    }
+
     // XXX: stolen from JavaKit.JavaInsertBreakAction, we should extend it to support heredoc
     private static boolean isClosedComment(CharSequence txt, int pos) {
         int length = txt.length();
diff --git a/php.editor/src/org/netbeans/modules/php/editor/verification/PHP72UnhandledError.java b/php.editor/src/org/netbeans/modules/php/editor/verification/PHP72UnhandledError.java
new file mode 100644
index 0000000000..7a91b5846d
--- /dev/null
+++ b/php.editor/src/org/netbeans/modules/php/editor/verification/PHP72UnhandledError.java
@@ -0,0 +1,197 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.verification;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.api.lexer.TokenUtilities;
+import org.netbeans.editor.BaseDocument;
+import org.netbeans.modules.csl.api.Error;
+import org.netbeans.modules.csl.spi.GsfUtilities;
+import org.netbeans.modules.csl.spi.support.CancelSupport;
+import org.netbeans.modules.php.api.PhpVersion;
+import org.netbeans.modules.php.editor.CodeUtils;
+import org.netbeans.modules.php.editor.lexer.LexUtilities;
+import org.netbeans.modules.php.editor.lexer.PHPTokenId;
+import org.netbeans.modules.php.editor.parser.PHPParseResult;
+import org.netbeans.modules.php.editor.parser.astnodes.ASTNode;
+import org.netbeans.modules.php.editor.parser.astnodes.GroupUseStatementPart;
+import org.netbeans.modules.php.editor.parser.astnodes.SingleUseStatementPart;
+import org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor;
+import org.openide.filesystems.FileObject;
+import org.openide.util.NbBundle;
+
+public class PHP72UnhandledError extends UnhandledErrorRule {
+
+    @NbBundle.Messages("PHP72UnhandledError.displayName=Language feature not compatible with PHP version indicated in project settings")
+    @Override
+    public String getDisplayName() {
+        return Bundle.PHP72UnhandledError_displayName();
+    }
+
+    @Override
+    public void invoke(PHPRuleContext context, List<Error> errors) {
+        PHPParseResult phpParseResult = (PHPParseResult) context.parserResult;
+        if (phpParseResult.getProgram() == null) {
+            return;
+        }
+        FileObject fileObject = phpParseResult.getSnapshot().getSource().getFileObject();
+        if (fileObject != null
+                && appliesTo(fileObject)) {
+            if (CancelSupport.getDefault().isCancelled()) {
+                return;
+            }
+            CheckVisitor checkVisitor = new CheckVisitor(fileObject);
+            phpParseResult.getProgram().accept(checkVisitor);
+            if (CancelSupport.getDefault().isCancelled()) {
+                return;
+            }
+            errors.addAll(checkVisitor.getErrors());
+        }
+    }
+
+    private static boolean appliesTo(FileObject fileObject) {
+        return CodeUtils.isPhpVersionLessThan(fileObject, PhpVersion.PHP_72);
+    }
+
+    //~ Inner classes
+    private static final class CheckVisitor extends DefaultVisitor {
+
+        private final List<VerificationError> errors = new ArrayList<>();
+        private final List<SingleUseStatementPart> lastUseStatementParts = new ArrayList<>();
+        private final FileObject fileObject;
+
+        public CheckVisitor(FileObject fileObject) {
+            this.fileObject = fileObject;
+        }
+
+        public Collection<VerificationError> getErrors() {
+            checkGroupUseTrailingCommas();
+            return Collections.unmodifiableCollection(errors);
+        }
+
+        @Override
+        public void visit(GroupUseStatementPart node) {
+            if (CancelSupport.getDefault().isCancelled()) {
+                return;
+            }
+            List<SingleUseStatementPart> items = node.getItems();
+            if (!items.isEmpty()) {
+                lastUseStatementParts.add(items.get(items.size() - 1));
+            }
+            super.visit(node);
+        }
+
+        private void checkGroupUseTrailingCommas() {
+            if (!lastUseStatementParts.isEmpty()) {
+                BaseDocument document = GsfUtilities.getDocument(fileObject, true);
+                if (document == null) {
+                    return;
+                }
+                document.readLock();
+                try {
+                    TokenSequence<PHPTokenId> ts = LexUtilities.getPHPTokenSequence(document, 0);
+                    if (ts == null) {
+                        return;
+                    }
+                    lastUseStatementParts.forEach((lastUseStatementPart) -> {
+                        if (CancelSupport.getDefault().isCancelled()) {
+                            return;
+                        }
+                        ts.move(lastUseStatementPart.getEndOffset());
+                        if (ts.moveNext()) {
+                            Token<? extends PHPTokenId> token = LexUtilities.findNext(ts, Arrays.asList(PHPTokenId.WHITESPACE));
+                            if (token == null) {
+                                return;
+                            }
+                            if (token.id() == PHPTokenId.PHP_TOKEN && TokenUtilities.textEquals(token.text(), ",")) { // NOI18N
+                                createError(lastUseStatementPart);
+                            }
+                        }
+                    });
+                } finally {
+                    document.readUnlock();
+                    lastUseStatementParts.clear();
+                }
+            }
+        }
+
+        private void createError(int startOffset, int endOffset) {
+            errors.add(new PHP72VersionError(fileObject, startOffset, endOffset));
+        }
+
+        private void createError(ASTNode node) {
+            createError(node.getStartOffset(), node.getEndOffset());
+        }
+
+    }
+
+    private static final class PHP72VersionError extends VerificationError {
+
+        private static final String KEY = "Php.Version.72"; // NOI18N
+
+        private PHP72VersionError(FileObject fileObject, int startOffset, int endOffset) {
+            super(fileObject, startOffset, endOffset);
+        }
+
+        @NbBundle.Messages("PHP72VersionError.displayName=Language feature not compatible with PHP version indicated in project settings")
+        @Override
+        public String getDisplayName() {
+            return Bundle.PHP72VersionError_displayName();
+        }
+
+        @NbBundle.Messages("PHP72VersionError.description=Detected language features not compatible with PHP version indicated in project settings")
+        @Override
+        public String getDescription() {
+            return Bundle.PHP72VersionError_description();
+        }
+
+        @Override
+        public String getKey() {
+            return KEY;
+        }
+
+    }
+}
diff --git a/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java b/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java
index 20cde36494..40e38fe722 100644
--- a/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java
+++ b/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java
@@ -91,7 +91,7 @@ public String getDescription() {
     }
 
     @Override
-    @Messages("VarDocHintDispName=Generate Type Comment For Variable /* @var $myvariable MyClass */")
+    @Messages("VarDocHintDispName=Generate Type Comment For Variable /** @var MyClass $myvariable */")
     public String getDisplayName() {
         return Bundle.VarDocHintDispName();
     }
@@ -196,7 +196,7 @@ EditList getEditList(BaseDocument doc, int caretOffset) throws Exception {
         }
 
         private String getCommentText() {
-            return String.format("%n/* @var %s %s */", vName.getName(), getTypeTemplate()); //NOI18N
+            return String.format("%n/** @var %s %s */", getTypeTemplate(), vName.getName()); //NOI18N
         }
 
         private String getTypeTemplate() {
diff --git a/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/lexer/PHP72FeaturesTest/lexer/object_type_01.pass b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/lexer/PHP72FeaturesTest/lexer/object_type_01.pass
new file mode 100644
index 0000000000..2721b2182f
--- /dev/null
+++ b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/lexer/PHP72FeaturesTest/lexer/object_type_01.pass
@@ -0,0 +1,73 @@
+token #0 PHP_OPENTAG <?php
+token #1 WHITESPACE \n\n
+token #2 PHP_FUNCTION function
+token #3 WHITESPACE  
+token #4 PHP_STRING parameterType
+token #5 PHP_TOKEN (
+token #6 PHP_TYPE_OBJECT object
+token #7 WHITESPACE  
+token #8 PHP_VARIABLE $object1
+token #9 PHP_TOKEN ,
+token #10 WHITESPACE  
+token #11 PHP_TYPE_OBJECT object
+token #12 WHITESPACE  
+token #13 PHP_VARIABLE $object2
+token #14 PHP_TOKEN )
+token #15 WHITESPACE  
+token #16 PHP_CURLY_OPEN {
+token #17 WHITESPACE \n    
+token #18 PHP_ECHO echo
+token #19 WHITESPACE  
+token #20 PHP_STRING get_class
+token #21 PHP_TOKEN (
+token #22 PHP_VARIABLE $object1
+token #23 PHP_TOKEN )
+token #24 WHITESPACE  
+token #25 PHP_TOKEN .
+token #26 WHITESPACE  
+token #27 PHP_STRING PHP_EOL
+token #28 PHP_SEMICOLON ;
+token #29 WHITESPACE \n    
+token #30 PHP_ECHO echo
+token #31 WHITESPACE  
+token #32 PHP_STRING get_class
+token #33 PHP_TOKEN (
+token #34 PHP_VARIABLE $object2
+token #35 PHP_TOKEN )
+token #36 WHITESPACE  
+token #37 PHP_TOKEN .
+token #38 WHITESPACE  
+token #39 PHP_STRING PHP_EOL
+token #40 PHP_SEMICOLON ;
+token #41 WHITESPACE \n
+token #42 PHP_CURLY_CLOSE }
+token #43 WHITESPACE \n\n
+token #44 PHP_FUNCTION function
+token #45 WHITESPACE  
+token #46 PHP_STRING returnType
+token #47 PHP_TOKEN (
+token #48 PHP_TOKEN )
+token #49 PHP_TOKEN :
+token #50 WHITESPACE  
+token #51 PHP_TYPE_OBJECT object
+token #52 WHITESPACE  
+token #53 PHP_CURLY_OPEN {
+token #54 WHITESPACE \n    
+token #55 PHP_VARIABLE $stdClass
+token #56 WHITESPACE  
+token #57 PHP_OPERATOR =
+token #58 WHITESPACE  
+token #59 PHP_NEW new
+token #60 WHITESPACE  
+token #61 PHP_STRING stdClass
+token #62 PHP_TOKEN (
+token #63 PHP_TOKEN )
+token #64 PHP_SEMICOLON ;
+token #65 WHITESPACE \n    
+token #66 PHP_RETURN return
+token #67 WHITESPACE  
+token #68 PHP_VARIABLE $stdClass
+token #69 PHP_SEMICOLON ;
+token #70 WHITESPACE \n
+token #71 PHP_CURLY_CLOSE }
+token #72 WHITESPACE \n
diff --git a/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_01.pass b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_01.pass
new file mode 100644
index 0000000000..734811efc4
--- /dev/null
+++ b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_01.pass
@@ -0,0 +1,99 @@
+<testresult testFile='groupUseTrailingCommas_01.php'>
+    <scanner>
+        <token id='T_USE' start='7' end='10'>
+            <text>use</text>
+        </token>
+        <token id='T_STRING' start='11' end='15'>
+            <text>some</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='15' end='16'>
+            <text>\</text>
+        </token>
+        <token id='T_STRING' start='16' end='18'>
+            <text>ns</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='18' end='19'>
+            <text>\</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='19' end='20'>
+            <text>{</text>
+        </token>
+        <token id='T_STRING' start='20' end='26'>
+            <text>ClassA</text>
+        </token>
+        <token id='T_COMMA' start='26' end='27'>
+            <text>,</text>
+        </token>
+        <token id='T_STRING' start='28' end='34'>
+            <text>ClassB</text>
+        </token>
+        <token id='T_COMMA' start='34' end='35'>
+            <text>,</text>
+        </token>
+        <token id='T_STRING' start='36' end='42'>
+            <text>ClassC</text>
+        </token>
+        <token id='T_AS' start='43' end='45'>
+            <text>as</text>
+        </token>
+        <token id='T_STRING' start='46' end='47'>
+            <text>C</text>
+        </token>
+        <token id='T_COMMA' start='47' end='48'>
+            <text>,</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='48' end='49'>
+            <text>}</text>
+        </token>
+        <token id='T_SEMICOLON' start='49' end='50'>
+            <text>;</text>
+        </token>
+        <token id='EOF' start='51' end='51'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='51'>
+        <Comments>
+        </Comments>
+        <Statements>
+            <UseStatement start='7' end='50' type='TYPE'>
+                <GroupUseStatementPart start='11' end='49'>
+                    <BaseNameSpace>
+                        <NamespaceName start='11' end='18' isCurrent='false' isGlobal='false'>
+                            <Identifier start='11' end='15' name='some'/>
+                            <Identifier start='16' end='18' name='ns'/>
+                        </NamespaceName>
+                    </BaseNameSpace>
+                    <SingleUseStatementPart start='20' end='26'>
+                        <Name>
+                            <NamespaceName start='20' end='26' isCurrent='false' isGlobal='false'>
+                                <Identifier start='20' end='26' name='ClassA'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='28' end='34'>
+                        <Name>
+                            <NamespaceName start='28' end='34' isCurrent='false' isGlobal='false'>
+                                <Identifier start='28' end='34' name='ClassB'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='36' end='47'>
+                        <Name>
+                            <NamespaceName start='36' end='42' isCurrent='false' isGlobal='false'>
+                                <Identifier start='36' end='42' name='ClassC'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                            <Identifier start='46' end='47' name='C'/>
+                        </Alias>
+                    </SingleUseStatementPart>
+                </GroupUseStatementPart>
+            </UseStatement>
+        </Statements>
+    </Program>
+</testresult>
diff --git a/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_02.pass b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_02.pass
new file mode 100644
index 0000000000..88a57cc6c8
--- /dev/null
+++ b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_02.pass
@@ -0,0 +1,95 @@
+<testresult testFile='groupUseTrailingCommas_02.php'>
+    <scanner>
+        <token id='T_USE' start='7' end='10'>
+            <text>use</text>
+        </token>
+        <token id='T_FUNCTION' start='11' end='19'>
+            <text>function</text>
+        </token>
+        <token id='T_STRING' start='20' end='24'>
+            <text>some</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='24' end='25'>
+            <text>\</text>
+        </token>
+        <token id='T_STRING' start='25' end='27'>
+            <text>ns</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='27' end='28'>
+            <text>\</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='28' end='29'>
+            <text>{</text>
+        </token>
+        <token id='T_STRING' start='29' end='33'>
+            <text>fn_a</text>
+        </token>
+        <token id='T_COMMA' start='33' end='34'>
+            <text>,</text>
+        </token>
+        <token id='T_STRING' start='35' end='39'>
+            <text>fn_b</text>
+        </token>
+        <token id='T_COMMA' start='39' end='40'>
+            <text>,</text>
+        </token>
+        <token id='T_STRING' start='41' end='45'>
+            <text>fn_c</text>
+        </token>
+        <token id='T_COMMA' start='45' end='46'>
+            <text>,</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='46' end='47'>
+            <text>}</text>
+        </token>
+        <token id='T_SEMICOLON' start='47' end='48'>
+            <text>;</text>
+        </token>
+        <token id='EOF' start='49' end='49'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='49'>
+        <Comments>
+        </Comments>
+        <Statements>
+            <UseStatement start='7' end='48' type='FUNCTION'>
+                <GroupUseStatementPart start='20' end='47'>
+                    <BaseNameSpace>
+                        <NamespaceName start='20' end='27' isCurrent='false' isGlobal='false'>
+                            <Identifier start='20' end='24' name='some'/>
+                            <Identifier start='25' end='27' name='ns'/>
+                        </NamespaceName>
+                    </BaseNameSpace>
+                    <SingleUseStatementPart start='29' end='33'>
+                        <Name>
+                            <NamespaceName start='29' end='33' isCurrent='false' isGlobal='false'>
+                                <Identifier start='29' end='33' name='fn_a'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='35' end='39'>
+                        <Name>
+                            <NamespaceName start='35' end='39' isCurrent='false' isGlobal='false'>
+                                <Identifier start='35' end='39' name='fn_b'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='41' end='45'>
+                        <Name>
+                            <NamespaceName start='41' end='45' isCurrent='false' isGlobal='false'>
+                                <Identifier start='41' end='45' name='fn_c'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                </GroupUseStatementPart>
+            </UseStatement>
+        </Statements>
+    </Program>
+</testresult>
diff --git a/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_03.pass b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_03.pass
new file mode 100644
index 0000000000..26f218bb6f
--- /dev/null
+++ b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_03.pass
@@ -0,0 +1,95 @@
+<testresult testFile='groupUseTrailingCommas_03.php'>
+    <scanner>
+        <token id='T_USE' start='7' end='10'>
+            <text>use</text>
+        </token>
+        <token id='T_CONST' start='11' end='16'>
+            <text>const</text>
+        </token>
+        <token id='T_STRING' start='17' end='21'>
+            <text>some</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='21' end='22'>
+            <text>\</text>
+        </token>
+        <token id='T_STRING' start='22' end='24'>
+            <text>ns</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='24' end='25'>
+            <text>\</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='25' end='26'>
+            <text>{</text>
+        </token>
+        <token id='T_STRING' start='26' end='32'>
+            <text>ConstA</text>
+        </token>
+        <token id='T_COMMA' start='32' end='33'>
+            <text>,</text>
+        </token>
+        <token id='T_STRING' start='34' end='40'>
+            <text>ConstB</text>
+        </token>
+        <token id='T_COMMA' start='40' end='41'>
+            <text>,</text>
+        </token>
+        <token id='T_STRING' start='42' end='48'>
+            <text>ConstC</text>
+        </token>
+        <token id='T_COMMA' start='48' end='49'>
+            <text>,</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='49' end='50'>
+            <text>}</text>
+        </token>
+        <token id='T_SEMICOLON' start='50' end='51'>
+            <text>;</text>
+        </token>
+        <token id='EOF' start='52' end='52'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='52'>
+        <Comments>
+        </Comments>
+        <Statements>
+            <UseStatement start='7' end='51' type='CONST'>
+                <GroupUseStatementPart start='17' end='50'>
+                    <BaseNameSpace>
+                        <NamespaceName start='17' end='24' isCurrent='false' isGlobal='false'>
+                            <Identifier start='17' end='21' name='some'/>
+                            <Identifier start='22' end='24' name='ns'/>
+                        </NamespaceName>
+                    </BaseNameSpace>
+                    <SingleUseStatementPart start='26' end='32'>
+                        <Name>
+                            <NamespaceName start='26' end='32' isCurrent='false' isGlobal='false'>
+                                <Identifier start='26' end='32' name='ConstA'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='34' end='40'>
+                        <Name>
+                            <NamespaceName start='34' end='40' isCurrent='false' isGlobal='false'>
+                                <Identifier start='34' end='40' name='ConstB'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='42' end='48'>
+                        <Name>
+                            <NamespaceName start='42' end='48' isCurrent='false' isGlobal='false'>
+                                <Identifier start='42' end='48' name='ConstC'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                </GroupUseStatementPart>
+            </UseStatement>
+        </Statements>
+    </Program>
+</testresult>
diff --git a/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_04.pass b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_04.pass
new file mode 100644
index 0000000000..5e3d6b3dca
--- /dev/null
+++ b/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/groupUseTrailingCommas_04.pass
@@ -0,0 +1,134 @@
+<testresult testFile='groupUseTrailingCommas_04.php'>
+    <scanner>
+        <token id='T_USE' start='7' end='10'>
+            <text>use</text>
+        </token>
+        <token id='T_STRING' start='11' end='14'>
+            <text>foo</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='14' end='15'>
+            <text>\</text>
+        </token>
+        <token id='T_STRING' start='15' end='19'>
+            <text>math</text>
+        </token>
+        <token id='T_NS_SEPARATOR' start='19' end='20'>
+            <text>\</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='20' end='21'>
+            <text>{</text>
+        </token>
+        <token id='T_STRING' start='22' end='26'>
+            <text>Math</text>
+        </token>
+        <token id='T_COMMA' start='26' end='27'>
+            <text>,</text>
+        </token>
+        <token id='T_CONST' start='28' end='33'>
+            <text>const</text>
+        </token>
+        <token id='T_STRING' start='34' end='36'>
+            <text>PI</text>
+        </token>
+        <token id='T_COMMA' start='36' end='37'>
+            <text>,</text>
+        </token>
+        <token id='T_FUNCTION' start='38' end='46'>
+            <text>function</text>
+        </token>
+        <token id='T_STRING' start='47' end='50'>
+            <text>sin</text>
+        </token>
+        <token id='T_COMMA' start='50' end='51'>
+            <text>,</text>
+        </token>
+        <token id='T_FUNCTION' start='52' end='60'>
+            <text>function</text>
+        </token>
+        <token id='T_STRING' start='61' end='64'>
+            <text>cos</text>
+        </token>
+        <token id='T_COMMA' start='64' end='65'>
+            <text>,</text>
+        </token>
+        <token id='T_FUNCTION' start='66' end='74'>
+            <text>function</text>
+        </token>
+        <token id='T_STRING' start='75' end='79'>
+            <text>cosh</text>
+        </token>
+        <token id='T_COMMA' start='79' end='80'>
+            <text>,</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='81' end='82'>
+            <text>}</text>
+        </token>
+        <token id='T_SEMICOLON' start='82' end='83'>
+            <text>;</text>
+        </token>
+        <token id='EOF' start='84' end='84'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='84'>
+        <Comments>
+        </Comments>
+        <Statements>
+            <UseStatement start='7' end='83' type='TYPE'>
+                <GroupUseStatementPart start='11' end='82'>
+                    <BaseNameSpace>
+                        <NamespaceName start='11' end='19' isCurrent='false' isGlobal='false'>
+                            <Identifier start='11' end='14' name='foo'/>
+                            <Identifier start='15' end='19' name='math'/>
+                        </NamespaceName>
+                    </BaseNameSpace>
+                    <SingleUseStatementPart start='22' end='26'>
+                        <Name>
+                            <NamespaceName start='22' end='26' isCurrent='false' isGlobal='false'>
+                                <Identifier start='22' end='26' name='Math'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='28' end='36' type='CONST'>
+                        <Name>
+                            <NamespaceName start='34' end='36' isCurrent='false' isGlobal='false'>
+                                <Identifier start='34' end='36' name='PI'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='38' end='50' type='FUNCTION'>
+                        <Name>
+                            <NamespaceName start='47' end='50' isCurrent='false' isGlobal='false'>
+                                <Identifier start='47' end='50' name='sin'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='52' end='64' type='FUNCTION'>
+                        <Name>
+                            <NamespaceName start='61' end='64' isCurrent='false' isGlobal='false'>
+                                <Identifier start='61' end='64' name='cos'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                    <SingleUseStatementPart start='66' end='79' type='FUNCTION'>
+                        <Name>
+                            <NamespaceName start='75' end='79' isCurrent='false' isGlobal='false'>
+                                <Identifier start='75' end='79' name='cosh'/>
+                            </NamespaceName>
+                        </Name>
+                        <Alias>
+                        </Alias>
+                    </SingleUseStatementPart>
+                </GroupUseStatementPart>
+            </UseStatement>
+        </Statements>
+    </Program>
+</testresult>
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences01.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences01.completion
index c3db3484d2..b9f2df9e3d 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences01.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences03.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences03.completion
index 6820baa8fb..669de69662 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences03.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences05.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences05.completion
index 4e3739fa29..4700335f7f 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences05.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences05.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences07.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences07.completion
index d671c5c58b..7bb8edfdf9 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences07.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences07.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences08.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences08.completion
index a68d6bd3a1..57082f669b 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences08.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences08.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences10.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences10.completion
index e2ff87a4e9..65ce8bf737 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences10.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences10.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences12.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences12.completion
index ea3d600a7c..b0dbfdfd8f 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences12.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences12.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences14.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences14.completion
index 2cf1715054..876cd1ad27 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences14.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences14.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences16.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences16.completion
index 0e09fd5bb1..1861af09d8 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences16.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences16.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences18.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences18.completion
index 0d48031774..b93046c442 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences18.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences18.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences20.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences20.completion
index f510817232..5a1772d4e9 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences20.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences20.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences22.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences22.completion
index 6550318faf..62282c7973 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences22.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences22.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences24.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences24.completion
index 47039870e3..b2c1b4341d 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences24.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences24.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences26.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences26.completion
index 6dad81d0bc..270b85317a 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences26.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences26.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences28.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences28.completion
index a786f59714..0542ce49f8 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences28.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences28.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences30.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences30.completion
index 2ceda4f486..5d0642312b 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences30.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences30.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences32.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences32.completion
index f00a204b19..6fc191e199 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences32.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences32.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences34.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences34.completion
index 006121d4f9..d40d2dae67 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences34.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences34.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences36.completion b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences36.completion
index 060a6e5392..339cdd4489 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences36.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/byReferences/byReferences.php.testByReferences36.completion
@@ -11,4 +11,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php
new file mode 100644
index 0000000000..a40d1b08c6
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php
@@ -0,0 +1,226 @@
+<?php
+
+/**
+ * @mixin C2
+ */
+class C1
+{
+    public const PUBLIC_CONST_C1 = "PUBLIC_CONST_C1";
+    private const PRIVATE_CONST_C1 = "PRIVATE_CONST_C1";
+    protected const PROTECTED_CONST_C1 = "PROTECTED_CONST_C1";
+
+    public $publicFieldC1;
+    private $privateFieldC1;
+    protected $protectedFieldC1;
+
+    public static $publicStaticFieldC1;
+    private static $privateStaticFieldC1;
+    protected static $protectedStaticFieldC1;
+
+    public function publicMethodC1()
+    {
+    }
+
+    private function privateMethodC1()
+    {
+    }
+
+    protected function protectedMethodC1()
+    {
+    }
+
+    public static function publicStaticMethodC1()
+    {
+    }
+
+    private static function privateStaticMethodC1()
+    {
+    }
+
+    protected static function protectedStaticMethodC1()
+    {
+    }
+}
+
+class C2
+{
+    public const PUBLIC_CONST_C2 = "PUBLIC_CONST_C2";
+    private const PRIVATE_CONST_C2 = "PRIVATE_CONST_C2";
+    protected const PROTECTED_CONST_C2 = "PROTECTED_CONST_C2";
+
+    public $publicFieldC2;
+    private $privateFieldC2;
+    protected $protectedFieldC2;
+
+    public static $publicStaticFieldC2;
+    private static $privateStaticFieldC2;
+    protected static $protectedStaticFieldC2;
+
+    public function publicMethodC2()
+    {
+    }
+
+    private function privateMethodC2()
+    {
+    }
+
+    protected function protectedMethodC2()
+    {
+    }
+
+    public static function publicStaticMethodC2()
+    {
+    }
+
+    private static function privateStaticMethodC2()
+    {
+    }
+
+    protected static function protectedStaticMethodC2()
+    {
+    }
+}
+
+class C3
+{
+    public const PUBLIC_CONST_C3 = "PUBLIC_CONST_C3";
+    private const PRIVATE_CONST_C3 = "PRIVATE_CONST_C3";
+    protected const PROTECTED_CONST_C3 = "PROTECTED_CONST_C3";
+
+    public $publicFieldC3;
+    private $privateFieldC3;
+    protected $protectedFieldC3;
+
+    public static $publicStaticFieldC3;
+    private static $privateStaticFieldC3;
+    protected static $protectedStaticFieldC3;
+
+    public function publicMethodC3()
+    {
+    }
+
+    private function privateMethodC3()
+    {
+    }
+
+    protected function protectedMethodC3()
+    {
+    }
+
+    public static function publicStaticMethodC3()
+    {
+    }
+
+    private static function privateStaticMethodC3()
+    {
+    }
+
+    protected static function protectedStaticMethodC3()
+    {
+    }
+}
+
+class C4
+{
+    public const PUBLIC_CONST_C4 = "PUBLIC_CONST_C4";
+    private const PRIVATE_CONST_C4 = "PRIVATE_CONST_C4";
+    protected const PROTECTED_CONST_C4 = "PROTECTED_CONST_C4";
+
+    public $publicFieldC4;
+    private $privateFieldC4;
+    protected $protectedFieldC4;
+
+    public static $publicStaticFieldC4;
+    private static $privateStaticFieldC4;
+    protected static $protectedStaticFieldC4;
+
+    public function publicMethodC4()
+    {
+    }
+
+    private function privateMethodC4()
+    {
+    }
+
+    protected function protectedMethodC4()
+    {
+    }
+
+    public static function publicStaticMethodC4()
+    {
+    }
+
+    private static function privateStaticMethodC4()
+    {
+    }
+
+    protected static function protectedStaticMethodC4()
+    {
+    }
+}
+
+class C5
+{
+    public const PUBLIC_CONST_C5 = "PUBLIC_CONST_C5";
+    private const PRIVATE_CONST_C5 = "PRIVATE_CONST_C5";
+    protected const PROTECTED_CONST_C5 = "PROTECTED_CONST_C5";
+
+    public $publicFieldC5;
+    private $privateFieldC5;
+    protected $protectedFieldC5;
+
+    public static $publicStaticFieldC5;
+    private static $privateStaticFieldC5;
+    protected static $protectedStaticFieldC5;
+
+    public function publicMethodC5()
+    {
+    }
+
+    private function privateMethodC5()
+    {
+    }
+
+    protected function protectedMethodC5()
+    {
+    }
+
+    public static function publicStaticMethodC5()
+    {
+    }
+
+    private static function privateStaticMethodC5()
+    {
+    }
+
+    protected static function protectedStaticMethodC5()
+    {
+    }
+}
+
+/**
+ * @mixin C3
+ */
+class MixinParent
+{
+    public function testParent()
+    {
+    }
+}
+
+/**
+ * @mixin C1
+ * @mixin C4|C5
+ */
+class Mixin extends MixinParent
+{
+    public function test()
+    {
+        $this->protectedMethodC1(); // CC
+        Mixin::protectedStaticMethodC1(); // CC
+    }
+}
+
+$mixin = new Mixin();
+$mixin->publicMethodC1(); // CC
+Mixin::publicStaticMethodC1(); // CC
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixin.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixin.completion
new file mode 100644
index 0000000000..476ffb0f83
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixin.completion
@@ -0,0 +1,20 @@
+Code completion result for source line:
+$mixin->|publicMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicMethodC1()                [PUBLIC]   C1
+METHOD     publicMethodC2()                [PUBLIC]   C2
+METHOD     publicMethodC3()                [PUBLIC]   C3
+METHOD     publicMethodC4()                [PUBLIC]   C4
+METHOD     publicMethodC5()                [PUBLIC]   C5
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+METHOD     publicStaticMethodC3()          [STATIC]   C3
+METHOD     publicStaticMethodC4()          [STATIC]   C4
+METHOD     publicStaticMethodC5()          [STATIC]   C5
+METHOD     test()                          [PUBLIC]   Mixin
+METHOD     testParent()                    [PUBLIC]   MixinParent
+VARIABLE   ? publicFieldC1                 [PUBLIC]   C1
+VARIABLE   ? publicFieldC2                 [PUBLIC]   C2
+VARIABLE   ? publicFieldC3                 [PUBLIC]   C3
+VARIABLE   ? publicFieldC4                 [PUBLIC]   C4
+VARIABLE   ? publicFieldC5                 [PUBLIC]   C5
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinEnclosing.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinEnclosing.completion
new file mode 100644
index 0000000000..ddb7a5e28d
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinEnclosing.completion
@@ -0,0 +1,35 @@
+Code completion result for source line:
+$this->|protectedMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     protectedMethodC1()             [PROTECTE  C1
+METHOD     protectedMethodC2()             [PROTECTE  C2
+METHOD     protectedMethodC3()             [PROTECTE  C3
+METHOD     protectedMethodC4()             [PROTECTE  C4
+METHOD     protectedMethodC5()             [PROTECTE  C5
+METHOD     protectedStaticMethodC1()       [PROTECTE  C1
+METHOD     protectedStaticMethodC2()       [PROTECTE  C2
+METHOD     protectedStaticMethodC3()       [PROTECTE  C3
+METHOD     protectedStaticMethodC4()       [PROTECTE  C4
+METHOD     protectedStaticMethodC5()       [PROTECTE  C5
+METHOD     publicMethodC1()                [PUBLIC]   C1
+METHOD     publicMethodC2()                [PUBLIC]   C2
+METHOD     publicMethodC3()                [PUBLIC]   C3
+METHOD     publicMethodC4()                [PUBLIC]   C4
+METHOD     publicMethodC5()                [PUBLIC]   C5
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+METHOD     publicStaticMethodC3()          [STATIC]   C3
+METHOD     publicStaticMethodC4()          [STATIC]   C4
+METHOD     publicStaticMethodC5()          [STATIC]   C5
+METHOD     test()                          [PUBLIC]   Mixin
+METHOD     testParent()                    [PUBLIC]   MixinParent
+VARIABLE   ? protectedFieldC1              [PROTECTE  C1
+VARIABLE   ? protectedFieldC2              [PROTECTE  C2
+VARIABLE   ? protectedFieldC3              [PROTECTE  C3
+VARIABLE   ? protectedFieldC4              [PROTECTE  C4
+VARIABLE   ? protectedFieldC5              [PROTECTE  C5
+VARIABLE   ? publicFieldC1                 [PUBLIC]   C1
+VARIABLE   ? publicFieldC2                 [PUBLIC]   C2
+VARIABLE   ? publicFieldC3                 [PUBLIC]   C3
+VARIABLE   ? publicFieldC4                 [PUBLIC]   C4
+VARIABLE   ? publicFieldC5                 [PUBLIC]   C5
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinEnclosingWithStaticAccess.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinEnclosingWithStaticAccess.completion
new file mode 100644
index 0000000000..231459d1e1
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinEnclosingWithStaticAccess.completion
@@ -0,0 +1,34 @@
+Code completion result for source line:
+Mixin::|protectedStaticMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     protectedStaticMethodC1()       [PROTECTE  C1
+METHOD     protectedStaticMethodC2()       [PROTECTE  C2
+METHOD     protectedStaticMethodC3()       [PROTECTE  C3
+METHOD     protectedStaticMethodC4()       [PROTECTE  C4
+METHOD     protectedStaticMethodC5()       [PROTECTE  C5
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+METHOD     publicStaticMethodC3()          [STATIC]   C3
+METHOD     publicStaticMethodC4()          [STATIC]   C4
+METHOD     publicStaticMethodC5()          [STATIC]   C5
+VARIABLE   ? $protectedStaticFieldC1       [PROTECTE  C1
+VARIABLE   ? $protectedStaticFieldC2       [PROTECTE  C2
+VARIABLE   ? $protectedStaticFieldC3       [PROTECTE  C3
+VARIABLE   ? $protectedStaticFieldC4       [PROTECTE  C4
+VARIABLE   ? $protectedStaticFieldC5       [PROTECTE  C5
+VARIABLE   ? $publicStaticFieldC1          [STATIC]   C1
+VARIABLE   ? $publicStaticFieldC2          [STATIC]   C2
+VARIABLE   ? $publicStaticFieldC3          [STATIC]   C3
+VARIABLE   ? $publicStaticFieldC4          [STATIC]   C4
+VARIABLE   ? $publicStaticFieldC5          [STATIC]   C5
+CONSTANT   PROTECTED_CONST_C1 "PROTECTED_  [PROTECTE  C1
+CONSTANT   PROTECTED_CONST_C2 "PROTECTED_  [PROTECTE  C2
+CONSTANT   PROTECTED_CONST_C3 "PROTECTED_  [PROTECTE  C3
+CONSTANT   PROTECTED_CONST_C4 "PROTECTED_  [PROTECTE  C4
+CONSTANT   PROTECTED_CONST_C5 "PROTECTED_  [PROTECTE  C5
+CONSTANT   PUBLIC_CONST_C1 "PUBLIC_CONST_  [PUBLIC]   C1
+CONSTANT   PUBLIC_CONST_C2 "PUBLIC_CONST_  [PUBLIC]   C2
+CONSTANT   PUBLIC_CONST_C3 "PUBLIC_CONST_  [PUBLIC]   C3
+CONSTANT   PUBLIC_CONST_C4 "PUBLIC_CONST_  [PUBLIC]   C4
+CONSTANT   PUBLIC_CONST_C5 "PUBLIC_CONST_  [PUBLIC]   C5
+CONSTANT   class \Mixin                    [PUBLIC]   Magic Constant
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinTagType.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinTagType.completion
new file mode 100644
index 0000000000..db55df29dd
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinTagType.completion
@@ -0,0 +1,31 @@
+Code completion result for source line:
+* @mixin |C3
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      C1                              [PUBLIC]   mixin.php
+CLASS      C2                              [PUBLIC]   mixin.php
+CLASS      C3                              [PUBLIC]   mixin.php
+CLASS      C4                              [PUBLIC]   mixin.php
+CLASS      C5                              [PUBLIC]   mixin.php
+CLASS      Mixin                           [PUBLIC]   mixin.php
+CLASS      MixinParent                     [PUBLIC]   mixin.php
+------------------------------------
+CLASS      FieldAccess                     [PUBLIC]   mixinFieldAccess.php
+KEYWORD    array                                      null
+KEYWORD    bool                                       null
+KEYWORD    boolean                                    null
+KEYWORD    callable                                   null
+KEYWORD    callback                                   null
+KEYWORD    double                                     null
+KEYWORD    false                                      null
+KEYWORD    float                                      null
+KEYWORD    int                                        null
+KEYWORD    integer                                    null
+KEYWORD    iterable                                   null
+KEYWORD    mixed                                      null
+KEYWORD    null                                       null
+KEYWORD    object                                     null
+KEYWORD    resource                                   null
+KEYWORD    self                                       null
+KEYWORD    string                                     null
+KEYWORD    true                                       null
+KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinWithStaticAccess.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinWithStaticAccess.completion
new file mode 100644
index 0000000000..a5286b94f1
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixin.php.testMixinWithStaticAccess.completion
@@ -0,0 +1,19 @@
+Code completion result for source line:
+Mixin::|publicStaticMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+METHOD     publicStaticMethodC3()          [STATIC]   C3
+METHOD     publicStaticMethodC4()          [STATIC]   C4
+METHOD     publicStaticMethodC5()          [STATIC]   C5
+VARIABLE   ? $publicStaticFieldC1          [STATIC]   C1
+VARIABLE   ? $publicStaticFieldC2          [STATIC]   C2
+VARIABLE   ? $publicStaticFieldC3          [STATIC]   C3
+VARIABLE   ? $publicStaticFieldC4          [STATIC]   C4
+VARIABLE   ? $publicStaticFieldC5          [STATIC]   C5
+CONSTANT   PUBLIC_CONST_C1 "PUBLIC_CONST_  [PUBLIC]   C1
+CONSTANT   PUBLIC_CONST_C2 "PUBLIC_CONST_  [PUBLIC]   C2
+CONSTANT   PUBLIC_CONST_C3 "PUBLIC_CONST_  [PUBLIC]   C3
+CONSTANT   PUBLIC_CONST_C4 "PUBLIC_CONST_  [PUBLIC]   C4
+CONSTANT   PUBLIC_CONST_C5 "PUBLIC_CONST_  [PUBLIC]   C5
+CONSTANT   class \Mixin                    [PUBLIC]   Magic Constant
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php
new file mode 100644
index 0000000000..764898f569
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * @property Mixin $Mixin Description
+ */
+class FieldAccess
+{
+    /**
+     * @var C1
+     */
+    public $C1;
+    public function __construct()
+    {
+    }
+}
+
+$fieldAccess = new FieldAccess();
+$fieldAccess->C1->publicMethodC1(); // CC
+$fieldAccess->Mixin->publicMethodC1(); // CC
+
+$fieldAccess->C1::publicStaticMethodC1(); // CC
+$fieldAccess->Mixin::publicStaticMethodC1(); // CC
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldAccess_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldAccess_01.completion
new file mode 100644
index 0000000000..92f23ac2c9
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldAccess_01.completion
@@ -0,0 +1,10 @@
+Code completion result for source line:
+$fieldAccess->C1->|publicMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+------------------------------------
+METHOD     publicMethodC1()                [PUBLIC]   C1
+METHOD     publicMethodC2()                [PUBLIC]   C2
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+VARIABLE   ? publicFieldC1                 [PUBLIC]   C1
+VARIABLE   ? publicFieldC2                 [PUBLIC]   C2
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldAccess_02.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldAccess_02.completion
new file mode 100644
index 0000000000..80aca54e1e
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldAccess_02.completion
@@ -0,0 +1,21 @@
+Code completion result for source line:
+$fieldAccess->Mixin->|publicMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+------------------------------------
+METHOD     publicMethodC1()                [PUBLIC]   C1
+METHOD     publicMethodC2()                [PUBLIC]   C2
+METHOD     publicMethodC3()                [PUBLIC]   C3
+METHOD     publicMethodC4()                [PUBLIC]   C4
+METHOD     publicMethodC5()                [PUBLIC]   C5
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+METHOD     publicStaticMethodC3()          [STATIC]   C3
+METHOD     publicStaticMethodC4()          [STATIC]   C4
+METHOD     publicStaticMethodC5()          [STATIC]   C5
+METHOD     test()                          [PUBLIC]   Mixin
+METHOD     testParent()                    [PUBLIC]   MixinParent
+VARIABLE   ? publicFieldC1                 [PUBLIC]   C1
+VARIABLE   ? publicFieldC2                 [PUBLIC]   C2
+VARIABLE   ? publicFieldC3                 [PUBLIC]   C3
+VARIABLE   ? publicFieldC4                 [PUBLIC]   C4
+VARIABLE   ? publicFieldC5                 [PUBLIC]   C5
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldStaticAccess_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldStaticAccess_01.completion
new file mode 100644
index 0000000000..5be7f961f3
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldStaticAccess_01.completion
@@ -0,0 +1,11 @@
+Code completion result for source line:
+$fieldAccess->C1::|publicStaticMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+------------------------------------
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+VARIABLE   ? $publicStaticFieldC1          [STATIC]   C1
+VARIABLE   ? $publicStaticFieldC2          [STATIC]   C2
+CONSTANT   PUBLIC_CONST_C1 "PUBLIC_CONST_  [PUBLIC]   C1
+CONSTANT   PUBLIC_CONST_C2 "PUBLIC_CONST_  [PUBLIC]   C2
+CONSTANT   class \C1                       [PUBLIC]   Magic Constant
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldStaticAccess_02.completion b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldStaticAccess_02.completion
new file mode 100644
index 0000000000..2ece8d13e9
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/mixin/mixinFieldAccess.php.testMixinFieldStaticAccess_02.completion
@@ -0,0 +1,20 @@
+Code completion result for source line:
+$fieldAccess->Mixin::|publicStaticMethodC1(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+------------------------------------
+METHOD     publicStaticMethodC1()          [STATIC]   C1
+METHOD     publicStaticMethodC2()          [STATIC]   C2
+METHOD     publicStaticMethodC3()          [STATIC]   C3
+METHOD     publicStaticMethodC4()          [STATIC]   C4
+METHOD     publicStaticMethodC5()          [STATIC]   C5
+VARIABLE   ? $publicStaticFieldC1          [STATIC]   C1
+VARIABLE   ? $publicStaticFieldC2          [STATIC]   C2
+VARIABLE   ? $publicStaticFieldC3          [STATIC]   C3
+VARIABLE   ? $publicStaticFieldC4          [STATIC]   C4
+VARIABLE   ? $publicStaticFieldC5          [STATIC]   C5
+CONSTANT   PUBLIC_CONST_C1 "PUBLIC_CONST_  [PUBLIC]   C1
+CONSTANT   PUBLIC_CONST_C2 "PUBLIC_CONST_  [PUBLIC]   C2
+CONSTANT   PUBLIC_CONST_C3 "PUBLIC_CONST_  [PUBLIC]   C3
+CONSTANT   PUBLIC_CONST_C4 "PUBLIC_CONST_  [PUBLIC]   C4
+CONSTANT   PUBLIC_CONST_C5 "PUBLIC_CONST_  [PUBLIC]   C5
+CONSTANT   class \Mixin                    [PUBLIC]   Magic Constant
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes11.completion b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes11.completion
index 880f45623b..0b25601124 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes11.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes11.completion
@@ -10,4 +10,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes14.completion b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes14.completion
index 632099fc7b..8e27c96089 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes14.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes14.completion
@@ -10,4 +10,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes5.completion b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes5.completion
index 1caf80ae71..2445e5d34f 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes5.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes5.completion
@@ -10,4 +10,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes8.completion b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes8.completion
index 1b41f4cb55..f4bab78f88 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes8.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/netbeans68version/paramdecltypes/paramdecltypes.php.testParamDeclTypes8.completion
@@ -10,4 +10,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_01.completion
index 9e4d04ebe7..b761fab3ef 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_01.completion
@@ -17,4 +17,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_03.completion
index f2a1ed171c..52fbda6e5b 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php54/callableTypeHint.php.testCallableTypeHint_03.completion
@@ -17,4 +17,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType01.completion
index 82a3a94fd2..2de1930af3 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType01.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType03.completion
index 8d676f81dc..3f200b0a9b 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType03.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType05.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType05.completion
index 338171802e..36d07f3c5e 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType05.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType05.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType07.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType07.completion
index e4e4bc96ad..df7f98c310 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType07.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType07.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType12.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType12.completion
index c6a98a904f..0dbfe00d6e 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType12.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType12.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType13.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType13.completion
index ef31f73aa5..bf7648d631 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType13.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType13.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType14.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType14.completion
index 7d56072a6f..525e9585bb 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType14.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypes.php.testReturnType14.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping01.php.testReturnTypesTyping01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping01.php.testReturnTypesTyping01.completion
index 4d737739b4..fed6959603 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping01.php.testReturnTypesTyping01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping01.php.testReturnTypesTyping01.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping02.php.testReturnTypesTyping02.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping02.php.testReturnTypesTyping02.completion
index 7757492ef0..5f777c5636 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping02.php.testReturnTypesTyping02.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping02.php.testReturnTypesTyping02.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping03.php.testReturnTypesTyping03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping03.php.testReturnTypesTyping03.completion
index 723839b1a2..f9585fb3e1 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping03.php.testReturnTypesTyping03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping03.php.testReturnTypesTyping03.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04a.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04a.completion
index 83767d1b9e..beb1a6b3d6 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04a.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04a.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04b.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04b.completion
index 7802ca19e4..83ca562fa2 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04b.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping04.php.testReturnTypesTyping04b.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping05.php.testReturnTypesTyping05.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping05.php.testReturnTypesTyping05.completion
index 5b8038e25d..9a2bc58e84 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping05.php.testReturnTypesTyping05.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping05.php.testReturnTypesTyping05.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping06.php.testReturnTypesTyping06.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping06.php.testReturnTypesTyping06.completion
index 1bcc59d2d3..36bd543016 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping06.php.testReturnTypesTyping06.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping06.php.testReturnTypesTyping06.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping07.php.testReturnTypesTyping07.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping07.php.testReturnTypesTyping07.completion
index 37d7d927ab..8430d7babf 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping07.php.testReturnTypesTyping07.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping07.php.testReturnTypesTyping07.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08a.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08a.completion
index 8d63cdaf50..59cb72ff06 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08a.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08a.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08b.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08b.completion
index 8760854239..419c06dc6e 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08b.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping08.php.testReturnTypesTyping08b.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping09.php.testReturnTypesTyping09.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping09.php.testReturnTypesTyping09.completion
index bc5321761a..bb26cfdf5c 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping09.php.testReturnTypesTyping09.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping09.php.testReturnTypesTyping09.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping10.php.testReturnTypesTyping10.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping10.php.testReturnTypesTyping10.completion
index 33e441efde..b7ca0cdbfa 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping10.php.testReturnTypesTyping10.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping10.php.testReturnTypesTyping10.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping11.php.testReturnTypesTyping11.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping11.php.testReturnTypesTyping11.completion
index 292d606a6d..b510c50ada 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping11.php.testReturnTypesTyping11.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping11.php.testReturnTypesTyping11.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12a.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12a.completion
index 20b2bdea5c..a0759862ec 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12a.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12a.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12b.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12b.completion
index e6b51872ff..088dffffd2 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12b.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/returnTypesTyping12.php.testReturnTypesTyping12b.completion
@@ -53,5 +53,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint01.completion
index 0971b33245..359be5b8a9 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint01.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint03.completion
index 4efe624f53..5f7881859a 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testBoolTypeHint03.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint01.completion
index 846c97fe90..b8c539426c 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint01.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint03.completion
index 65ab7d69b3..6e22ca5d1d 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testFloatTypeHint03.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint01.completion
index 04c135a7ac..100859c6a4 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint01.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint03.completion
index 86ac700580..d2e4396486 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testIntTypeHint03.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint01.completion
index fc73d7567f..f0e960f085 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint01.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint03.completion
index 51e28e79ba..d5f9ead559 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php70/base/scalarTypeHints.php.testStringTypeHint03.completion
@@ -53,4 +53,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType01.completion
index 33cfc438e3..86bf818346 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType01.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType03.completion
index c8284079e0..d4cd5117cd 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType03.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType07.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType07.completion
index 90c6c07da3..b3ac53fdcf 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType07.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType07.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType09.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType09.completion
index e2ffbd668d..ef8ff340e1 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType09.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType09.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType11.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType11.completion
index d52e0c8699..71deecf3f1 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType11.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType11.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType13.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType13.completion
index a18cb6e3e2..b2881fae2a 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType13.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ParameterType13.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType01.completion
index 94878c8024..1b8743e520 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType01.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType03.completion
index 189ea7c6e4..4b42a5f147 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType03.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType05.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType05.completion
index c5c405db5d..4aeeda4b0c 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType05.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType05.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType09.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType09.completion
index 57cf045a42..707667aed0 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType09.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType09.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType11.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType11.completion
index 4d703638c3..5843d3376e 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType11.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType11.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType13.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType13.completion
index 57fa84906a..72048557a2 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType13.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType13.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType15.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType15.completion
index 09fe1178eb..6e81d11d76 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType15.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/nullableTypes.php.testNullableTypes_ReturnType15.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType01.php.testNullableTypes_TypingParameterType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType01.php.testNullableTypes_TypingParameterType01.completion
index 53bf493afe..bd7b079496 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType01.php.testNullableTypes_TypingParameterType01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType01.php.testNullableTypes_TypingParameterType01.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType02.php.testNullableTypes_TypingParameterType02.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType02.php.testNullableTypes_TypingParameterType02.completion
index 32a2977e69..4bcf0055ba 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType02.php.testNullableTypes_TypingParameterType02.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType02.php.testNullableTypes_TypingParameterType02.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType03.php.testNullableTypes_TypingParameterType03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType03.php.testNullableTypes_TypingParameterType03.completion
index 99a7f6ca4e..f2544fc75d 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType03.php.testNullableTypes_TypingParameterType03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType03.php.testNullableTypes_TypingParameterType03.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType04.php.testNullableTypes_TypingParameterType04.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType04.php.testNullableTypes_TypingParameterType04.completion
index fb38fd524a..5b503d77d4 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType04.php.testNullableTypes_TypingParameterType04.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType04.php.testNullableTypes_TypingParameterType04.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType05.php.testNullableTypes_TypingParameterType05.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType05.php.testNullableTypes_TypingParameterType05.completion
index a538f73fa3..b124d4b63c 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType05.php.testNullableTypes_TypingParameterType05.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType05.php.testNullableTypes_TypingParameterType05.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType06.php.testNullableTypes_TypingParameterType06.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType06.php.testNullableTypes_TypingParameterType06.completion
index 827d769a1c..1ea995d693 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType06.php.testNullableTypes_TypingParameterType06.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType06.php.testNullableTypes_TypingParameterType06.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType07.php.testNullableTypes_TypingParameterType07.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType07.php.testNullableTypes_TypingParameterType07.completion
index a039c504f0..167d91bbdf 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType07.php.testNullableTypes_TypingParameterType07.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType07.php.testNullableTypes_TypingParameterType07.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType08.php.testNullableTypes_TypingParameterType08.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType08.php.testNullableTypes_TypingParameterType08.completion
index 95eb0a6cb1..6de27193c3 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType08.php.testNullableTypes_TypingParameterType08.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType08.php.testNullableTypes_TypingParameterType08.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType09.php.testNullableTypes_TypingParameterType09.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType09.php.testNullableTypes_TypingParameterType09.completion
index c1636106ac..6e23f0c2e8 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType09.php.testNullableTypes_TypingParameterType09.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType09.php.testNullableTypes_TypingParameterType09.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType10.php.testNullableTypes_TypingParameterType10.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType10.php.testNullableTypes_TypingParameterType10.completion
index 4daf32d13c..866cdb8578 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType10.php.testNullableTypes_TypingParameterType10.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType10.php.testNullableTypes_TypingParameterType10.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType11.php.testNullableTypes_TypingParameterType11.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType11.php.testNullableTypes_TypingParameterType11.completion
index a1580b95fa..5f4a1b88f7 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType11.php.testNullableTypes_TypingParameterType11.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType11.php.testNullableTypes_TypingParameterType11.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType12.php.testNullableTypes_TypingParameterType12.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType12.php.testNullableTypes_TypingParameterType12.completion
index b42c4576ee..9031881b9a 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType12.php.testNullableTypes_TypingParameterType12.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingParameterType12.php.testNullableTypes_TypingParameterType12.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType01.php.testNullableTypes_TypingReturnType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType01.php.testNullableTypes_TypingReturnType01.completion
index cfafea6ad2..1be37ae92e 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType01.php.testNullableTypes_TypingReturnType01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType01.php.testNullableTypes_TypingReturnType01.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType02.php.testNullableTypes_TypingReturnType02.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType02.php.testNullableTypes_TypingReturnType02.completion
index fa09085f58..7471a0b23d 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType02.php.testNullableTypes_TypingReturnType02.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType02.php.testNullableTypes_TypingReturnType02.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType03.php.testNullableTypes_TypingReturnType03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType03.php.testNullableTypes_TypingReturnType03.completion
index 5cd0a00ddb..8f2986b20e 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType03.php.testNullableTypes_TypingReturnType03.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType03.php.testNullableTypes_TypingReturnType03.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType04.php.testNullableTypes_TypingReturnType04.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType04.php.testNullableTypes_TypingReturnType04.completion
index ba05aa1fac..697798f426 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType04.php.testNullableTypes_TypingReturnType04.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType04.php.testNullableTypes_TypingReturnType04.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType05.php.testNullableTypes_TypingReturnType05.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType05.php.testNullableTypes_TypingReturnType05.completion
index 8f974ce203..382cfdfaa4 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType05.php.testNullableTypes_TypingReturnType05.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType05.php.testNullableTypes_TypingReturnType05.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType06.php.testNullableTypes_TypingReturnType06.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType06.php.testNullableTypes_TypingReturnType06.completion
index 18c8b5d702..1c1969d1f9 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType06.php.testNullableTypes_TypingReturnType06.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType06.php.testNullableTypes_TypingReturnType06.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType07.php.testNullableTypes_TypingReturnType07.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType07.php.testNullableTypes_TypingReturnType07.completion
index ce1ccd14e0..16e469b192 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType07.php.testNullableTypes_TypingReturnType07.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType07.php.testNullableTypes_TypingReturnType07.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType08.php.testNullableTypes_TypingReturnType08.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType08.php.testNullableTypes_TypingReturnType08.completion
index ac8e67f4b7..b41c8c61f7 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType08.php.testNullableTypes_TypingReturnType08.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType08.php.testNullableTypes_TypingReturnType08.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType09.php.testNullableTypes_TypingReturnType09.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType09.php.testNullableTypes_TypingReturnType09.completion
index 412ab6516f..5e8d346b42 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType09.php.testNullableTypes_TypingReturnType09.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType09.php.testNullableTypes_TypingReturnType09.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType10.php.testNullableTypes_TypingReturnType10.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType10.php.testNullableTypes_TypingReturnType10.completion
index 94a07c6884..ae83e3cb17 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType10.php.testNullableTypes_TypingReturnType10.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType10.php.testNullableTypes_TypingReturnType10.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType11.php.testNullableTypes_TypingReturnType11.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType11.php.testNullableTypes_TypingReturnType11.completion
index 45a9582bc2..e90183031b 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType11.php.testNullableTypes_TypingReturnType11.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType11.php.testNullableTypes_TypingReturnType11.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType12.php.testNullableTypes_TypingReturnType12.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType12.php.testNullableTypes_TypingReturnType12.completion
index 5aba205fa8..94c4d795a0 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType12.php.testNullableTypes_TypingReturnType12.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypes/typingReturnType12.php.testNullableTypes_TypingReturnType12.completion
@@ -29,4 +29,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType04.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType04.completion
index 1fe61efd53..9b54549b83 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType04.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType04.completion
@@ -9,4 +9,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType06.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType06.completion
index 6b9ff20e17..df741ee2db 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType06.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testNullableTypesInPHPDoc/nullableTypesInPHPDoc.php.testNullableTypesInPHPDoc_NullableType06.completion
@@ -9,4 +9,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Class01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Class01.completion
index 78ea8b1d1a..6d4b0f5df9 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Class01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Class01.completion
@@ -10,5 +10,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Function01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Function01.completion
index 269f4269a8..7ebe817ea0 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Function01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Function01.completion
@@ -10,5 +10,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Interface01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Interface01.completion
index 549dfd9fe6..14ba710397 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Interface01.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php71/testVoidReturnType/voidReturnType.php.testVoidReturnType_Interface01.completion
@@ -10,5 +10,6 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
 KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php
new file mode 100644
index 0000000000..57369d8418
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php
@@ -0,0 +1,18 @@
+<?php
+
+function parameterType01() {
+}
+
+function parameterType02(object $arg) {
+}
+
+function returnType01(object $arg): object {
+}
+
+function returnType02(object $arg):  {
+}
+
+class ObjectClass {
+    function __construct(object $arg) {
+    }
+}
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType01.completion
new file mode 100644
index 0000000000..283df9c6b2
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType01.completion
@@ -0,0 +1,13 @@
+Code completion result for source line:
+function parameterType01(|) {
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      ObjectClass                     [PUBLIC]   objectTypeHint.php
+------------------------------------
+KEYWORD    array                                      null
+KEYWORD    bool                                       null
+KEYWORD    callable                                   null
+KEYWORD    float                                      null
+KEYWORD    int                                        null
+KEYWORD    iterable                                   null
+KEYWORD    object                                     null
+KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType02.completion b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType02.completion
new file mode 100644
index 0000000000..01cf41fa40
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType02.completion
@@ -0,0 +1,6 @@
+Code completion result for source line:
+function parameterType02(obje|ct $arg) {
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      ObjectClass                     [PUBLIC]   objectTypeHint.php
+------------------------------------
+KEYWORD    object                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType03.completion b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType03.completion
new file mode 100644
index 0000000000..6540204572
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ParameterType03.completion
@@ -0,0 +1,6 @@
+Code completion result for source line:
+function __construct(obj|ect $arg) {
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      ObjectClass                     [PUBLIC]   objectTypeHint.php
+------------------------------------
+KEYWORD    object                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ReturnType01.completion b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ReturnType01.completion
new file mode 100644
index 0000000000..889172db5f
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ReturnType01.completion
@@ -0,0 +1,6 @@
+Code completion result for source line:
+function returnType01(object $arg): ob|ject {
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      ObjectClass                     [PUBLIC]   objectTypeHint.php
+------------------------------------
+KEYWORD    object                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ReturnType02.completion b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ReturnType02.completion
new file mode 100644
index 0000000000..fa968ada7e
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/php72/testObjectTypeHint/objectTypeHint.php.testObjectTypeHint_ReturnType02.completion
@@ -0,0 +1,14 @@
+Code completion result for source line:
+function returnType02(object $arg): | {
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      ObjectClass                     [PUBLIC]   objectTypeHint.php
+------------------------------------
+KEYWORD    array                                      null
+KEYWORD    bool                                       null
+KEYWORD    callable                                   null
+KEYWORD    float                                      null
+KEYWORD    int                                        null
+KEYWORD    iterable                                   null
+KEYWORD    object                                     null
+KEYWORD    string                                     null
+KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/test204958/issue204958.php.testUseCase1.completion b/php.editor/test/unit/data/testfiles/completion/lib/test204958/issue204958.php.testUseCase1.completion
index 71370b6a76..4743afc866 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/test204958/issue204958.php.testUseCase1.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/test204958/issue204958.php.testUseCase1.completion
@@ -12,4 +12,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase1.completion b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase1.completion
index 39bdd84a29..972be0e07a 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase1.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase1.completion
@@ -13,4 +13,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase2.completion b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase2.completion
index 09573937f0..d8e5b32ab0 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase2.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase2.completion
@@ -13,4 +13,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase3.completion b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase3.completion
index e59c256981..fcee559025 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase3.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase3.completion
@@ -13,4 +13,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase4.completion b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase4.completion
index 09573937f0..d8e5b32ab0 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase4.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/tests225089/tests225089.php.testUseCase4.completion
@@ -13,4 +13,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_01.php.testUseCase1.completion b/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_01.php.testUseCase1.completion
index 04eaddb740..90a2f484b5 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_01.php.testUseCase1.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_01.php.testUseCase1.completion
@@ -10,4 +10,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_02.php.testUseCase2.completion b/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_02.php.testUseCase2.completion
index b2f64def4d..0d2e9ba521 100644
--- a/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_02.php.testUseCase2.completion
+++ b/php.editor/test/unit/data/testfiles/completion/lib/tests242398/issue242398_02.php.testUseCase2.completion
@@ -10,4 +10,5 @@ KEYWORD    callable                                   null
 KEYWORD    float                                      null
 KEYWORD    int                                        null
 KEYWORD    iterable                                   null
+KEYWORD    object                                     null
 KEYWORD    string                                     null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php
new file mode 100644
index 0000000000..df27474fdf
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php
@@ -0,0 +1,20 @@
+<?php
+
+class VarType
+{
+    const CONSTANT = "CONSTANT";
+    public $publicField = "publicField";
+
+    public function test()
+    {
+    }
+}
+
+/** @var VarType $varType */
+$varType = getVarType();
+$varType->test(); // CC
+
+/** @var VarType $value */
+foreach ($array as $value) {
+    $value->test(); // CC
+}
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVarTagType_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVarTagType_01.completion
new file mode 100644
index 0000000000..239583d4ec
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVarTagType_01.completion
@@ -0,0 +1,24 @@
+Code completion result for source line:
+/** @var |VarType $varType */
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CLASS      VarType                         [PUBLIC]   vardoc.php
+------------------------------------
+KEYWORD    array                                      null
+KEYWORD    bool                                       null
+KEYWORD    boolean                                    null
+KEYWORD    callable                                   null
+KEYWORD    callback                                   null
+KEYWORD    double                                     null
+KEYWORD    false                                      null
+KEYWORD    float                                      null
+KEYWORD    int                                        null
+KEYWORD    integer                                    null
+KEYWORD    iterable                                   null
+KEYWORD    mixed                                      null
+KEYWORD    null                                       null
+KEYWORD    object                                     null
+KEYWORD    resource                                   null
+KEYWORD    self                                       null
+KEYWORD    string                                     null
+KEYWORD    true                                       null
+KEYWORD    void                                       null
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_01.completion
new file mode 100644
index 0000000000..b97cdeb692
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_01.completion
@@ -0,0 +1,5 @@
+Code completion result for source line:
+$varType->|test(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     test()                          [PUBLIC]   VarType
+VARIABLE   ? publicField                   [PUBLIC]   VarType
diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_02.completion b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_02.completion
new file mode 100644
index 0000000000..6f1c1e2b35
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_02.completion
@@ -0,0 +1,5 @@
+Code completion result for source line:
+$value->|test(); // CC
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     test()                          [PUBLIC]   VarType
+VARIABLE   ? publicField                   [PUBLIC]   VarType
diff --git a/php.editor/test/unit/data/testfiles/finally_01.php.folds b/php.editor/test/unit/data/testfiles/finally_01.php.folds
index 61c56649f6..da746913be 100644
--- a/php.editor/test/unit/data/testfiles/finally_01.php.folds
+++ b/php.editor/test/unit/data/testfiles/finally_01.php.folds
@@ -1,5 +1,5 @@
-  <?php
-  
++ <?php
+| 
 + try {
 |     echo "";
 + } catch (Exception $ex) {
@@ -7,5 +7,5 @@
 + } finally {
 |     echo "";
 - }
-  
-  ?>
+| 
+- ?>
diff --git a/php.editor/test/unit/data/testfiles/finally_02.php.folds b/php.editor/test/unit/data/testfiles/finally_02.php.folds
index 55376ee0d7..66c8f68bb4 100644
--- a/php.editor/test/unit/data/testfiles/finally_02.php.folds
+++ b/php.editor/test/unit/data/testfiles/finally_02.php.folds
@@ -1,9 +1,9 @@
-  <?php
-  
++ <?php
+| 
 + try {
 |     echo "";
 + } catch (Exception $ex) {
 |     echo "";
 - }
-  
-  ?>
+| 
+- ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingConditionalStatements.php.folds b/php.editor/test/unit/data/testfiles/foldingConditionalStatements.php.folds
index 71dc86df47..ae00f00dbb 100644
--- a/php.editor/test/unit/data/testfiles/foldingConditionalStatements.php.folds
+++ b/php.editor/test/unit/data/testfiles/foldingConditionalStatements.php.folds
@@ -40,4 +40,3 @@
 | 
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingConditionalStatements_1.php.folds b/php.editor/test/unit/data/testfiles/foldingConditionalStatements_1.php.folds
index 3f95d00434..bbf0d7eee8 100644
--- a/php.editor/test/unit/data/testfiles/foldingConditionalStatements_1.php.folds
+++ b/php.editor/test/unit/data/testfiles/foldingConditionalStatements_1.php.folds
@@ -52,4 +52,3 @@
 | 
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingCycles.php.folds b/php.editor/test/unit/data/testfiles/foldingCycles.php.folds
index b8c4057439..f3e194a14f 100644
--- a/php.editor/test/unit/data/testfiles/foldingCycles.php.folds
+++ b/php.editor/test/unit/data/testfiles/foldingCycles.php.folds
@@ -60,4 +60,3 @@
 | 
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingCycles_1.php.folds b/php.editor/test/unit/data/testfiles/foldingCycles_1.php.folds
index 1e9d4dfe48..7939ab7bed 100644
--- a/php.editor/test/unit/data/testfiles/foldingCycles_1.php.folds
+++ b/php.editor/test/unit/data/testfiles/foldingCycles_1.php.folds
@@ -76,4 +76,3 @@
 | 
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingMethod.php.folds b/php.editor/test/unit/data/testfiles/foldingMethod.php.folds
index fea31dfcef..1fec3d1e90 100644
--- a/php.editor/test/unit/data/testfiles/foldingMethod.php.folds
+++ b/php.editor/test/unit/data/testfiles/foldingMethod.php.folds
@@ -20,4 +20,3 @@
 |     
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingMethod_1.php.folds b/php.editor/test/unit/data/testfiles/foldingMethod_1.php.folds
index b942c4f9a3..1c710a2fad 100644
--- a/php.editor/test/unit/data/testfiles/foldingMethod_1.php.folds
+++ b/php.editor/test/unit/data/testfiles/foldingMethod_1.php.folds
@@ -25,4 +25,3 @@
 | 
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/foldingPHPTags.php.folds b/php.editor/test/unit/data/testfiles/foldingPHPTags.php.folds
new file mode 100644
index 0000000000..c1672784d5
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/foldingPHPTags.php.folds
@@ -0,0 +1,19 @@
+  <html>
+      <body>
+          <h2>Test</h2>
+          <?= "test" ?>
++         <?php echo "test" ?>
+          <?= "test" ?>
+  
+          <h2>Test</h2>
++         <?php
++         /**
+|          * Get date.
+|          *
+|          * Description.
+-          */
+|         $date = getdate();
+|         echo $date; // comment
+-         ?>
+      </body>
+  </html>
diff --git a/php.editor/test/unit/data/testfiles/foldingUses.php.folds b/php.editor/test/unit/data/testfiles/foldingUses.php.folds
new file mode 100644
index 0000000000..234eae65e2
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/foldingUses.php.folds
@@ -0,0 +1,36 @@
+  <?php
+  namespace A;
+  
++ use App\Test1;
+| use App\Test2;
+| 
+| 
+| use App\Test3;
+| use App\{
+|     Test4,
+|     Test5
+- };
+  
++ function functionName($param) {
+|     
+- }
+  
++ use App\{
+|     Test6
+| };
+- use App\Test7;
+  
+  namespace B;
+  
++ use App\Test2;
+  
++ function functionName($param) {
+|     
+- }
+  
++ use const App\Test3\CONSTANT;
+| use function App\{
+|     test1,
+|     test2
+- };
+  
diff --git a/php.editor/test/unit/data/testfiles/gotodeclaration/testGroupUseTrailingCommas/testGroupUseTrailingCommas.php b/php.editor/test/unit/data/testfiles/gotodeclaration/testGroupUseTrailingCommas/testGroupUseTrailingCommas.php
new file mode 100644
index 0000000000..d74dc92af0
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/gotodeclaration/testGroupUseTrailingCommas/testGroupUseTrailingCommas.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace A;
+
+class Foo {
+    
+}
+
+class Bar {
+    
+}
+
+namespace A\B;
+
+class Baz {
+    
+}
+
+namespace C;
+
+use A\{
+    Foo,
+    Bar,
+    B\Baz,
+};
+
+$foo = new Foo();
+$bar = new Bar();
+$baz = new Baz();
diff --git a/php.editor/test/unit/data/testfiles/gotodeclaration/testMixin/testMixin.php b/php.editor/test/unit/data/testfiles/gotodeclaration/testMixin/testMixin.php
new file mode 100644
index 0000000000..542b039efa
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/gotodeclaration/testMixin/testMixin.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Mixin\A;
+
+/**
+ * @mixin MixinA2
+ */
+class MixinA1
+{
+}
+
+class MixinA2
+{
+}
+
+namespace Mixin\B;
+
+/**
+ * @mixin \Mixin\A\MixinA1
+ */
+class MixinB1
+{
+}
+
+/**
+ * @mixin \Mixin\A\MixinA2|MixinB1
+ */
+class MixinB2
+{
+}
diff --git a/php.editor/test/unit/data/testfiles/gotodeclaration/testVardoc/testVardoc.php b/php.editor/test/unit/data/testfiles/gotodeclaration/testVardoc/testVardoc.php
new file mode 100644
index 0000000000..b05e3b48d1
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/gotodeclaration/testVardoc/testVardoc.php
@@ -0,0 +1,24 @@
+<?php
+
+class VarType
+{
+    const CONSTANT = "CONSTANT";
+    public $publicField = "publicField";
+
+    public function test()
+    {
+    }
+}
+
+/** @var VarType $varType */
+$varType = getVarType();
+$varType->test();
+
+/* @var  $varType2   VarType  */
+$varType2 = getVarType();
+$varType2->test();
+
+/** @var    VarType    $value */
+foreach ($array as $value) {
+    $value->test();
+}
diff --git a/php.editor/test/unit/data/testfiles/index/testClassConstantVisibility/testClassConstantVisibility.php.indexed b/php.editor/test/unit/data/testfiles/index/testClassConstantVisibility/testClassConstantVisibility.php.indexed
index 687208e8a0..944ba154bd 100644
--- a/php.editor/test/unit/data/testfiles/index/testClassConstantVisibility/testClassConstantVisibility.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testClassConstantVisibility/testClassConstantVisibility.php.indexed
@@ -8,7 +8,7 @@ Not Searchable Keys:
 
 Document 1
 Searchable Keys:
-  clz : classconstantvisibility;ClassConstantVisibility;13;;;;1;;0;<TESTURL>/testClassConstantVisibility.php;
+  clz : classconstantvisibility;ClassConstantVisibility;13;;;;1;;0;<TESTURL>/testClassConstantVisibility.php;;
   clz.const : implicit_public_const;IMPLICIT_PUBLIC_CONST;50;0;0;<TESTURL>/testClassConstantVisibility.php;32;
   clz.const : private_bar;PRIVATE_BAR;225;?;0;<TESTURL>/testClassConstantVisibility.php;2;
   clz.const : private_const;PRIVATE_CONST;130;2;0;<TESTURL>/testClassConstantVisibility.php;2;
diff --git a/php.editor/test/unit/data/testfiles/index/testGetClasses/testGetClasses.php.indexed b/php.editor/test/unit/data/testfiles/index/testGetClasses/testGetClasses.php.indexed
index ccb3f2930c..9630ed4a02 100644
--- a/php.editor/test/unit/data/testfiles/index/testGetClasses/testGetClasses.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testGetClasses/testGetClasses.php.indexed
@@ -8,7 +8,7 @@ Not Searchable Keys:
 
 Document 1
 Searchable Keys:
-  clz : aaa;AAA;12;;;IAAA|\IAAA;1;;0;<TESTURL>/testGetClasses.php;
+  clz : aaa;AAA;12;;;IAAA|\IAAA;1;;0;<TESTURL>/testGetClasses.php;;
   superiface : iaaa;IAAA;
   top : aaa
 
@@ -17,7 +17,7 @@ Not Searchable Keys:
 
 Document 2
 Searchable Keys:
-  clz : bbb;BBB;40;AAA|\AAA;;IBBB|\IBBB;1;;0;<TESTURL>/testGetClasses.php;
+  clz : bbb;BBB;40;AAA|\AAA;;IBBB|\IBBB;1;;0;<TESTURL>/testGetClasses.php;;
   superclz : aaa;AAA;
   superiface : ibbb;IBBB;
   top : bbb
@@ -27,7 +27,7 @@ Not Searchable Keys:
 
 Document 3
 Searchable Keys:
-  clz : ccc;CCC;80;BBB|\BBB;;ICCC|\ICCC;1;;0;<TESTURL>/testGetClasses.php;
+  clz : ccc;CCC;80;BBB|\BBB;;ICCC|\ICCC;1;;0;<TESTURL>/testGetClasses.php;;
   superclz : bbb;BBB;
   superiface : iccc;ICCC;
   top : ccc
diff --git a/php.editor/test/unit/data/testfiles/index/testGetClassesWithNsInterfaces/testGetClassesWithNsInterfaces.php.indexed b/php.editor/test/unit/data/testfiles/index/testGetClassesWithNsInterfaces/testGetClassesWithNsInterfaces.php.indexed
index abb2dd6e71..9b2ab71c70 100644
--- a/php.editor/test/unit/data/testfiles/index/testGetClassesWithNsInterfaces/testGetClassesWithNsInterfaces.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testGetClassesWithNsInterfaces/testGetClassesWithNsInterfaces.php.indexed
@@ -2,7 +2,7 @@
 
 Document 0
 Searchable Keys:
-  clz : nonsclassname;NoNsClassName;132;;No\Ns;NsInterfaceName|\NsFoo\NsBar\NsInterfaceName;1;;0;<TESTURL>/testGetClassesWithNsInterfaces.php;
+  clz : nonsclassname;NoNsClassName;132;;No\Ns;NsInterfaceName|\NsFoo\NsBar\NsInterfaceName;1;;0;<TESTURL>/testGetClassesWithNsInterfaces.php;;
   superiface : nsinterfacename;NsInterfaceName;NsFoo\NsBar
   top : nonsclassname
 
diff --git a/php.editor/test/unit/data/testfiles/index/testGetFunctions/testGetFunctions.php.indexed b/php.editor/test/unit/data/testfiles/index/testGetFunctions/testGetFunctions.php.indexed
index 4afa6b6f36..77c425a46c 100644
--- a/php.editor/test/unit/data/testfiles/index/testGetFunctions/testGetFunctions.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testGetFunctions/testGetFunctions.php.indexed
@@ -14,7 +14,7 @@ Not Searchable Keys:
 
 Document 1
 Searchable Keys:
-  clz : parameterclass;ParameterClass;14;;;;1;;0;<TESTURL>/testGetFunctions.php;
+  clz : parameterclass;ParameterClass;14;;;;1;;0;<TESTURL>/testGetFunctions.php;;
   top : parameterclass
 
 Not Searchable Keys:
diff --git a/php.editor/test/unit/data/testfiles/index/testGetMethods/testGetMethods.php.indexed b/php.editor/test/unit/data/testfiles/index/testGetMethods/testGetMethods.php.indexed
index 967006bbce..e4f006ede1 100644
--- a/php.editor/test/unit/data/testfiles/index/testGetMethods/testGetMethods.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testGetMethods/testGetMethods.php.indexed
@@ -8,7 +8,7 @@ Not Searchable Keys:
 
 Document 1
 Searchable Keys:
-  clz : testmethoddeclaration;testMethodDeclaration;12;;;;1;;0;<TESTURL>/testGetMethods.php;
+  clz : testmethoddeclaration;testMethodDeclaration;12;;;;1;;0;<TESTURL>/testGetMethods.php;;
   method : testmethoddeclaration;testMethodDeclaration;56;;;1;0;<TESTURL>/testGetMethods.php;
   top : testmethoddeclaration
 
diff --git a/php.editor/test/unit/data/testfiles/index/testIssue240824/testIssue240824.php.indexed b/php.editor/test/unit/data/testfiles/index/testIssue240824/testIssue240824.php.indexed
index c67d5c7e16..f408bc366e 100644
--- a/php.editor/test/unit/data/testfiles/index/testIssue240824/testIssue240824.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testIssue240824/testIssue240824.php.indexed
@@ -8,7 +8,7 @@ Not Searchable Keys:
 
 Document 1
 Searchable Keys:
-  clz : myconfig;MyConfig;13;;;;1;;0;<TESTURL>/testIssue240824.php;
+  clz : myconfig;MyConfig;13;;;;1;;0;<TESTURL>/testIssue240824.php;;
   method : functionname;functionName;109;$param::0::1:0:0;;1;0;<TESTURL>/testIssue240824.php;
   top : myconfig
 
diff --git a/php.editor/test/unit/data/testfiles/index/testMixin/testMixin.php b/php.editor/test/unit/data/testfiles/index/testMixin/testMixin.php
new file mode 100644
index 0000000000..2179784d49
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/index/testMixin/testMixin.php
@@ -0,0 +1,34 @@
+<?php
+namespace A;
+
+/**
+ * @mixin B\C3|C2
+ */
+class C1
+{
+}
+
+class C2
+{
+}
+
+namespace A\B;
+class C3
+{
+}
+
+namespace Mixin;
+
+/**
+ * @mixin \A\B\C3
+ */
+class MixinParent
+{
+}
+
+/**
+ * @mixin \A\C1
+ */
+class Mixin extends MixinParent
+{
+}
diff --git a/php.editor/test/unit/data/testfiles/index/testMixin/testMixin.php.indexed b/php.editor/test/unit/data/testfiles/index/testMixin/testMixin.php.indexed
new file mode 100644
index 0000000000..9890efef9a
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/index/testMixin/testMixin.php.indexed
@@ -0,0 +1,73 @@
+
+
+Document 0
+Searchable Keys:
+  clz : c1;C1;52;;A;;1;;0;<TESTURL>/testMixin.php;\A\B\C3,\A\C2;
+  top : c1
+
+Not Searchable Keys:
+
+
+Document 1
+Searchable Keys:
+  clz : c2;C2;66;;A;;1;;0;<TESTURL>/testMixin.php;;
+  top : c2
+
+Not Searchable Keys:
+
+
+Document 2
+Searchable Keys:
+  clz : c3;C3;95;;A\B;;1;;0;<TESTURL>/testMixin.php;;
+  top : c3
+
+Not Searchable Keys:
+
+
+Document 3
+Searchable Keys:
+  clz : mixin;Mixin;200;MixinParent|\Mixin\MixinParent;Mixin;;1;;0;<TESTURL>/testMixin.php;\A\C1;
+  superclz : mixinparent;MixinParent;Mixin
+  top : mixin
+
+Not Searchable Keys:
+
+
+Document 4
+Searchable Keys:
+  clz : mixinparent;MixinParent;153;;Mixin;;1;;0;<TESTURL>/testMixin.php;\A\B\C3;
+  top : mixinparent
+
+Not Searchable Keys:
+
+
+Document 5
+Searchable Keys:
+  identifier_used : a;
+  identifier_used : a;
+  identifier_used : b;
+  identifier_used : c1;
+  identifier_used : c1;
+  identifier_used : c2;
+  identifier_used : c2;
+  identifier_used : c3;
+  identifier_used : c3;
+  identifier_used : c3;
+  identifier_used : mixin;
+  identifier_used : mixin;
+  identifier_used : mixinparent;
+  identifier_used : mixinparent;
+
+Not Searchable Keys:
+
+
+Document 6
+Searchable Keys:
+  ns : a;A;;0;<TESTURL>/testMixin.php;
+  ns : b;B;A;0;<TESTURL>/testMixin.php;
+  ns : mixin;Mixin;;0;<TESTURL>/testMixin.php;
+  top : a
+  top : a\b
+  top : mixin
+
+Not Searchable Keys:
diff --git a/php.editor/test/unit/data/testfiles/index/testNullableTypesForMethods/testNullableTypesForMethods.php.indexed b/php.editor/test/unit/data/testfiles/index/testNullableTypesForMethods/testNullableTypesForMethods.php.indexed
index bce4882c68..bfd8427392 100644
--- a/php.editor/test/unit/data/testfiles/index/testNullableTypesForMethods/testNullableTypesForMethods.php.indexed
+++ b/php.editor/test/unit/data/testfiles/index/testNullableTypesForMethods/testNullableTypesForMethods.php.indexed
@@ -8,7 +8,7 @@ Not Searchable Keys:
 
 Document 1
 Searchable Keys:
-  clz : nullabletypes;NullableTypes;12;;;;1;;0;<TESTURL>/testNullableTypesForMethods.php;
+  clz : nullabletypes;NullableTypes;12;;;;1;;0;<TESTURL>/testNullableTypesForMethods.php;;
   method : parametertype;parameterType;49;$param:?string:1::1:0:0;;1;0;<TESTURL>/testNullableTypesForMethods.php;
   method : parametertypestatic;parameterTypeStatic;115;$param:?string:1::1:0:0;;9;0;<TESTURL>/testNullableTypesForMethods.php;
   method : returntype;returnType;180;$num:int:1::1:0:0;?\Foo;1;0;<TESTURL>/testNullableTypesForMethods.php;
diff --git a/php.editor/test/unit/data/testfiles/issue213616.php.folds b/php.editor/test/unit/data/testfiles/issue213616.php.folds
index bd0a6dfb3e..a45626bac8 100644
--- a/php.editor/test/unit/data/testfiles/issue213616.php.folds
+++ b/php.editor/test/unit/data/testfiles/issue213616.php.folds
@@ -7,4 +7,3 @@
 - 	}
 - }
   
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/issue216088.php.folds b/php.editor/test/unit/data/testfiles/issue216088.php.folds
index 23b195bcd7..fa4bdd07c4 100644
--- a/php.editor/test/unit/data/testfiles/issue216088.php.folds
+++ b/php.editor/test/unit/data/testfiles/issue216088.php.folds
@@ -4,4 +4,3 @@
 +     echo "";
   else
 +     echo "";
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/issue232884.php.folds b/php.editor/test/unit/data/testfiles/issue232884.php.folds
index cd0cdb16e8..8f4f947698 100644
--- a/php.editor/test/unit/data/testfiles/issue232884.php.folds
+++ b/php.editor/test/unit/data/testfiles/issue232884.php.folds
@@ -3,4 +3,3 @@
   if (TRUE):
   
   endif;
-  ?>
diff --git a/php.editor/test/unit/data/testfiles/lexer/object_type_01.php b/php.editor/test/unit/data/testfiles/lexer/object_type_01.php
new file mode 100644
index 0000000000..1d1af9ae15
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/lexer/object_type_01.php
@@ -0,0 +1,11 @@
+<?php
+
+function parameterType(object $object1, object $object2) {
+    echo get_class($object1) . PHP_EOL;
+    echo get_class($object2) . PHP_EOL;
+}
+
+function returnType(): object {
+    $stdClass = new stdClass();
+    return $stdClass;
+}
diff --git a/php.editor/test/unit/data/testfiles/markoccurences/testGroupUseTrailingCommas/testGroupUseTrailingCommas.php b/php.editor/test/unit/data/testfiles/markoccurences/testGroupUseTrailingCommas/testGroupUseTrailingCommas.php
new file mode 100644
index 0000000000..d74dc92af0
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/markoccurences/testGroupUseTrailingCommas/testGroupUseTrailingCommas.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace A;
+
+class Foo {
+    
+}
+
+class Bar {
+    
+}
+
+namespace A\B;
+
+class Baz {
+    
+}
+
+namespace C;
+
+use A\{
+    Foo,
+    Bar,
+    B\Baz,
+};
+
+$foo = new Foo();
+$bar = new Bar();
+$baz = new Baz();
diff --git a/php.editor/test/unit/data/testfiles/markoccurences/testMixin/testMixin.php b/php.editor/test/unit/data/testfiles/markoccurences/testMixin/testMixin.php
new file mode 100644
index 0000000000..542b039efa
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/markoccurences/testMixin/testMixin.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Mixin\A;
+
+/**
+ * @mixin MixinA2
+ */
+class MixinA1
+{
+}
+
+class MixinA2
+{
+}
+
+namespace Mixin\B;
+
+/**
+ * @mixin \Mixin\A\MixinA1
+ */
+class MixinB1
+{
+}
+
+/**
+ * @mixin \Mixin\A\MixinA2|MixinB1
+ */
+class MixinB2
+{
+}
diff --git a/php.editor/test/unit/data/testfiles/markoccurences/testVardoc/testVardoc.php b/php.editor/test/unit/data/testfiles/markoccurences/testVardoc/testVardoc.php
new file mode 100644
index 0000000000..b05e3b48d1
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/markoccurences/testVardoc/testVardoc.php
@@ -0,0 +1,24 @@
+<?php
+
+class VarType
+{
+    const CONSTANT = "CONSTANT";
+    public $publicField = "publicField";
+
+    public function test()
+    {
+    }
+}
+
+/** @var VarType $varType */
+$varType = getVarType();
+$varType->test();
+
+/* @var  $varType2   VarType  */
+$varType2 = getVarType();
+$varType2->test();
+
+/** @var    VarType    $value */
+foreach ($array as $value) {
+    $value->test();
+}
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements.php b/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements.php
index 5306ef2786..99f65155e4 100644
--- a/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements.php
+++ b/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements.php
@@ -39,5 +39,3 @@ function __construct() {
 } else {
 
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements_1.php b/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements_1.php
index 36788f56bb..6c409f0ada 100644
--- a/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements_1.php
+++ b/php.editor/test/unit/data/testfiles/parser/foldingConditionalStatements_1.php
@@ -51,5 +51,3 @@ function __construct()
 {
 
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingCycles.php b/php.editor/test/unit/data/testfiles/parser/foldingCycles.php
index a51787e00d..142da5d5af 100644
--- a/php.editor/test/unit/data/testfiles/parser/foldingCycles.php
+++ b/php.editor/test/unit/data/testfiles/parser/foldingCycles.php
@@ -59,5 +59,3 @@ function __construct() {
 foreach ($array as $value) {
 
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingCycles_1.php b/php.editor/test/unit/data/testfiles/parser/foldingCycles_1.php
index fca71942c5..4fddc8ea90 100644
--- a/php.editor/test/unit/data/testfiles/parser/foldingCycles_1.php
+++ b/php.editor/test/unit/data/testfiles/parser/foldingCycles_1.php
@@ -75,5 +75,3 @@ function __construct()
 {
 
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingMethod.php b/php.editor/test/unit/data/testfiles/parser/foldingMethod.php
index aa99713526..a8f08a5143 100644
--- a/php.editor/test/unit/data/testfiles/parser/foldingMethod.php
+++ b/php.editor/test/unit/data/testfiles/parser/foldingMethod.php
@@ -19,5 +19,3 @@ function traitFunctionName($param) {
     }
     
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingMethod_1.php b/php.editor/test/unit/data/testfiles/parser/foldingMethod_1.php
index 3fbb0ff1be..2d9cb56cdf 100644
--- a/php.editor/test/unit/data/testfiles/parser/foldingMethod_1.php
+++ b/php.editor/test/unit/data/testfiles/parser/foldingMethod_1.php
@@ -24,5 +24,3 @@ function traitFunctionName($param)
     }
 
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingPHPTags.php b/php.editor/test/unit/data/testfiles/parser/foldingPHPTags.php
new file mode 100644
index 0000000000..9d30df5f22
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/parser/foldingPHPTags.php
@@ -0,0 +1,19 @@
+<html>
+    <body>
+        <h2>Test</h2>
+        <?= "test" ?>
+        <?php echo "test" ?>
+        <?= "test" ?>
+
+        <h2>Test</h2>
+        <?php
+        /**
+         * Get date.
+         *
+         * Description.
+         */
+        $date = getdate();
+        echo $date; // comment
+        ?>
+    </body>
+</html>
diff --git a/php.editor/test/unit/data/testfiles/parser/foldingUses.php b/php.editor/test/unit/data/testfiles/parser/foldingUses.php
new file mode 100644
index 0000000000..83a9031a70
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/parser/foldingUses.php
@@ -0,0 +1,35 @@
+<?php
+namespace A;
+
+use App\Test1;
+use App\Test2;
+
+
+use App\Test3;
+use App\{
+    Test4,
+    Test5
+};
+
+function functionName($param) {
+    
+}
+
+use App\{
+    Test6
+};
+use App\Test7;
+
+namespace B;
+
+use App\Test2;
+
+function functionName($param) {
+    
+}
+
+use const App\Test3\CONSTANT;
+use function App\{
+    test1,
+    test2
+};
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_01.php b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_01.php
new file mode 100644
index 0000000000..4960813e90
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_01.php
@@ -0,0 +1,3 @@
+<?php
+
+use some\ns\{ClassA, ClassB, ClassC as C,};
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_01.php.errors b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_01.php.errors
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_02.php b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_02.php
new file mode 100644
index 0000000000..68db1f7d11
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_02.php
@@ -0,0 +1,3 @@
+<?php
+
+use function some\ns\{fn_a, fn_b, fn_c,};
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_02.php.errors b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_02.php.errors
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_03.php b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_03.php
new file mode 100644
index 0000000000..49510d9f3d
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_03.php
@@ -0,0 +1,3 @@
+<?php
+
+use const some\ns\{ConstA, ConstB, ConstC,};
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_03.php.errors b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_03.php.errors
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_04.php b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_04.php
new file mode 100644
index 0000000000..002ab4adbd
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_04.php
@@ -0,0 +1,3 @@
+<?php
+
+use foo\math\{ Math, const PI, function sin, function cos, function cosh, };
diff --git a/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_04.php.errors b/php.editor/test/unit/data/testfiles/parser/groupUseTrailingCommas_04.php.errors
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/php.editor/test/unit/data/testfiles/parser/issue213616.php b/php.editor/test/unit/data/testfiles/parser/issue213616.php
index f046688f3b..e7a3ec340f 100644
--- a/php.editor/test/unit/data/testfiles/parser/issue213616.php
+++ b/php.editor/test/unit/data/testfiles/parser/issue213616.php
@@ -6,5 +6,3 @@ class Hello {
 
 	}
 }
-
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/issue216088.php b/php.editor/test/unit/data/testfiles/parser/issue216088.php
index 7ff4e1f6a8..13282ab1a3 100644
--- a/php.editor/test/unit/data/testfiles/parser/issue216088.php
+++ b/php.editor/test/unit/data/testfiles/parser/issue216088.php
@@ -4,4 +4,3 @@
     echo "";
 else
     echo "";
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/parser/issue232884.php b/php.editor/test/unit/data/testfiles/parser/issue232884.php
index e50562ddec..64b4ba0595 100644
--- a/php.editor/test/unit/data/testfiles/parser/issue232884.php
+++ b/php.editor/test/unit/data/testfiles/parser/issue232884.php
@@ -3,4 +3,3 @@
 if (TRUE):
 
 endif;
-?>
\ No newline at end of file
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_01.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_01.occurrences
new file mode 100644
index 0000000000..f6bcf12ddb
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_01.occurrences
@@ -0,0 +1,3 @@
+class ^|>MARK_OCCURRENCES:Foo<| {
+    |>MARK_OCCURRENCES:Foo<|,
+$foo = new |>MARK_OCCURRENCES:Foo<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_02.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_02.occurrences
new file mode 100644
index 0000000000..4519a411c4
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_02.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Foo<| {
+    |>MARK_OCCURRENCES:Fo^o<|,
+$foo = new |>MARK_OCCURRENCES:Foo<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_03.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_03.occurrences
new file mode 100644
index 0000000000..0960b0f4d8
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_03.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Foo<| {
+    |>MARK_OCCURRENCES:Foo<|,
+$foo = new |>MARK_OCCURRENCES:Fo^o<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_04.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_04.occurrences
new file mode 100644
index 0000000000..e8e4433189
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_04.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:B^ar<| {
+    |>MARK_OCCURRENCES:Bar<|,
+$bar = new |>MARK_OCCURRENCES:Bar<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_05.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_05.occurrences
new file mode 100644
index 0000000000..704c09de4f
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_05.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Bar<| {
+    |>MARK_OCCURRENCES:Ba^r<|,
+$bar = new |>MARK_OCCURRENCES:Bar<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_06.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_06.occurrences
new file mode 100644
index 0000000000..2be49adf16
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_06.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Bar<| {
+    |>MARK_OCCURRENCES:Bar<|,
+$bar = new |>MARK_OCCURRENCES:Ba^r<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_07.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_07.occurrences
new file mode 100644
index 0000000000..c85dbd3614
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_07.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Ba^z<| {
+    B\|>MARK_OCCURRENCES:Baz<|,
+$baz = new |>MARK_OCCURRENCES:Baz<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_08.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_08.occurrences
new file mode 100644
index 0000000000..18bd5e3826
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_08.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Baz<| {
+    B\|>MARK_OCCURRENCES:Ba^z<|,
+$baz = new |>MARK_OCCURRENCES:Baz<|();
diff --git a/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_09.occurrences b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_09.occurrences
new file mode 100644
index 0000000000..bf1b41b1f2
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testGroupUseTrailingCommas.php.testGroupUseTrailingCommas_09.occurrences
@@ -0,0 +1,3 @@
+class |>MARK_OCCURRENCES:Baz<| {
+    B\|>MARK_OCCURRENCES:Baz<|,
+$baz = new |>MARK_OCCURRENCES:Ba^z<|();
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_01.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_01.occurrences
new file mode 100644
index 0000000000..4bfaa89e00
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_01.occurrences
@@ -0,0 +1,2 @@
+class |>MARK_OCCURRENCES:MixinA^1<|
+ * @mixin \Mixin\A\|>MARK_OCCURRENCES:MixinA1<|
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_02.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_02.occurrences
new file mode 100644
index 0000000000..ba62c8e74a
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_02.occurrences
@@ -0,0 +1,2 @@
+class |>MARK_OCCURRENCES:MixinA1<|
+ * @mixin \Mixin\A\|>MARK_OCCURRENCES:Mixi^nA1<|
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_03.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_03.occurrences
new file mode 100644
index 0000000000..bff9e2d28a
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_03.occurrences
@@ -0,0 +1,3 @@
+ * @mixin |>MARK_OCCURRENCES:MixinA2<|
+class |>MARK_OCCURRENCES:MixinA^2<|
+ * @mixin \Mixin\A\|>MARK_OCCURRENCES:MixinA2<||MixinB1
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_04.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_04.occurrences
new file mode 100644
index 0000000000..3f058054ce
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_04.occurrences
@@ -0,0 +1,3 @@
+ * @mixin |>MARK_OCCURRENCES:MixinA2<|
+class |>MARK_OCCURRENCES:MixinA2<|
+ * @mixin \Mixin\A\|>MARK_OCCURRENCES:Mixin^A2<||MixinB1
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_05.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_05.occurrences
new file mode 100644
index 0000000000..b6988b27d6
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_05.occurrences
@@ -0,0 +1,3 @@
+ * @mixin ^|>MARK_OCCURRENCES:MixinA2<|
+class |>MARK_OCCURRENCES:MixinA2<|
+ * @mixin \Mixin\A\|>MARK_OCCURRENCES:MixinA2<||MixinB1
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_06.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_06.occurrences
new file mode 100644
index 0000000000..65d336f4aa
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_06.occurrences
@@ -0,0 +1,2 @@
+class |>MARK_OCCURRENCES:Mix^inB1<|
+ * @mixin \Mixin\A\MixinA2||>MARK_OCCURRENCES:MixinB1<|
diff --git a/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_07.occurrences b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_07.occurrences
new file mode 100644
index 0000000000..5b5dbb59f2
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testMixin.php.testMixin_07.occurrences
@@ -0,0 +1,2 @@
+class |>MARK_OCCURRENCES:MixinB1<|
+ * @mixin \Mixin\A\MixinA2||>MARK_OCCURRENCES:Mixin^B1<|
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_01.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_01.occurrences
new file mode 100644
index 0000000000..2646317fc4
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_01.occurrences
@@ -0,0 +1,4 @@
+class |>MARK_OCCURRENCES:V^arType<|
+/** @var |>MARK_OCCURRENCES:VarType<| $varType */
+/* @var  $varType2   |>MARK_OCCURRENCES:VarType<|  */
+/** @var    |>MARK_OCCURRENCES:VarType<|    $value */
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_02.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_02.occurrences
new file mode 100644
index 0000000000..d36540e344
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_02.occurrences
@@ -0,0 +1,4 @@
+class |>MARK_OCCURRENCES:VarType<|
+/** @var |>MARK_OCCURRENCES:VarT^ype<| $varType */
+/* @var  $varType2   |>MARK_OCCURRENCES:VarType<|  */
+/** @var    |>MARK_OCCURRENCES:VarType<|    $value */
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_03.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_03.occurrences
new file mode 100644
index 0000000000..cba4906884
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_03.occurrences
@@ -0,0 +1,4 @@
+class |>MARK_OCCURRENCES:VarType<|
+/** @var |>MARK_OCCURRENCES:VarType<| $varType */
+/* @var  $varType2   |>MARK_OCCURRENCES:VarType<|  */
+/** @var    |>MARK_OCCURRENCES:Var^Type<|    $value */
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_04.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_04.occurrences
new file mode 100644
index 0000000000..a232e7a6be
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_04.occurrences
@@ -0,0 +1,4 @@
+class |>MARK_OCCURRENCES:VarType<|
+/** @var |>MARK_OCCURRENCES:VarType<| $varType */
+/* @var  $varType2   |>MARK_OCCURRENCES:VarT^ype<|  */
+/** @var    |>MARK_OCCURRENCES:VarType<|    $value */
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_05.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_05.occurrences
new file mode 100644
index 0000000000..28d77e4552
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_05.occurrences
@@ -0,0 +1,4 @@
+    public function |>MARK_OCCURRENCES:tes^t<|()
+$varType->|>MARK_OCCURRENCES:test<|();
+$varType2->|>MARK_OCCURRENCES:test<|();
+    $value->|>MARK_OCCURRENCES:test<|();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_06.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_06.occurrences
new file mode 100644
index 0000000000..977765186d
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_06.occurrences
@@ -0,0 +1,4 @@
+    public function |>MARK_OCCURRENCES:test<|()
+$varType->|>MARK_OCCURRENCES:tes^t<|();
+$varType2->|>MARK_OCCURRENCES:test<|();
+    $value->|>MARK_OCCURRENCES:test<|();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_07.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_07.occurrences
new file mode 100644
index 0000000000..3b78bbb4f2
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_07.occurrences
@@ -0,0 +1,4 @@
+    public function |>MARK_OCCURRENCES:test<|()
+$varType->|>MARK_OCCURRENCES:test<|();
+$varType2->|>MARK_OCCURRENCES:te^st<|();
+    $value->|>MARK_OCCURRENCES:test<|();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_08.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_08.occurrences
new file mode 100644
index 0000000000..fd513810c0
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_08.occurrences
@@ -0,0 +1,4 @@
+    public function |>MARK_OCCURRENCES:test<|()
+$varType->|>MARK_OCCURRENCES:test<|();
+$varType2->|>MARK_OCCURRENCES:test<|();
+    $value->^|>MARK_OCCURRENCES:test<|();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_09.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_09.occurrences
new file mode 100644
index 0000000000..06a67a1b9b
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_09.occurrences
@@ -0,0 +1,3 @@
+/** @var VarType $|>MARK_OCCURRENCES:va^rType<| */
+$|>MARK_OCCURRENCES:varType<| = getVarType();
+$|>MARK_OCCURRENCES:varType<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_10.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_10.occurrences
new file mode 100644
index 0000000000..144e57aece
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_10.occurrences
@@ -0,0 +1,3 @@
+/** @var VarType $|>MARK_OCCURRENCES:varType<| */
+$^|>MARK_OCCURRENCES:varType<| = getVarType();
+$|>MARK_OCCURRENCES:varType<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_11.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_11.occurrences
new file mode 100644
index 0000000000..00a0efa755
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_11.occurrences
@@ -0,0 +1,3 @@
+/** @var VarType $|>MARK_OCCURRENCES:varType<| */
+$|>MARK_OCCURRENCES:varType<| = getVarType();
+$|>MARK_OCCURRENCES:varT^ype<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_12.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_12.occurrences
new file mode 100644
index 0000000000..45d2790a72
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_12.occurrences
@@ -0,0 +1,3 @@
+/** @var    VarType    $|>MARK_OCCURRENCES:val^ue<| */
+foreach ($array as $|>MARK_OCCURRENCES:value<|) {
+    $|>MARK_OCCURRENCES:value<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_13.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_13.occurrences
new file mode 100644
index 0000000000..53917988d8
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_13.occurrences
@@ -0,0 +1,3 @@
+/** @var    VarType    $|>MARK_OCCURRENCES:value<| */
+foreach ($array as $^|>MARK_OCCURRENCES:value<|) {
+    $|>MARK_OCCURRENCES:value<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_14.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_14.occurrences
new file mode 100644
index 0000000000..cf0e537aff
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_14.occurrences
@@ -0,0 +1,3 @@
+/** @var    VarType    $|>MARK_OCCURRENCES:value<| */
+foreach ($array as $|>MARK_OCCURRENCES:value<|) {
+    $|>MARK_OCCURRENCES:val^ue<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_15.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_15.occurrences
new file mode 100644
index 0000000000..aa1a5112c3
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_15.occurrences
@@ -0,0 +1,3 @@
+/* @var  $|>MARK_OCCURRENCES:var^Type2<|   VarType  */
+$|>MARK_OCCURRENCES:varType2<| = getVarType();
+$|>MARK_OCCURRENCES:varType2<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_16.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_16.occurrences
new file mode 100644
index 0000000000..7ba54370b1
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_16.occurrences
@@ -0,0 +1,3 @@
+/* @var  $|>MARK_OCCURRENCES:varType2<|   VarType  */
+$|>MARK_OCCURRENCES:varT^ype2<| = getVarType();
+$|>MARK_OCCURRENCES:varType2<|->test();
diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_17.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_17.occurrences
new file mode 100644
index 0000000000..092dfd7ea9
--- /dev/null
+++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_17.occurrences
@@ -0,0 +1,3 @@
+/* @var  $|>MARK_OCCURRENCES:varType2<|   VarType  */
+$|>MARK_OCCURRENCES:varType2<| = getVarType();
+$|>MARK_OCCURRENCES:varTyp^e2<|->test();
diff --git a/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints b/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints
index c2ad640637..658112314c 100644
--- a/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints
+++ b/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints
@@ -1,4 +1,4 @@
 $foo^Bar;
 -------
-HINT:Generate Type Comment For Variable /* @var $myvariable MyClass */
+HINT:Generate Type Comment For Variable /** @var MyClass $myvariable */
 FIX:Generate Type Comment For Variable
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP72CodeCompletionTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP72CodeCompletionTest.java
new file mode 100644
index 0000000000..72c426fbb3
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP72CodeCompletionTest.java
@@ -0,0 +1,101 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.completion;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Map;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.modules.php.project.api.PhpSourcePath;
+import org.netbeans.spi.java.classpath.support.ClassPathSupport;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+
+
+public class PHP72CodeCompletionTest extends PHPCodeCompletionTestBase {
+
+    public PHP72CodeCompletionTest(String testName) {
+        super(testName);
+    }
+
+    @Override
+    protected Map<String, ClassPath> createClassPathsForTest() {
+        return Collections.singletonMap(
+            PhpSourcePath.SOURCE_CP,
+            ClassPathSupport.createClassPath(new FileObject[]{
+                FileUtil.toFileObject(new File(getDataDir(), "/testfiles/completion/lib/php72/" + getTestDirName()))
+            })
+        );
+    }
+
+    private String getTestDirName() {
+        String name = getName();
+        int indexOf = name.indexOf("_");
+        if (indexOf != -1) {
+            name = name.substring(0, indexOf);
+        }
+        return name;
+    }
+
+    private String getTestPath(String fileName) {
+        return String.format("testfiles/completion/lib/php72/%s/%s.php", getTestDirName(), fileName);
+    }
+
+    public void testObjectTypeHint_ParameterType01() throws Exception {
+        checkCompletion(getTestPath("objectTypeHint"), "function parameterType01(^) {", false);
+    }
+
+    public void testObjectTypeHint_ParameterType02() throws Exception {
+        checkCompletion(getTestPath("objectTypeHint"), "function parameterType02(obje^ct $arg) {", false);
+    }
+
+    public void testObjectTypeHint_ParameterType03() throws Exception {
+        checkCompletion(getTestPath("objectTypeHint"), "    function __construct(obj^ect $arg) {", false);
+    }
+
+    public void testObjectTypeHint_ReturnType01() throws Exception {
+        checkCompletion(getTestPath("objectTypeHint"), "function returnType01(object $arg): ob^ject {", false);
+    }
+
+    public void testObjectTypeHint_ReturnType02() throws Exception {
+        checkCompletion(getTestPath("objectTypeHint"), "function returnType02(object $arg): ^ {", false);
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionMixinTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionMixinTest.java
new file mode 100644
index 0000000000..6d63d65779
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionMixinTest.java
@@ -0,0 +1,105 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.completion;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Map;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.modules.php.project.api.PhpSourcePath;
+import org.netbeans.spi.java.classpath.support.ClassPathSupport;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+
+
+public class PHPCodeCompletionMixinTest extends PHPCodeCompletionTestBase {
+
+    public PHPCodeCompletionMixinTest(String testName) {
+        super(testName);
+    }
+
+    @Override
+    protected Map<String, ClassPath> createClassPathsForTest() {
+        return Collections.singletonMap(
+            PhpSourcePath.SOURCE_CP,
+            ClassPathSupport.createClassPath(new FileObject[]{
+                FileUtil.toFileObject(new File(getDataDir(), "/testfiles/completion/lib/mixin/"))
+            })
+        );
+    }
+
+    // #241740 for @mixin tag
+    public void testMixinTagType() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixin.php", " * @mixin ^C3", false);
+    }
+
+    public void testMixin() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixin.php", "$mixin->^publicMethodC1(); // CC", false);
+    }
+
+    public void testMixinWithStaticAccess() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixin.php", "Mixin::^publicStaticMethodC1(); // CC", false);
+    }
+
+    public void testMixinEnclosing() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixin.php", "        $this->^protectedMethodC1(); // CC", false);
+    }
+
+    public void testMixinEnclosingWithStaticAccess() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixin.php", "        Mixin::^protectedStaticMethodC1(); // CC", false);
+    }
+
+    public void testMixinFieldAccess_01() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixinFieldAccess.php", "$fieldAccess->C1->^publicMethodC1(); // CC", false);
+    }
+
+    public void testMixinFieldAccess_02() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixinFieldAccess.php", "$fieldAccess->Mixin->^publicMethodC1(); // CC", false);
+    }
+
+    public void testMixinFieldStaticAccess_01() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixinFieldAccess.php", "$fieldAccess->C1::^publicStaticMethodC1(); // CC", false);
+    }
+
+    public void testMixinFieldStaticAccess_02() throws Exception {
+        checkCompletion("testfiles/completion/lib/mixin/mixinFieldAccess.php", "$fieldAccess->Mixin::^publicStaticMethodC1(); // CC", false);
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionVardocTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionVardocTest.java
new file mode 100644
index 0000000000..64dd52a27b
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionVardocTest.java
@@ -0,0 +1,80 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.completion;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Map;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.modules.php.project.api.PhpSourcePath;
+import org.netbeans.spi.java.classpath.support.ClassPathSupport;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+
+
+public class PHPCodeCompletionVardocTest extends PHPCodeCompletionTestBase {
+
+    public PHPCodeCompletionVardocTest(String testName) {
+        super(testName);
+    }
+
+    @Override
+    protected Map<String, ClassPath> createClassPathsForTest() {
+        return Collections.singletonMap(
+            PhpSourcePath.SOURCE_CP,
+            ClassPathSupport.createClassPath(new FileObject[]{
+                FileUtil.toFileObject(new File(getDataDir(), "/testfiles/completion/lib/vardoc/"))
+            })
+        );
+    }
+
+    public void testVariable_01() throws Exception {
+        checkCompletion("testfiles/completion/lib/vardoc/vardoc.php", "$varType->^test(); // CC", false);
+    }
+
+    public void testVariable_02() throws Exception {
+        checkCompletion("testfiles/completion/lib/vardoc/vardoc.php", "    $value->^test(); // CC", false);
+    }
+
+    public void testVarTagType_01() throws Exception {
+        checkCompletion("testfiles/completion/lib/vardoc/vardoc.php", "/** @var ^VarType $varType */", false);
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/FoldingTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/FoldingTest.java
index 5358e0b689..47e1b15687 100644
--- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/FoldingTest.java
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/FoldingTest.java
@@ -106,4 +106,14 @@ public void testArrays() throws Exception {
         checkFolds("testfiles/parser/foldingArrays.php");
     }
 
+    // #254432
+    public void testUses() throws Exception {
+        checkFolds("testfiles/parser/foldingUses.php");
+    }
+
+    // #232600
+    public void testPHPTags() throws Exception {
+        checkFolds("testfiles/parser/foldingPHPTags.php");
+    }
+
 }
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationMixinTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationMixinTest.java
new file mode 100644
index 0000000000..249e56e319
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationMixinTest.java
@@ -0,0 +1,65 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class GotoDeclarationMixinTest extends GotoDeclarationTestBase {
+
+    public GotoDeclarationMixinTest(String testName) {
+        super(testName);
+    }
+
+    public void testMixin_01() throws Exception {
+        checkDeclaration(getTestPath(), " * @mixin \\Mixin\\A\\Mixin^A1", "class ^MixinA1");
+    }
+
+    public void testMixin_02() throws Exception {
+        checkDeclaration(getTestPath(), " * @mixin Mi^xinA2", "class ^MixinA2");
+    }
+
+    public void testMixin_03() throws Exception {
+        checkDeclaration(getTestPath(), " * @mixin \\Mixin\\A\\MixinA^2|MixinB1", "class ^MixinA2");
+    }
+
+    public void testMixin_04() throws Exception {
+        checkDeclaration(getTestPath(), " * @mixin \\Mixin\\A\\MixinA2|Mi^xinB1", "class ^MixinB1");
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationPHP72Test.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationPHP72Test.java
new file mode 100644
index 0000000000..6e575a9bfd
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationPHP72Test.java
@@ -0,0 +1,73 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class GotoDeclarationPHP72Test extends GotoDeclarationTestBase {
+
+    public GotoDeclarationPHP72Test(String testName) {
+        super(testName);
+    }
+
+    public void testGroupUseTrailingCommas_01() throws Exception {
+        checkDeclaration(getTestPath(), "    F^oo,", "class ^Foo {");
+    }
+
+    public void testGroupUseTrailingCommas_02() throws Exception {
+        checkDeclaration(getTestPath(), "$foo = new Fo^o();", "class ^Foo {");
+    }
+
+    public void testGroupUseTrailingCommas_03() throws Exception {
+        checkDeclaration(getTestPath(), "    ^Bar,", "class ^Bar {");
+    }
+
+    public void testGroupUseTrailingCommas_04() throws Exception {
+        checkDeclaration(getTestPath(), "$bar = new Ba^r();", "class ^Bar {");
+    }
+
+    public void testGroupUseTrailingCommas_05() throws Exception {
+        checkDeclaration(getTestPath(), "    B\\Ba^z", "class ^Baz {");
+    }
+
+    public void testGroupUseTrailingCommas_06() throws Exception {
+        checkDeclaration(getTestPath(), "$baz = new Ba^z();", "class ^Baz {");
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationVardocTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationVardocTest.java
new file mode 100644
index 0000000000..67dac6c032
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationVardocTest.java
@@ -0,0 +1,96 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.csl;
+
+public class GotoDeclarationVardocTest extends GotoDeclarationTestBase {
+
+    public GotoDeclarationVardocTest(String testName) {
+        super(testName);
+    }
+
+    public void testVardoc_01() throws Exception {
+        checkDeclaration(getTestPath(), "/** @var ^VarType $varType */", "class ^VarType");
+    }
+
+    public void testVardoc_02() throws Exception {
+        checkDeclaration(getTestPath(), "/* @var  $varType2   VarT^ype  */", "class ^VarType");
+    }
+
+    public void testVardoc_03() throws Exception {
+        checkDeclaration(getTestPath(), "/** @var    VarTy^pe    $value */", "class ^VarType");
+    }
+
+    public void testVardoc_04() throws Exception {
+        checkDeclaration(getTestPath(), "$varType->tes^t();", "    public function ^test()");
+    }
+
+    public void testVardoc_05() throws Exception {
+        checkDeclaration(getTestPath(), "$varType2->^test();", "    public function ^test()");
+    }
+
+    public void testVardoc_06() throws Exception {
+        checkDeclaration(getTestPath(), "    $value->te^st();", "    public function ^test()");
+    }
+
+    public void testVardoc_07() throws Exception {
+        checkDeclaration(getTestPath(), "/** @var VarType $var^Type */", "$^varType = getVarType();");
+    }
+
+    public void testVardoc_08() throws Exception {
+        checkDeclaration(getTestPath(), "$var^Type->test();", "$^varType = getVarType();");
+    }
+
+    public void testVardoc_09() throws Exception {
+        checkDeclaration(getTestPath(), "/* @var  $varT^ype2   VarType  */", "$^varType2 = getVarType();");
+    }
+
+    public void testVardoc_10() throws Exception {
+        checkDeclaration(getTestPath(), "$varT^ype2->test();", "$^varType2 = getVarType();");
+    }
+
+    public void testVardoc_11() throws Exception {
+        checkDeclaration(getTestPath(), "/** @var    VarType    $va^lue */", "foreach ($array as $^value) {");
+    }
+
+    public void testVardoc_12() throws Exception {
+        checkDeclaration(getTestPath(), "    $va^lue->test();", "foreach ($array as $^value) {");
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplMixinTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplMixinTest.java
new file mode 100644
index 0000000000..3ce17655bb
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplMixinTest.java
@@ -0,0 +1,77 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class OccurrencesFinderImplMixinTest extends OccurrencesFinderImplTestBase {
+
+    public OccurrencesFinderImplMixinTest(String testName) {
+        super(testName);
+    }
+
+    public void testMixin_01() throws Exception {
+        checkOccurrences(getTestPath(), "class MixinA^1", true);
+    }
+
+    public void testMixin_02() throws Exception {
+        checkOccurrences(getTestPath(), " * @mixin \\Mixin\\A\\Mixi^nA1", true);
+    }
+
+    public void testMixin_03() throws Exception {
+        checkOccurrences(getTestPath(), "class MixinA^2", true);
+    }
+
+    public void testMixin_04() throws Exception {
+        checkOccurrences(getTestPath(), " * @mixin \\Mixin\\A\\Mixin^A2|MixinB1", true);
+    }
+
+    public void testMixin_05() throws Exception {
+        checkOccurrences(getTestPath(), " * @mixin ^MixinA2", true);
+    }
+
+    public void testMixin_06() throws Exception {
+        checkOccurrences(getTestPath(), "class Mix^inB1", true);
+    }
+
+    public void testMixin_07() throws Exception {
+        checkOccurrences(getTestPath(), " * @mixin \\Mixin\\A\\MixinA2|Mixin^B1", true);
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplPHP72Test.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplPHP72Test.java
new file mode 100644
index 0000000000..fe073a42a2
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplPHP72Test.java
@@ -0,0 +1,85 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class OccurrencesFinderImplPHP72Test extends OccurrencesFinderImplTestBase {
+
+    public OccurrencesFinderImplPHP72Test(String testName) {
+        super(testName);
+    }
+
+    public void testGroupUseTrailingCommas_01() throws Exception {
+        checkOccurrences(getTestPath(), "class ^Foo {", true);
+    }
+
+    public void testGroupUseTrailingCommas_02() throws Exception {
+        checkOccurrences(getTestPath(), "    Fo^o,", true);
+    }
+
+    public void testGroupUseTrailingCommas_03() throws Exception {
+        checkOccurrences(getTestPath(), "$foo = new Fo^o();", true);
+    }
+
+    public void testGroupUseTrailingCommas_04() throws Exception {
+        checkOccurrences(getTestPath(), "class B^ar {", true);
+    }
+
+    public void testGroupUseTrailingCommas_05() throws Exception {
+        checkOccurrences(getTestPath(), "    Ba^r,", true);
+    }
+
+    public void testGroupUseTrailingCommas_06() throws Exception {
+        checkOccurrences(getTestPath(), "$bar = new Ba^r();", true);
+    }
+
+    public void testGroupUseTrailingCommas_07() throws Exception {
+        checkOccurrences(getTestPath(), "class Ba^z {", true);
+    }
+
+    public void testGroupUseTrailingCommas_08() throws Exception {
+        checkOccurrences(getTestPath(), "    B\\Ba^z,", true);
+    }
+
+    public void testGroupUseTrailingCommas_09() throws Exception {
+        checkOccurrences(getTestPath(), "$baz = new Ba^z();", true);
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplVardocTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplVardocTest.java
new file mode 100644
index 0000000000..aa90aeb864
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplVardocTest.java
@@ -0,0 +1,117 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class OccurrencesFinderImplVardocTest extends OccurrencesFinderImplTestBase {
+
+    public OccurrencesFinderImplVardocTest(String testName) {
+        super(testName);
+    }
+
+    public void testVardoc_01() throws Exception {
+        checkOccurrences(getTestPath(), "class V^arType", true);
+    }
+
+    public void testVardoc_02() throws Exception {
+        checkOccurrences(getTestPath(), "/** @var VarT^ype $varType */", true);
+    }
+
+    public void testVardoc_03() throws Exception {
+        checkOccurrences(getTestPath(), "/** @var    Var^Type    $value */", true);
+    }
+
+    public void testVardoc_04() throws Exception {
+        checkOccurrences(getTestPath(), "/* @var  $varType2   VarT^ype  */", true);
+    }
+
+    public void testVardoc_05() throws Exception {
+        checkOccurrences(getTestPath(), "    public function tes^t()", true);
+    }
+
+    public void testVardoc_06() throws Exception {
+        checkOccurrences(getTestPath(), "$varType->tes^t();", true);
+    }
+
+    public void testVardoc_07() throws Exception {
+        checkOccurrences(getTestPath(), "$varType2->te^st();", true);
+    }
+
+    public void testVardoc_08() throws Exception {
+        checkOccurrences(getTestPath(), "    $value->^test();", true);
+    }
+
+    public void testVardoc_09() throws Exception {
+        checkOccurrences(getTestPath(), "/** @var VarType $va^rType */", true);
+    }
+
+    public void testVardoc_10() throws Exception {
+        checkOccurrences(getTestPath(), "$^varType = getVarType();", true);
+    }
+
+    public void testVardoc_11() throws Exception {
+        checkOccurrences(getTestPath(), "$varT^ype->test();", true);
+    }
+
+    public void testVardoc_12() throws Exception {
+        checkOccurrences(getTestPath(), "/** @var    VarType    $val^ue */", true);
+    }
+
+    public void testVardoc_13() throws Exception {
+        checkOccurrences(getTestPath(), "foreach ($array as $^value) {", true);
+    }
+
+    public void testVardoc_14() throws Exception {
+        checkOccurrences(getTestPath(), "    $val^ue->test();", true);
+    }
+
+    public void testVardoc_15() throws Exception {
+        checkOccurrences(getTestPath(), "/* @var  $var^Type2   VarType  */", true);
+    }
+
+    public void testVardoc_16() throws Exception {
+        checkOccurrences(getTestPath(), "$varT^ype2 = getVarType();", true);
+    }
+
+    public void testVardoc_17() throws Exception {
+        checkOccurrences(getTestPath(), "$varTyp^e2->test();", true);
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/index/PHPIndexTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/index/PHPIndexTest.java
index 51614ed726..fc7d57b553 100644
--- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/index/PHPIndexTest.java
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/index/PHPIndexTest.java
@@ -598,6 +598,11 @@ public void testClassConstantVisibility() throws Exception {
         checkIndexer(getTestPath());
     }
 
+    // #241740
+    public void testMixin() throws Exception {
+        checkIndexer(getTestPath());
+    }
+
     @Override
     protected FileObject[] createSourceClassPathsForTest() {
         final File folder = new File(getDataDir(), getTestFolderPath());
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/lexer/PHP72FeaturesTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/lexer/PHP72FeaturesTest.java
new file mode 100644
index 0000000000..07955342a1
--- /dev/null
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/lexer/PHP72FeaturesTest.java
@@ -0,0 +1,53 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.editor.lexer;
+
+
+public class PHP72FeaturesTest extends PHPLexerTestBase {
+
+    public PHP72FeaturesTest(String testName) {
+        super(testName);
+    }
+
+    public void testObjectType01() throws Exception {
+        performTest("lexer/object_type_01");
+    }
+
+}
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
index b675ddba30..75365b3736 100644
--- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
@@ -877,6 +877,23 @@ public void testIssue271109() throws Exception {
         performTest("parser/issue271109");
     }
 
+    // PHP 7.2
+    public void testGroupUseTrailingCommas_01() throws Exception {
+        performTest("parser/groupUseTrailingCommas_01");
+    }
+
+    public void testGroupUseTrailingCommas_02() throws Exception {
+        performTest("parser/groupUseTrailingCommas_02");
+    }
+
+    public void testGroupUseTrailingCommas_03() throws Exception {
+        performTest("parser/groupUseTrailingCommas_03");
+    }
+
+    public void testGroupUseTrailingCommas_04() throws Exception {
+        performTest("parser/groupUseTrailingCommas_04");
+    }
+
     @Override
     protected String getTestResult(String filename) throws Exception {
         // the same <Comment /> is shown twice becase the scanner is used twice
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java
index 5d89067605..c1cf065169 100644
--- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java
@@ -91,4 +91,58 @@ public void testIssue257709_02() throws Exception {
         assertEquals(1, varComment.getVariable().getTypes().size());
     }
 
+    public void testArrayForPHPDocPattern_01() throws Exception {
+        String comment = "/** @var TestClass $b['y'] */";
+        PHPVarCommentParser parser = new PHPVarCommentParser();
+        PHPVarComment varComment = parser.parse(0, comment.length(), comment);
+        assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType());
+        assertEquals("$b", varComment.getVariable().getVariable().getValue());
+        assertEquals(1, varComment.getVariable().getTypes().size());
+    }
+
+    public void testArrayForPHPDocPattern_02() throws Exception {
+        String comment = "/** @var TestClass $b[\"y\"] */";
+        PHPVarCommentParser parser = new PHPVarCommentParser();
+        PHPVarComment varComment = parser.parse(0, comment.length(), comment);
+        assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType());
+        assertEquals("$b", varComment.getVariable().getVariable().getValue());
+        assertEquals(1, varComment.getVariable().getTypes().size());
+    }
+
+    public void testPHPDocPattern_01() throws Exception {
+        String comment = "/** @var Type	$b */"; // TAB
+        PHPVarCommentParser parser = new PHPVarCommentParser();
+        PHPVarComment varComment = parser.parse(0, comment.length(), comment);
+        assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType());
+        assertEquals("$b", varComment.getVariable().getVariable().getValue());
+        assertEquals(1, varComment.getVariable().getTypes().size());
+    }
+
+    public void testForPHPDocPattern_02() throws Exception {
+        String comment = "/** @var 	Type	  $b */"; // TAB + space
+        PHPVarCommentParser parser = new PHPVarCommentParser();
+        PHPVarComment varComment = parser.parse(0, comment.length(), comment);
+        assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType());
+        assertEquals("$b", varComment.getVariable().getVariable().getValue());
+        assertEquals(1, varComment.getVariable().getTypes().size());
+    }
+
+    public void testForPHPDocPattern_03() throws Exception {
+        String comment = "/** @var Type $b Description */";
+        PHPVarCommentParser parser = new PHPVarCommentParser();
+        PHPVarComment varComment = parser.parse(0, comment.length(), comment);
+        assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType());
+        assertEquals("$b", varComment.getVariable().getVariable().getValue());
+        assertEquals(1, varComment.getVariable().getTypes().size());
+    }
+
+    public void testForPHPDocPattern_04() throws Exception {
+        String comment = "/** @var Type $b Long Description Something.*/";
+        PHPVarCommentParser parser = new PHPVarCommentParser();
+        PHPVarComment varComment = parser.parse(0, comment.length(), comment);
+        assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType());
+        assertEquals("$b", varComment.getVariable().getVariable().getValue());
+        assertEquals(1, varComment.getVariable().getTypes().size());
+    }
+
 }
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PhpParserErrorTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PhpParserErrorTest.java
index 91b779bb46..656fc7112f 100644
--- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PhpParserErrorTest.java
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PhpParserErrorTest.java
@@ -786,4 +786,20 @@ public void testIssue271109() throws Exception {
         checkErrors("testfiles/parser/issue271109.php");
     }
 
+    public void testGroupUseTrailingCommas_01() throws Exception {
+        checkErrors("testfiles/parser/groupUseTrailingCommas_01.php");
+    }
+
+    public void testGroupUseTrailingCommas_02() throws Exception {
+        checkErrors("testfiles/parser/groupUseTrailingCommas_02.php");
+    }
+
+    public void testGroupUseTrailingCommas_03() throws Exception {
+        checkErrors("testfiles/parser/groupUseTrailingCommas_03.php");
+    }
+
+    public void testGroupUseTrailingCommas_04() throws Exception {
+        checkErrors("testfiles/parser/groupUseTrailingCommas_04.php");
+    }
+
 }
diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptorTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptorTest.java
index 437bf9f62b..afb83d5196 100644
--- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptorTest.java
+++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/typinghooks/PhpTypedBreakInterceptorTest.java
@@ -72,6 +72,15 @@ public void insertBreak(String original, String expected, Map<String, Object> op
         super.insertBreak(wrapAsPhp(original), wrapAsPhp(expected));
     }
 
+    private void insertBreakMultiLineComment(String original, String expected, boolean insertAsterisk) throws Exception {
+        PhpTypedBreakInterceptor.setInsertAsteriskToPHPComment(insertAsterisk);
+        try {
+            insertBreak(original, expected);
+        } finally {
+            PhpTypedBreakInterceptor.setInsertAsteriskToPHPComment(null);
+        }
+    }
+
     public void testInsertBreakAfterClass2() throws Exception {
         insertBreak("class Foo {^\n    \n}", "class Foo {\n    ^\n    \n}");
     }
@@ -815,5 +824,304 @@ public void testIssue270233_06() throws Exception {
         );
     }
 
+    // #230814
+    public void testDoNotInsertCommentAsterisk_01() throws Exception {
+        insertBreakMultiLineComment(
+                "/*^",
+                "/*\n"
+                + "^\n"
+                + "*/",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_02() throws Exception {
+        insertBreakMultiLineComment(
+                "/*\n"
+                + "^\n"
+                + "*/",
+                "/*\n"
+                + "\n"
+                + "^\n"
+                + "*/",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_03() throws Exception {
+        insertBreakMultiLineComment(
+                "/*\n"
+                + " * ^\n"
+                + "*/",
+                "/*\n"
+                + " * \n"
+                + "^\n"
+                + "*/",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_04() throws Exception {
+        insertBreakMultiLineComment(
+                "/*\n"
+                + "something^\n"
+                + "*/",
+                "/*\n"
+                + "something\n"
+                + "^\n"
+                + "*/",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_05() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*^\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "    ^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_06() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "    ^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_07() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "    ^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "    \n"
+                + "    ^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_08() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "    something^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "    something\n"
+                + "    ^\n"
+                + "    */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                false
+        );
+    }
+
+    public void testDoNotInsertCommentAsterisk_09() throws Exception {
+        // PHPDoc
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /**^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /**\n"
+                + "     * ^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                false
+        );
+    }
+
+    public void testInsertCommentAsterisk_01() throws Exception {
+        insertBreakMultiLineComment(
+                "/*^",
+                "/*\n"
+                + " * ^\n"
+                + " */",
+                true
+        );
+    }
+
+    public void testInsertCommentAsterisk_02() throws Exception {
+        insertBreakMultiLineComment(
+                "/*\n"
+                + " * ^\n"
+                + " */",
+                "/*\n"
+                + " * \n"
+                + " * ^\n"
+                + " */",
+                true
+        );
+    }
+
+    public void testInsertCommentAsterisk_03() throws Exception {
+        insertBreakMultiLineComment(
+                "/*\n"
+                + " * something^\n"
+                + " */",
+                "/*\n"
+                + " * something\n"
+                + " * ^\n"
+                + " */",
+                true
+        );
+    }
+
+    public void testInsertCommentAsterisk_04() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*^\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "     * ^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                true
+        );
+    }
+
+    public void testInsertCommentAsterisk_05() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "     * ^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                true
+        );
+    }
+
+    public void testInsertCommentAsterisk_06() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "     * ^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "     * \n"
+                + "     * ^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                true
+        );
+    }
+
+    public void testInsertCommentAsterisk_07() throws Exception {
+        insertBreakMultiLineComment(
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "     * something^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                "class MyClass {\n"
+                + "\n"
+                + "    /*\n"
+                + "     * something\n"
+                + "     * ^\n"
+                + "     */\n"
+                + "    public function test() {\n"
+                + "        \n"
+                + "    }\n"
+                + "}\n",
+                true
+        );
+    }
 
 }
diff --git a/php.editor/tools/ASTPHP5Parser.cup b/php.editor/tools/ASTPHP5Parser.cup
index 65ada40880..82b0cbd993 100644
--- a/php.editor/tools/ASTPHP5Parser.cup
+++ b/php.editor/tools/ASTPHP5Parser.cup
@@ -1196,7 +1196,7 @@ namespace_name:list
 
 // used only in group uses
 group_namespace_parts ::=
-non_empty_group_namespace_parts:list
+non_empty_group_namespace_parts:list possible_comma
 {:
 	RESULT = list;
 :}
diff --git a/php.editor/tools/ASTPHP5Scanner.flex b/php.editor/tools/ASTPHP5Scanner.flex
index f8c04cdb6f..7c91c7bdcf 100644
--- a/php.editor/tools/ASTPHP5Scanner.flex
+++ b/php.editor/tools/ASTPHP5Scanner.flex
@@ -1046,6 +1046,11 @@ NOWDOC_CHARS=({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_\
     //return createFullSymbol(ASTPHP5Symbols.T_VAR_COMMENT);
 }
 
+<ST_IN_SCRIPTING>"/**"{WHITESPACE}*"@var"{WHITESPACE}{QUALIFIED_LABEL}("[""]")*([|]{QUALIFIED_LABEL}("[""]")*)*{WHITESPACE}("$"){LABEL}("["({LABEL} | "\"" | "'")*"]")*{WHITESPACE}?[^\n\r]*"*/" {
+    comment = yytext();
+    handleVarComment();
+}
+
 <ST_IN_SCRIPTING>"/**" {
 if (!parsePHPDoc()) {
 handleCommentStart();
diff --git a/php.editor/tools/Php5ColoringScanner.flex b/php.editor/tools/Php5ColoringScanner.flex
index de8e47425f..e618ccfd35 100644
--- a/php.editor/tools/Php5ColoringScanner.flex
+++ b/php.editor/tools/Php5ColoringScanner.flex
@@ -275,6 +275,8 @@ PHP_TYPE_BOOL=[b][o][o][l]
 // PHP7.1: These may be used as type names in PHP7.0 or older
 PHP_TYPE_VOID=[v][o][i][d]
 PHP_ITERABLE=[i][t][e][r][a][b][l][e]
+// PHP7.2
+PHP_TYPE_OBJECT=[o][b][j][e][c][t]
 
 
 
@@ -587,6 +589,10 @@ PHP_ITERABLE=[i][t][e][r][a][b][l][e]
     return PHPTokenId.PHP_TYPE_VOID;
 }
 
+<ST_PHP_IN_SCRIPTING>{PHP_TYPE_OBJECT} {
+    return PHPTokenId.PHP_TYPE_OBJECT;
+}
+
 <ST_PHP_IN_SCRIPTING>"->" {
     pushState(ST_PHP_LOOKING_FOR_PROPERTY);
     return PHPTokenId.PHP_OBJECT_OPERATOR;
diff --git a/php.project/src/org/netbeans/modules/php/project/ui/options/Bundle.properties b/php.project/src/org/netbeans/modules/php/project/ui/options/Bundle.properties
index 6f1285ecde..262451d763 100644
--- a/php.project/src/org/netbeans/modules/php/project/ui/options/Bundle.properties
+++ b/php.project/src/org/netbeans/modules/php/project/ui/options/Bundle.properties
@@ -54,7 +54,7 @@ LBL_Remove=&Remove
 LBL_MoveUp=Move &Up
 LBL_MoveDown=Move &Down
 LBL_CommandLine=Command Line
-LBL_PhpInterpreter=&PHP 5 Interpreter:
+LBL_PhpInterpreter=&PHP Interpreter:
 LBL_Browse=&Browse...
 LBL_Search=&Search...
 LBL_OpenResultIn=Open Result In:
diff --git a/php.twig/nbproject/project.xml b/php.twig/nbproject/project.xml
index 95d62b81f9..fea40b2183 100644
--- a/php.twig/nbproject/project.xml
+++ b/php.twig/nbproject/project.xml
@@ -253,6 +253,15 @@ Contributor(s):
                         <specification-version>1.21</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.spi.palette</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.47</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.openide.awt</code-name-base>
                     <build-prerequisite/>
@@ -261,6 +270,14 @@ Contributor(s):
                         <specification-version>7.43</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.43</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.openide.filesystems</code-name-base>
                     <build-prerequisite/>
diff --git a/php.twig/src/org/netbeans/modules/php/twig/editor/palette/TwigPaletteFactory.java b/php.twig/src/org/netbeans/modules/php/twig/editor/palette/TwigPaletteFactory.java
new file mode 100644
index 0000000000..e94fe256e9
--- /dev/null
+++ b/php.twig/src/org/netbeans/modules/php/twig/editor/palette/TwigPaletteFactory.java
@@ -0,0 +1,165 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ */
+package org.netbeans.modules.php.twig.editor.palette;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.text.JTextComponent;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.editor.Utilities;
+import org.netbeans.modules.php.twig.editor.gsf.TwigLanguage;
+import org.netbeans.spi.palette.DragAndDropHandler;
+import org.netbeans.spi.palette.PaletteActions;
+import org.netbeans.spi.palette.PaletteController;
+import org.netbeans.spi.palette.PaletteFactory;
+import org.openide.*;
+import org.openide.text.ActiveEditorDrop;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.datatransfer.ExTransferable;
+
+public class TwigPaletteFactory {
+
+    private static final String TWIG_PALETTE_FOLDER = "Palettes/Twig"; // NOI18N
+    private static PaletteController controller = null;
+
+    @MimeRegistration(mimeType = TwigLanguage.TWIG_MIME_TYPE, service = PaletteController.class)
+    public static PaletteController createPalette() throws IOException {
+        if (controller == null) {
+            controller = PaletteFactory.createPalette(
+                    TWIG_PALETTE_FOLDER,
+                    new TwigPaletteActions(),
+                    null,
+                    new TwigPaletteDragAndDropHandler()
+            );
+        }
+        return controller;
+    }
+
+    //~ Inner classes
+    private static class TwigPaletteActions extends PaletteActions {
+
+        @Override
+        public Action[] getImportActions() {
+            return new Action[0];
+        }
+
+        @Override
+        public Action[] getCustomPaletteActions() {
+            return new Action[0];
+        }
+
+        @Override
+        public Action[] getCustomCategoryActions(Lookup category) {
+            return new Action[0];
+        }
+
+        @Override
+        public Action[] getCustomItemActions(Lookup item) {
+            return new Action[0];
+        }
+
+        @Override
+        public Action getPreferredAction(Lookup item) {
+            return new TwigPaletteInsertAction(item);
+        }
+
+    }
+
+    private static class TwigPaletteInsertAction extends AbstractAction {
+
+        private static final long serialVersionUID = -2545383594436146990L;
+
+        private final Lookup item;
+
+        TwigPaletteInsertAction(Lookup item) {
+            this.item = item;
+        }
+
+        @NbBundle.Messages("TwigPaletteInsertAction.ErrorNoFocusedDocument=No document selected. Please select a document to insert the item into.")
+        @Override
+        public void actionPerformed(ActionEvent event) {
+
+            ActiveEditorDrop drop = item.lookup(ActiveEditorDrop.class);
+
+            JTextComponent target = Utilities.getFocusedComponent();
+            if (target == null) {
+                String msg = Bundle.TwigPaletteInsertAction_ErrorNoFocusedDocument();
+                DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(msg, NotifyDescriptor.ERROR_MESSAGE));
+                return;
+            }
+
+            if (drop == null) {
+                Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.INFO, "{0} doesn''t provide {1}", new Object[]{item.getClass(), ActiveEditorDrop.class}); //NOI18N
+                return;
+            }
+
+            try {
+                drop.handleTransfer(target);
+            } finally {
+                Utilities.requestFocus(target);
+            }
+
+            try {
+                PaletteController paletteController = TwigPaletteFactory.createPalette();
+                paletteController.clearSelection();
+            } catch (IOException ioe) {
+                Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.INFO, null, ioe);
+            }
+
+        }
+    }
+
+    private static class TwigPaletteDragAndDropHandler extends DragAndDropHandler {
+
+        public TwigPaletteDragAndDropHandler() {
+            super(true);
+        }
+
+        @Override
+        public void customize(ExTransferable t, Lookup item) {
+        }
+
+    }
+}
diff --git a/php.twig/src/org/netbeans/modules/php/twig/resources/layer.xml b/php.twig/src/org/netbeans/modules/php/twig/resources/layer.xml
index 7c455eb607..5088f64584 100644
--- a/php.twig/src/org/netbeans/modules/php/twig/resources/layer.xml
+++ b/php.twig/src/org/netbeans/modules/php/twig/resources/layer.xml
@@ -300,4 +300,17 @@ Contributor(s): Sebastian Hörl
             </file>
         </folder>
     </folder>
+    <folder name="Palettes">
+        <folder name="Twig">
+            <attr name="paletteDefaultVisible" boolvalue="false"/>
+            <file name="HTML.shadow">
+                <attr name="originalFile" stringvalue="HTMLPalette/HTML"/>
+                <attr name="position" intvalue="100"/>
+            </file>
+            <file name="HTML_Forms.shadow">
+                <attr name="originalFile" stringvalue="HTMLPalette/HTML_Forms"/>
+                <attr name="position" intvalue="200"/>
+            </file>
+        </folder>
+    </folder>
 </filesystem>


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists