Example usage for org.jdom2.input SAXBuilder SAXBuilder

List of usage examples for org.jdom2.input SAXBuilder SAXBuilder

Introduction

In this page you can find the example usage for org.jdom2.input SAXBuilder SAXBuilder.

Prototype

public SAXBuilder() 

Source Link

Document

Creates a new JAXP-based SAXBuilder.

Usage

From source file:fr.amap.lidar.amapvox.gui.viewer3d.Viewer3DFrameController.java

/**
 * Initializes the controller class.//from   ww  w  . j  av  a 2 s  . c  o  m
 */
@Override
public void initialize(URL url, ResourceBundle rb) {

    treeviewSceneObjects
            .setCellFactory(new Callback<TreeView<SceneObjectWrapper>, TreeCell<SceneObjectWrapper>>() {
                @Override
                public TreeCell<SceneObjectWrapper> call(TreeView<SceneObjectWrapper> param) {

                    return new SceneObjectTreeCell();
                }
            });

    root = new TreeItem<>();
    root.setExpanded(true);
    treeviewSceneObjects.setRoot(root);

    checkMenuItemPerspective.selectedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            checkMenuItemOrthographic.setSelected(!newValue);
        }
    });

    checkMenuItemOrthographic.selectedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            checkMenuItemPerspective.setSelected(!newValue);
        }
    });

    checkMenuItemOrthographic.selectedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            if (newValue) {

                try {
                    float near = Float.valueOf(textfieldCameraNear.getText());
                    float far = Float.valueOf(textfieldCameraFar.getText());
                    viewer3D.getJoglContext().getScene().getCamera().setViewToOrthographic(near, far, far, far,
                            near, far);
                    viewer3D.getJoglContext().updateCamera();
                    viewer3D.getJoglContext().refresh();
                } catch (Exception e) {
                }

            }
        }
    });

    checkMenuItemPerspective.selectedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            if (newValue) {

                try {
                    float fov = Float.valueOf(textFieldPerspective.getText());
                    float near = Float.valueOf(textfieldCameraNear.getText());
                    float far = Float.valueOf(textfieldCameraFar.getText());

                    viewer3D.getJoglContext().getScene().getCamera().setViewToPerspective(fov, near, far);
                    viewer3D.getJoglContext().updateCamera();
                    viewer3D.getJoglContext().refresh();

                } catch (Exception e) {
                }

            }
        }
    });

    textFieldPerspective.textProperty().addListener(new ChangeListener<String>() {

        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            try {
                float fov = Float.valueOf(newValue);
                TrackballCamera camera = viewer3D.getJoglContext().getScene().getCamera();
                viewer3D.getJoglContext().getScene().getCamera().setPerspective(fov, camera.getAspect(),
                        camera.getNearPersp(), camera.getFarPersp());
                viewer3D.getJoglContext().refresh();

            } catch (Exception e) {
            }
        }
    });

    tableColumnName.setCellValueFactory(
            new Callback<TableColumn.CellDataFeatures<Viewer3DFrameController.Attribut, String>, ObservableValue<String>>() {
                @Override
                public ObservableValue<String> call(TableColumn.CellDataFeatures<Attribut, String> param) {
                    return new SimpleStringProperty(param.getValue().getName());
                }
            });

    tableColumnValue.setCellValueFactory(
            new Callback<TableColumn.CellDataFeatures<Viewer3DFrameController.Attribut, String>, ObservableValue<String>>() {
                @Override
                public ObservableValue<String> call(TableColumn.CellDataFeatures<Attribut, String> param) {
                    return new SimpleStringProperty(String.valueOf(param.getValue().getValue()));
                }
            });

    comboboxGradient.getItems().addAll(Util.AVAILABLE_GRADIENT_COLOR_NAMES);
    comboboxGradient.getSelectionModel().select("HEAT");

    isHidden = false;

    colorPickerBackgroundColor.valueProperty().addListener(new ChangeListener<javafx.scene.paint.Color>() {
        @Override
        public void changed(ObservableValue<? extends javafx.scene.paint.Color> observable,
                javafx.scene.paint.Color oldValue, javafx.scene.paint.Color newValue) {

            try {

                //read sgv file
                URL resource = Viewer3DFrameController.class.getResource("/fxml/icons/pinceau.svg");

                SAXBuilder sxb = new SAXBuilder();
                Document document = sxb.build(resource);

                final Element root = document.getRootElement();

                //edit svg file
                final List<Element> graphicElements = root.getChildren("g", root.getNamespace());

                String hexColor = null;

                for (Element element : graphicElements) {
                    String attributeValue = element.getAttributeValue("label",
                            Namespace.getNamespace("http://www.inkscape.org/namespaces/inkscape"));

                    if (attributeValue != null && attributeValue.equals("ciel")) {
                        final Element ellipse = element.getChild("ellipse", root.getNamespace());
                        String style = ellipse.getAttributeValue("style");

                        int indexOf = style.indexOf("fill:#");
                        hexColor = Integer.toHexString((int) (newValue.getRed() * 255))
                                + Integer.toHexString((int) (newValue.getGreen() * 255))
                                + Integer.toHexString((int) (newValue.getBlue() * 255));

                        style = style.substring(0, indexOf + 6) + hexColor + style.substring(indexOf + 12);

                        ellipse.setAttribute("style", style);
                    } else if (attributeValue != null && attributeValue.equals("peinture")) {

                        final Element path = element.getChild("path", root.getNamespace());
                        String style = path.getAttributeValue("style");

                        int indexOf = style.indexOf("fill:#");
                        DecimalFormat df = new DecimalFormat("##");
                        hexColor = Integer.toHexString((int) (newValue.getRed() * 255))
                                + Integer.toHexString((int) (newValue.getGreen() * 255))
                                + Integer.toHexString((int) (newValue.getBlue() * 255));

                        style = style.substring(0, indexOf + 6) + hexColor + style.substring(indexOf + 12);

                        path.setAttribute("style", style);
                    }

                }

                if (hexColor != null) {

                    SVGConverter conv = new SVGConverter();

                    conv.setWidth(32.0f);
                    conv.setHeight(32.0f);

                    conv.setMediaType("image/png");

                    File tmpSVGFile = File.createTempFile("skycolor", ".svg");
                    File tmpPNGFile = File.createTempFile("skycolor", ".png");

                    //convert svg to png
                    conv.setSources(new String[] { tmpSVGFile.toURI().toURL().toString() });

                    conv.setDst(tmpPNGFile);

                    XMLOutputter output = new XMLOutputter(Format.getPrettyFormat());
                    output.output(document, new BufferedOutputStream(new FileOutputStream(tmpSVGFile)));

                    conv.execute();

                    //change sky icon
                    Image image = new Image(tmpPNGFile.toURI().toURL().toString());
                    imageviewSkyColor.setImage(image);
                }

            } catch (Exception ex) {
                java.util.logging.Logger.getLogger(Viewer3DFrameController.class.getName()).log(Level.SEVERE,
                        null, ex);
            }

            if (viewer3D != null) {
                viewer3D.getJoglContext().setWorldColor(new Vec3F((float) newValue.getRed(),
                        (float) newValue.getGreen(), (float) newValue.getBlue()));
                viewer3D.getJoglContext().refresh();
            }
        }
    });

    comboboxGradient.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {

        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

            String gradient = newValue;
            Color[] gradientColor = ColorGradient.GRADIENT_RAINBOW;

            for (int i = 0; i < Util.AVAILABLE_GRADIENT_COLORS.size(); i++) {

                if (Util.AVAILABLE_GRADIENT_COLOR_NAMES.get(i).equals(gradient)) {
                    gradientColor = Util.AVAILABLE_GRADIENT_COLORS.get(i);
                    i = Util.AVAILABLE_GRADIENT_COLOR_NAMES.size() - 1;
                }
            }

            //recalculate voxel color with the new gradient
            voxelSpace.updateColorValue(gradientColor);

            //update instance color buffer to gpu
            voxelSpace.updateInstanceColorBuffer();

            viewer3D.getJoglContext().refresh();

        }
    });

    colorPickerBackgroundColor.setValue(new javafx.scene.paint.Color(0.8, 0.8, 0.8, 1));
    colorpickerLightingAmbientColor.setValue(new javafx.scene.paint.Color(1.0, 1.0, 1.0, 1));
    colorpickerLightingDiffuseColor.setValue(new javafx.scene.paint.Color(1.0, 1.0, 1.0, 1));
    colorpickerLightingSpecularColor.setValue(new javafx.scene.paint.Color(1.0, 1.0, 1.0, 1));

    colorpickerLightingAmbientColor.valueProperty().addListener(new ChangeListener<javafx.scene.paint.Color>() {

        @Override
        public void changed(ObservableValue<? extends javafx.scene.paint.Color> observable,
                javafx.scene.paint.Color oldValue, javafx.scene.paint.Color newValue) {
            viewer3D.getJoglContext().getScene().setLightAmbientValue(new Vec3F((float) newValue.getRed(),
                    (float) newValue.getGreen(), (float) newValue.getBlue()));
            viewer3D.getJoglContext().refresh();
        }
    });

    colorpickerLightingDiffuseColor.valueProperty().addListener(new ChangeListener<javafx.scene.paint.Color>() {

        @Override
        public void changed(ObservableValue<? extends javafx.scene.paint.Color> observable,
                javafx.scene.paint.Color oldValue, javafx.scene.paint.Color newValue) {
            viewer3D.getJoglContext().getScene().setLightDiffuseValue(new Vec3F((float) newValue.getRed(),
                    (float) newValue.getGreen(), (float) newValue.getBlue()));
            viewer3D.getJoglContext().refresh();
        }
    });

    colorpickerLightingSpecularColor.valueProperty()
            .addListener(new ChangeListener<javafx.scene.paint.Color>() {

                @Override
                public void changed(ObservableValue<? extends javafx.scene.paint.Color> observable,
                        javafx.scene.paint.Color oldValue, javafx.scene.paint.Color newValue) {
                    viewer3D.getJoglContext().getScene()
                            .setLightSpecularValue(new Vec3F((float) newValue.getRed(),
                                    (float) newValue.getGreen(), (float) newValue.getBlue()));
                    viewer3D.getJoglContext().refresh();
                }
            });

    comboBoxAttributeToShow.getSelectionModel().selectedItemProperty()
            .addListener(new ChangeListener<String>() {

                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue,
                        String newValue) {
                    try {
                        voxelSpace.resetAttributValueRange();
                        voxelSpace.changeCurrentAttribut(newValue);
                        voxelSpace.updateVao();
                        voxelSpace.updateInstanceColorBuffer();
                        viewer3D.getJoglContext().refresh();
                        textFieldMinValue.getEditor()
                                .setText(String.valueOf(voxelSpace.getRealAttributValueMin()));
                        textFieldMaxValue.getEditor()
                                .setText(String.valueOf(voxelSpace.getRealAttributValueMax()));

                    } catch (Exception e) {
                    }

                }
            });

    final InstanceLightedShader ils = new InstanceLightedShader();
    final InstanceShader is = new InstanceShader();

    checkMenuItemEnableLighting.selectedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

            if (newValue) {
                voxelSpace.setShader(ils);
            } else {
                voxelSpace.setShader(is);
            }

            viewer3D.getJoglContext().refresh();
        }
    });

    /*textFieldFilterValues.setOnKeyReleased(new EventHandler<KeyEvent>() {
            
    @Override
    public void handle(KeyEvent event) {
                
        if(event.getCode() == KeyCode.ENTER){
            updateValuesFilter();
        }
    }
    });*/

    checkboxStretched.selectedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            if (newValue) {
                voxelSpace.setStretched(true);
                voxelSpace.updateValue();
                voxelSpace.updateInstanceColorBuffer();

                viewer3D.getJoglContext().refresh();
            } else {
                voxelSpace.setStretched(false);
                voxelSpace.updateValue();
                voxelSpace.updateInstanceColorBuffer();

                viewer3D.getJoglContext().refresh();
            }

        }
    });
    /*
            
    textfieldCameraNear.textProperty().addListener(new ChangeListener<String>() {
            
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        try{
            float near = Float.valueOf(newValue);
            TrackballCamera camera = joglContext.getScene().getCamera();
            if(radiobuttonOrthographicCamera.isSelected()){
                joglContext.getScene().getCamera().setOrthographic(camera.getLeft(), camera.getRight(), camera.getTop(), camera.getBottom(), near, camera.getFarOrtho());
                joglContext.updateCamera();
                joglContext.refresh();
            }else{
                joglContext.getScene().getCamera().setPerspective(camera.getFovy(), camera.getAspect(), near, camera.getFarPersp());
                joglContext.updateCamera();
                joglContext.refresh();
            }
                    
            joglContext.refresh();
                    
        }catch(Exception e){}
    }
    });
            
    textfieldCameraFar.textProperty().addListener(new ChangeListener<String>() {
            
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        try{
            float far = Float.valueOf(newValue);
            TrackballCamera camera = joglContext.getScene().getCamera();
            if(radiobuttonOrthographicCamera.isSelected()){
                camera.setOrthographic(camera.getLeft(), camera.getRight(), camera.getTop(), camera.getBottom(), camera.getNearOrtho(), far);
                joglContext.updateCamera();
                joglContext.refresh();
            }else{
                camera.setPerspective(camera.getFovy(), camera.getAspect(), camera.getNearPersp(), far);
                joglContext.updateCamera();
                joglContext.refresh();
            }
                    
            joglContext.refresh();
                    
        }catch(Exception e){}
    }
    });
    */

    comboBoxScalarField.setItems(comboBoxAttributeToShow.getItems());
    comboBoxScalarField.getItems().addListener(new ListChangeListener<String>() {
        @Override
        public void onChanged(ListChangeListener.Change<? extends String> c) {
            if (c.getList().size() > 0) {
                comboBoxScalarField.getSelectionModel().selectFirst();
            }
        }
    });

    checkMenuItemShowColorScale.selectedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            viewer3D.getScene().getSceneObject("color scale").setVisible(newValue);
            viewer3D.getJoglContext().refresh();
        }
    });

    ToggleGroup group = new ToggleGroup();
    radiobuttonDisplay.setToggleGroup(group);
    radiobuttonDontDisplay.setToggleGroup(group);

    CombinedFilter combFilter1 = new CombinedFilter(new Filter("x", 0.0f, Filter.EQUAL), null,
            CombinedFilter.AND);
    CombinedFilter combFilter2 = new CombinedFilter(new Filter("x", Float.NaN, Filter.EQUAL), null,
            CombinedFilter.AND);

    listviewFilters.getItems().add(new CombinedFilterItem("PadBVTotal", false, combFilter1.getFilter1(),
            combFilter1.getFilter2(), combFilter1.getType()));

    listviewFilters.getItems().add(new CombinedFilterItem("PadBVTotal", false, combFilter2.getFilter1(),
            combFilter2.getFilter2(), combFilter2.getType()));

}

From source file:fr.crnan.videso3d.databases.aip.AIP.java

License:Open Source License

public AIP(String path) {
    super(path);//from   w  w  w  .j a va2 s .  c om
    this.fileName = path;
    //construction du document  partir du fichier xml
    SAXBuilder sxb = new SAXBuilder();
    try {
        document = sxb.build(new File(path));
    } catch (JDOMException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

From source file:fr.crnan.videso3d.databases.aip.AIP.java

License:Open Source License

public AIP() {
    this.TSAs = new ArrayList<Couple<Integer, String>>();
    this.SIVs = new ArrayList<Couple<Integer, String>>();
    this.CTRs = new ArrayList<Couple<Integer, String>>();
    this.TMAs = new ArrayList<Couple<Integer, String>>();
    this.Ps = new ArrayList<Couple<Integer, String>>();
    this.Rs = new ArrayList<Couple<Integer, String>>();
    this.Ds = new ArrayList<Couple<Integer, String>>();
    this.FIRs = new ArrayList<Couple<Integer, String>>();
    this.UIRs = new ArrayList<Couple<Integer, String>>();
    this.LTAs = new ArrayList<Couple<Integer, String>>();
    this.UTAs = new ArrayList<Couple<Integer, String>>();
    this.CTAs = new ArrayList<Couple<Integer, String>>();
    this.OCAs = new ArrayList<Couple<Integer, String>>();
    this.PRNs = new ArrayList<Couple<Integer, String>>();
    this.CTLs = new ArrayList<Couple<Integer, String>>();
    this.Pjes = new ArrayList<Couple<Integer, String>>();
    this.Aers = new ArrayList<Couple<Integer, String>>();
    this.Vols = new ArrayList<Couple<Integer, String>>();
    this.Bals = new ArrayList<Couple<Integer, String>>();
    this.TrPlas = new ArrayList<Couple<Integer, String>>();
    final SAXBuilder sxb = new SAXBuilder();
    try {/* w w  w  .j a  v a2s  .  com*/
        this.name = DatabaseManager.getCurrentName(DatasManager.Type.AIP);
        //on rcupre le chemin d'accs au fichier xml  parser
        Statement st = DatabaseManager.getCurrent(DatasManager.Type.Databases);
        ResultSet rs;
        rs = st.executeQuery("select * from clefs where name='path' and type='"
                + DatabaseManager.getCurrentName(DatasManager.Type.AIP) + "'");
        if (rs.next()) {
            this.fileName = rs.getString(4);
            //Construction du document dans un autre thread afin de ne pas bloquer l'initialisation
            //TODO trouver une autre mthode car cela empche le chargement d'un projet
            //            new Thread(){
            //               @Override
            //               public void run(){
            try {
                document = sxb.build(new File(name + "_files", fileName));
            } catch (JDOMException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //               }
            //            }.start();
        }
        //TODO prendre en compte la possibilit qu'il n'y ait pas de bdd AIP
        Statement aipDB = DatabaseManager.getCurrentAIP();
        if (aipDB != null) {
            //on rcupre tous les volumes
            ResultSet rSet = aipDB.executeQuery("select * from volumes");
            while (rSet.next()) {
                Couple<Integer, String> id_name = new Couple<Integer, String>(rSet.getInt(2),
                        rSet.getString(4));
                String type = rSet.getString(3);
                getZones(string2type(type)).add(id_name);
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

From source file:fr.crnan.videso3d.databases.aip.AIP.java

License:Open Source License

/**
 * Determine if the file is a AIP file (XML containing AIP datas)
 * TODO Do it better//from  w  w w. ja v a2  s  . c o m
 * @param file
 * @return <code>true</code> if it is an AIP xml database
 */
public static boolean isAIPFile(File file) {
    SAXBuilder sxb = new SAXBuilder();
    boolean isAIP = false;
    try {
        isAIP = sxb.build(file).getRootElement().getName().equals("SiaExport");
    } catch (JDOMException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return isAIP;
}

From source file:fr.crnan.videso3d.databases.radio.Radio.java

License:Open Source License

public Radio(String path) {
    super(path);/*w ww  .  j av a2s  .  co  m*/
    this.path = path;

    SAXBuilder sxb = new SAXBuilder();
    try {
        document = sxb.build(new File(path));
    } catch (JDOMException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // nombre de fichiers  grer

    //   RadioDataManager radioDataManager = new RadioDataManager(path);
    //   radioDataManager.loadData();   
}

From source file:fr.crnan.videso3d.databases.terrainsoaci.TerrainsOaci.java

License:Open Source License

/**
 * Construit la bdd  partir du fichier dans path
 * @param path Chemin vers le rpertoire contenant la BDS
 */// w  w  w  .  j  av  a 2 s .  c o m
public TerrainsOaci(String path) {
    super(path);
    SAXBuilder sxb = new SAXBuilder();
    try {
        document = sxb.build(new File(path));
    } catch (JDOMException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

From source file:fr.crnan.videso3d.databases.terrainsoaci.TerrainsOaci.java

License:Open Source License

/**
 * Construit la bdd  partir du fichier dans path et lui donne le nom name
 * @param path Chemin vers le rpertoire contenant la BDS
 * @param name Le nom  donner  cette base de donnes
 *//*from  w ww .  ja v a  2 s  .  co m*/
public TerrainsOaci(String path, String name) {
    super(path);
    this.name = name;
    SAXBuilder sxb = new SAXBuilder();
    try {
        document = sxb.build(new File(path));
    } catch (JDOMException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

From source file:fr.d4delta.launcher.Launcher.java

License:Open Source License

/**
 * Main constructor of the launcher class.
 * @param rootFolder The folder where the dependecies will be downloaded (and loaded)
 * @param source The source pom. For example, if it's a remote pom, use "new URL("http://example.com/yourpom.xml").openStream()";
 * @param callBack The callback. The callback object receive feedback about the launch process.
 * @param args The args to give to the main methods.
 * @throws JDOMException if the given pom is an incorrect xml file.
 * @throws IOException  if something goes wrong while reading the file.
 *///from   ww w . ja va  2 s . c  o  m
public Launcher(File rootFolder, InputStream source, Callback callBack, String[] args)
        throws JDOMException, IOException {
    this.rootFolder = rootFolder;
    this.callback = callBack;
    this.args = args;
    root = new SAXBuilder().build(source).getRootElement();
    rootFolder.mkdirs();

    //Adding only the dependency type that will not throw exception: 
    //If you want for example maven native support, add it to the types manually before launching the Launcher
    types.add(new JarDependencyType(args));
}

From source file:fr.d4delta.launcher.Launcher.java

License:Open Source License

private void downloadDependency(Dependency dependency) {

    dependency.downloadPom();/*from  ww w  .  j a v  a2  s  .  c  o  m*/

    Element pomRoot;
    try {
        pomRoot = new SAXBuilder().build(dependency.pom).getRootElement();
    } catch (JDOMException | IOException ex) {
        callback.pomLoadError(dependency, ex);
        Utils.purge(dependency.folder);
        return;
    }
    Namespace namespace = pomRoot.getNamespace();

    loadProperties(pomRoot, namespace);
    registerRepositories(pomRoot, namespace);

    for (DependencyType t : types) {
        if (t.download(dependency, pomRoot, callback)) {
            dependency.updatePreferedRepoFile();
            isLoaded.put(dependency.groupId + dependency.artifactId + dependency.version, Boolean.TRUE);
            loadReferences(pomRoot, namespace);
            return;
        }
    }

}

From source file:fr.inria.diverse.trace.commons.PluginXMLHelper.java

License:Open Source License

public void loadDocument(IFile pluginXmlFile) {
    SAXBuilder sxb = new SAXBuilder();
    try {/*from  ww w  .j  a  va 2  s . com*/
        document = sxb.build(pluginXmlFile.getContents());

        root = document.getRootElement();
    } catch (Exception e) {
        //Activator.error(e.getMessage(), e);
    }
}