diff --git a/.gitignore b/.gitignore
index 7f143bb668c7a78c4b9d7f79178a7632a3842e08..414ed347db39472a872145635b998686481ae0a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,8 @@
-/bin
-/include
-/lib
-/local
-pip-selfcheck.json
-/share
-/app/__pycache__
-/.vscode
+#Python
+build
+*.egg-info
+*__pycache__
+.idea
+
+#database
+*.db
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 6afcf7eb8f40c2993c9c9ac91071112f4d1030db..0000000000000000000000000000000000000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2018 MaitresNageurs / README
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/README.md b/README.md
index 7f3e222fb7c675ccb39b50c5101bda660342f033..cb0eefdbe5f142b043a80584751d78893cd9e395 100644
--- a/README.md
+++ b/README.md
@@ -1,32 +1,22 @@
-
-# Labels Tower
-
-Système d'étiquettage utilisé par les projets CodingPool et BibPool.
-
-## Installation
-
-Le serveur flask utilise le port 5000.
-```
-$> sudo apt-get install python3 python3-pip git
-$> python3 -m pip install virtualenv
-$> virtualenv labelsTower
-$> git clone "le repo" labelsTower/.
-$> cd labelsTower
-$> source bin/activate
-$> sudo python3 -m pip install flask
-$> export FLASK_APP=app/labelsTower.py
-$> export LC_ALL=C.UTF-8
-$> export LANG=C.UTF-8
-$> flask run
-```
-
-## Fichiers dépendants du site final
-
-Contenu
-* ?
-
-Look & Feel
-* app/templates/browse.html
-* app/static/test.css
-* app/static/add_tuto.css
+# setup and start the labels system's API
+retrieve the application on gitlab repos
+
+    git clone --branch prototype_labelsTower git@gitlab.in2p3.fr:erichard/LabelsTower.git labels-back-end.git
+
+setup the database
+
+    cd labels-back-end.git
+    cd docker
+    ./build_dev.sh
+    ./run_dev.sh /bin/bash
+    mkdir instance
+    python3 -c 'from models import db;db.create_all()'
+    mv test.db codingpool.db
+    sqlite3 codingpool.db '.read data_codingpool.sql'
+    mv codingpool.db instance/
+    exit
+    
+run the application
+
+    ./run_dev.sh
 
diff --git a/app/.vscode/settings.json b/app/.vscode/settings.json
deleted file mode 100644
index 1922f60dff460b7930b0a8ebe3ac3287e6b5a979..0000000000000000000000000000000000000000
--- a/app/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "python.pythonPath": "/usr/bin/python3.5"
-}
\ No newline at end of file
diff --git a/app/add_tutos.py b/app/add_tutos.py
deleted file mode 100644
index 6b8715cf2e6e7ec7f6133deae56152f66ec4540b..0000000000000000000000000000000000000000
--- a/app/add_tutos.py
+++ /dev/null
@@ -1,48 +0,0 @@
-from sql_request import *
-
-def manage_parameters_error(title, link, labels, prescriber):
-    '''Check if there are any mistakes with user inputs.
-    '''
-    if not title:
-        return ("Erreur : Titre manquant")
-    if not link:
-        return ("Erreur : Lien manquant")
-    if not labels:
-        return ("Erreur : Sélectionnez au moins un label")
-    return (1)
-
-def add_title_link_prescriber(title, link, prescriber):
-    '''Check if the name of the tuto doesn't exist and if
-    if he doesn't exist, the tuto is add to database.
-    '''
-    res = session.query(Elements).filter_by(title=title, link=link).first()
-    if (res != None):
-        return ("Erreur : Ce tutoriel est déjà répertorié")
-    new_tuto = Elements(title= title, link= link, prescriber= prescriber)
-    session.add(new_tuto)
-    session.commit()
-    return (1)
-
-def update_tuto_labels(labels):
-    ''' Add for the last element, all these labels.
-    '''
-    id_element = session.query(Elements.id).order_by(Elements.id.desc()).first()[0]
-    labels = labels.split(',')
-    for label_id in labels:
-        session.add(Elements_labels(id_element=id_element, id_label=label_id))
-    session.commit()
-
-def add_tuto(title, link, labels, prescriber):
-    '''Take the user inputs (title, link and selected labels)
-    and add the tuto in 'tutos' table ([title, link, date])
-    '''
-    res = manage_parameters_error(title, link, labels, prescriber)
-    res = 1
-    if (res != 1):
-        return (res)
-    res = add_title_link_prescriber(title, link, prescriber)
-    if (res != 1):
-        return (res)
-    update_tuto_labels(labels)
-    return ("Tutoriel ajouté avec succès")
-
diff --git a/app/bdd_for_labels.db b/app/bdd_for_labels.db
deleted file mode 100644
index ccee70d00a5594267e715cdd285865321dc3ed40..0000000000000000000000000000000000000000
Binary files a/app/bdd_for_labels.db and /dev/null differ
diff --git a/app/createBdd.sql b/app/createBdd.sql
deleted file mode 100644
index 6d6a150b1f1394223efcbc6d391201bfd6a4d6e1..0000000000000000000000000000000000000000
--- a/app/createBdd.sql
+++ /dev/null
@@ -1,59 +0,0 @@
-/*CREATE DATABASE labels_tower CHARACTER SET 'utf8';
-USE labels_tower;*/
-
-CREATE TABLE IF NOT EXISTS elements (
-	id INTEGER PRIMARY KEY AUTOINCREMENT,
-	title VARCHAR(400),
-	authors VARCHAR(500),
-	institution VARCHAR(300),
-	format VARCHAR(100), -- ex: journal, livre, lien
-	booktitle VARCHAR(200),
-	journal VARCHAR (150),
-	volume UNSIGNED SMALLINT,
-	number UNSIGNED SMALLINT,
-	pages UNSIGNED SMALLINT,
-	relese_date DATE,
-	link VARCHAR(500)
-);
-
-
-CREATE TABLE IF NOT EXISTS labels (
-	id INTEGER PRIMARY KEY AUTOINCREMENT,
-	name VARCHAR(100) NOT NULL,
-	father_id UNISGNED MEDIUM INT DEFAULT NULL
-);
-
-CREATE TABLE IF NOT EXISTS labels_languages (
-	id_label INTEGER,
-	country_code VARCHAR(3),
-	name VARCHAR(100),
-	CONSTRAINT pk_labels_languages PRIMARY KEY(id_label, country_code)
-);
-
-CREATE TABLE IF NOT EXISTS elements_labels (
-	id_element UNSIGNED MEDIUM INT NOT NULL,
-	id_label UNSIGNED MEDIUM INT NOT NULL,
-	CONSTRAINT pk_tutos_labels PRIMARY KEY(id_element, id_label)
-	-- aucun des 2 ne sont uniques et moi j'utilise les 2 pour mes requêtes
-);
-
-CREATE TABLE IF NOT EXISTS alias (
-	id_label UNSIGNED MEDIUM INT,
-	name VARCHAR(100) NOT NULL,
-	CONSTRAINT pk_alias PRIMARY KEY (name)
-);
-
-CREATE TABLE IF NOT EXISTS votes (
-	link VARCHAR(200) NOT NULL,
-	mark TINYINT,
-	author_mail VARCHAR(100),
-	CONSTRAINT pk_votes PRIMARY KEY (link, author_mail)
-);
-
-CREATE TABLE IF NOT EXISTS comments (
-	link VARCHAR(200) NOT NULL,
-	message VARCHAR(500),
-	author_mail VARCHAR(100),
-	date DATETIME DEFAULT CURRENT_TIMESTAMP,
-	CONSTRAINT pk_comments PRIMARY KEY (message, author_mail, date)
-);
\ No newline at end of file
diff --git a/app/labels b/app/labels
deleted file mode 100644
index e09f93da07354e5c106e199749d3a556de57a9f4..0000000000000000000000000000000000000000
--- a/app/labels
+++ /dev/null
@@ -1,40 +0,0 @@
-Calcul
-	Vectorisation
-	Profilage
-	Gpu, Gpgpu, accélérateur(s), co-processeur(s)
-	Data Science, Big Data, Science des données
-	Calcul Intensif, Hpc
-	Machine Learning, Apprentissage, Deep Learning
-Controle-Commande-Acquisition
-Enseignement
-	Creation Plongeons
-	Notebooks
-Génie Logiciel
-	Construction, Build, Make
-	Documentation
-	Test
-	Gestion de versions, Version, Versions
-		Git
-			test1
-			test2
-				test3
-	Gitlab
-	Integration Continue
-	Deploiement
-	Gestion de paquets
-Interfaces Homme-Machine, Ihm, Gui
-Langages
-	Cpp, C++, Cplusplus
-	Go
-	Python
-	Ada
-	Scala
-Programmation
-	Orientée Objet, Orientée Objets, OO, objet, objets
-	Fonctionnelle
-Virtualisation
-	Docker
-	Singularity
-	Jupyter
-Administration
-	Orchestration
diff --git a/app/labelsTower.py b/app/labelsTower.py
deleted file mode 100644
index e8cf7c4e5dcc4f74e18c2372fac8e1388f965ad1..0000000000000000000000000000000000000000
--- a/app/labelsTower.py
+++ /dev/null
@@ -1,114 +0,0 @@
-from update_labels import *
-from add_tutos import *
-from sql_request import *
-from flask import Flask, request, render_template, render_template_string, jsonify
-
-class CustomFlask(Flask):
-    jinja_options = Flask.jinja_options.copy()
-    jinja_options.update(dict(
-        block_start_string='DD',
-        block_end_string='DDE',
-        variable_start_string='[[',
-        variable_end_string=']]',
-        comment_start_string='RF',
-        comment_end_string='BG',
-        ))
-
-app = CustomFlask(__name__)
-app.config['DEBUG'] = True
-
-text_component = {"project_name": "LabelsTower",
-    "labels_title_fr": "Étiquettes",
-    "labels_title_ang": "Labels",
-    "result_title_fr": "Tutoriels",
-    "result_title_ang": "Tutorials"}
-
-@app.route('/')
-def home():
-    return search_tuto()
-
-@app.route('/get_datas/<string:name>', defaults={'id': None}, methods=['POST', 'GET'])
-@app.route('/get_datas/<string:name>/<path:id>')
-def get_datas(name, id):
-    '''Return labels table or alias table for Ajax.
-    '''
-    if (name == 'labels'):
-        return (jsonify(send_sql('SELECT * FROM labels')))
-    if (name == 'all_labels'):
-        return (jsonify(send_sql("SELECT id_label, labels_languages.name, father_id FROM labels_languages INNER JOIN labels ON labels.id = labels_languages.id_label  WHERE  labels_languages.country_code IN ('"+id+"',  'U')")))
-    elif (name == 'main_labels'):
-        return (jsonify(send_sql("SELECT * FROM (SELECT id_label, labels_languages.name, father_id FROM labels_languages INNER JOIN labels ON labels.id = labels_languages.id_label WHERE labels_languages.country_code IN ('"+id+"',  'U')) WHERE father_id IS NULL")))
-    elif (name == 'labels_lang_id'):
-        return (jsonify(send_sql('SELECT id FROM labels WHERE name IN ("Français", "Anglais")')))
-    elif (name == 'alias'):
-        return (jsonify(send_sql('SELECT * from alias')))
-    elif (name == 'link'):
-        return (jsonify(send_sql('SELECT id_element FROM elements_labels WHERE id_label = '+id)))
-    elif (name == 'labels_links'):
-        return (jsonify(send_sql('SELECT DISTINCT id_element FROM elements_labels WHERE id_label IN ('+id+')')))
-    elif (name == 'labels_links_unselect'):
-        return (jsonify(send_sql('SELECT DISTINCT id_element FROM elements_labels WHERE id_label NOT IN ('+id+')')))
-    elif (name == 'all_id_elements_except'):
-        return (jsonify(send_sql('SELECT DISTINCT id FROM elements WHERE id NOT IN ('+id+')')))
-    elif (name == 'title_tuto'): #anciennement tuto
-        return (jsonify(send_sql("SELECT title FROM elements WHERE link = '"+id+"'")))
-    elif (name == 'nb_labels'):
-        return (jsonify(send_sql('SELECT COUNT (*) FROM labels')))
-    elif (name == 'all_tutos'):
-        return (jsonify(send_sql('SELECT * FROM elements ORDER BY title')))
-    elif (name == 'tutos'):
-        return (jsonify(send_sql('SELECT * FROM elements WHERE id IN ('+id+') ORDER BY title')))
-    elif (name == 'id_labels_tutos'):
-        return (jsonify(send_sql('SELECT DISTINCT id_label FROM elements_labels WHERE id_element IN ('+request.form['data']+')')))
-    elif (name == 'labels_of_a_link'):
-        return (jsonify(send_sql("SELECT id_label FROM elements_labels WHERE id_element = '"+id+"'")))
-    elif (name == 'all_tutos_labels'):
-        return (jsonify(send_sql("SELECT * FROM elements_labels")))
-    elif (name == 'labels_of_a_link_in'):
-        return (jsonify(send_sql('SELECT id_label FROM elements_labels WHERE id_element IN ('+id+')')))
-    elif (name == 'tutos_language'):
-        return (jsonify(send_sql('SELECT id_element from elements_labels WHERE id_label = (SELECT id FROM labels WHERE name = "'+id+'")')))
-    elif (name == 'tuto_family'):
-        ''' Select all links that have the same group of labels.
-        '''
-        labels_tab = id.split(',')
-        sql_request = ''
-        n = 0
-        nb_labels = len(labels_tab) 
-        for id_lab in labels_tab:
-            if (n == nb_labels - 1):
-                sql_request += 'SELECT id_element FROM elements_labels WHERE id_label IN ('+id_lab+')'
-            else:
-                sql_request += 'SELECT id_element FROM elements_labels WHERE id_label IN ('+id_lab+') INTERSECT '
-            n += 1
-        return (jsonify(send_sql(sql_request)))
-    return 'Error'
-
-@app.route('/manage_labels', methods=['GET', 'POST'])
-def manage_labels():
-    '''For manage all labels and alias register in database.
-    (Add new labels and alias actually)
-    '''
-    if request.method == 'GET':
-        res = send_sql('SELECT * FROM labels')
-        return render_template('manage_labels.html', labels=res)
-    else:
-        update_labels(request.form['alias_input'])
-        return render_template('manage_labels.html', labels=request.form['alias_input'], success="Succès de l'envoie")
-
-@app.route('/browse')
-def search_tuto():
-    return render_template('browse.html', txt=text_component)
-
-@app.route('/add_new_tuto', methods=['GET', 'POST'])
-def add_new_tuto():
-    '''Add new tuto in database.
-    '''
-    if request.method == 'GET':
-        return render_template('add_new_tuto.html')
-    else:
-        res = add_tuto(request.form['title'], request.form['link'], request.form['labels'], request.form['prescriber'])
-        return render_template('add_new_tuto.html', status=res)
-
-if __name__ == '__main__':
-    app.run(host='0.0.0.0', port=80)
\ No newline at end of file
diff --git a/app/labels_system/__init__.py b/app/labels_system/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c1516ef35be33d5be7ce8c9a60bdf0cea0a5eea
--- /dev/null
+++ b/app/labels_system/__init__.py
@@ -0,0 +1,6 @@
+from flask import Blueprint
+
+bp = Blueprint('sort', __name__)
+
+from app.labels_system import routes
+
diff --git a/app/labels_system/getter.py b/app/labels_system/getter.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2cb67e09b3d62bf20524167ea6cbc259c35843c
--- /dev/null
+++ b/app/labels_system/getter.py
@@ -0,0 +1,214 @@
+from typing import Dict, List
+from .request_db import send_query_to_db
+
+
+def get_selected_elements(id_mandatory_labels: int, id_forbiden_labels: str, number_of_mandatory_labels: str) -> List[Dict[int, str]] :
+    """
+    Return a set of elements which wear mandatory labels and don't wear forbiden labels.
+    :param id_mandatory_labels: str
+    :param id_forbiden_labels: str
+    :param number_of_mandatory_labels: int
+    :return: List[Dict[int, str]]
+
+    EXEMPLE
+    -------
+    >>> print(get_selected_elements("","",0)) # si aucun labels n'est interdit ou obligatoire
+    [{'id': 4, 'name': 'peugeot, 2000'}, {'id': 3, 'name': 'renault, 2000'}, {'id': 2, 'name': 'renault, bleu, 2000'}, {'id': 1, 'name': 'renault, rouge, 2000'}]
+    >>> print(get_selected_elements("1,2","5,9",2)) # si la voiture doit-être bleu
+    [{'id': 4, 'name': 'peugeot, 2000'}]
+    >>> print(get_selected_elements("5","",1))
+    [{'id': 3, 'name': 'renault, 2000'}, {'id': 2, 'name': 'renault, bleu, 2000'}, {'id': 1, 'name': 'renault, rouge, 2000'}]
+    >>> print(get_selected_elements("","5",0))
+    [{'id': 4, 'name': 'peugeot, 2000'}]
+    """
+    #query slightly vary if number_of_mandatory_labels > 0 or not
+    if(number_of_mandatory_labels):
+        query = '''
+                    SELECT 
+                        ELEMENT.id
+                        , element_name 
+                    FROM 
+                        ELEMENT 
+                            INNER JOIN 
+                        ELEMENT_LABEL 
+                                ON ELEMENT.id=ELEMENT_LABEL.id_element 
+                            INNER JOIN 
+                        LABEL 
+                                ON ELEMENT_LABEL.id_label=LABEL.id 
+                    WHERE 
+                            id_label IN ({}) 
+                        AND 
+                            id_element NOT IN (
+                                            SELECT 
+                                                id_element 
+                                            FROM 
+                                                ELEMENT 
+                                                    INNER JOIN 
+                                                ELEMENT_LABEL 
+                                                        ON ELEMENT.id=ELEMENT_LABEL.id_element 
+                                                    INNER JOIN 
+                                                LABEL 
+                                                        ON ELEMENT_LABEL.id_label=LABEL.id  
+                                            WHERE 
+                                                id_label IN ({})) 
+                                            GROUP BY id_element 
+                                            HAVING COUNT(*) = {} 
+                                            Order BY element_name
+        '''.format(id_mandatory_labels, id_forbiden_labels, number_of_mandatory_labels)
+    else:
+        query = '''
+                    SELECT 
+                        DISTINCT ELEMENT.id
+                        , element_name 
+                    FROM 
+                        ELEMENT 
+                            INNER JOIN 
+                        ELEMENT_LABEL 
+                                ON ELEMENT.id = ELEMENT_LABEL.id_element 
+                            INNER JOIN 
+                        label 
+                                ON ELEMENT_LABEL.id_label=label.id 
+                    WHERE 
+                        element_name NOT IN (
+                                        SELECT 
+                                            element_name 
+                                        FROM 
+                                            ELEMENT 
+                                                INNER JOIN 
+                                            ELEMENT_LABEL 
+                                                    ON ELEMENT.id = ELEMENT_LABEL.id_element 
+                                                INNER JOIN 
+                                            label 
+                                                    ON ELEMENT_LABEL.id_label = label.id 
+                                        WHERE  id_label IN ({}) ) 
+                                        ORDER BY element_name ASC
+        '''.format(id_forbiden_labels)
+
+    selected_elements = send_query_to_db(query)
+    return selected_elements
+
+def get_discriminating_labels(selected_elements: List[Dict[int, str]]) -> List[Dict[int, str]] :
+    """
+        Return all labels associated to selected elements except non discrminating
+        :param elements: list[Dict[str, str]]
+        :return: list[Dict[int, str]]
+
+        EXEMPLE
+        -------
+        >>> get_discriminating_labels([{"id":2,"name":"renault, bleu, 2000"}, {"id":1,"name":"renault, rouge, 2000"}])
+        [{'id': 8, 'name': 'rouge'}, {'id': 9, 'name': 'bleu'}]
+        >>> get_discriminating_labels([])
+        []
+    """
+    id_selected_elements: str = get_ids(selected_elements)
+    number_of_selected_elements = len(selected_elements)
+
+    # select labels of selected elements and delete labels commun to all elements
+    query = '''
+                    SELECT 
+                        LABEL.id
+                        , label_name 
+                    FROM 
+                        ELEMENT 
+                            INNER JOIN 
+                        ELEMENT_LABEL 
+                                ON ELEMENT.id=ELEMENT_LABEL.id_element 
+                            INNER JOIN 
+                        LABEL 
+                                ON ELEMENT_LABEL.id_label=LABEL.id 
+                    WHERE 
+                        id_element IN ({}) 
+                    GROUP BY id_label 
+                    HAVING COUNT(*) < {}
+        '''.format(id_selected_elements, number_of_selected_elements)
+
+    discriminating_labels = send_query_to_db(query)
+    return discriminating_labels
+
+def get_high_discriminating_labels(discriminating_labels: List[Dict[int, str]]) -> List[Dict[int, str]] :
+    """
+        Return a set of new labels to continue your selection with it
+        :param elements: list[Dict[str, str]]
+        :return: list[Dict[int, str]]
+
+        EXEMPLE
+        -------
+        >>> get_high_discriminating_labels([{"id":7, "name":"couleur"}, {"id":8, "name":"rouge"}, {"id":9, "name":"bleu"}])
+        [{'id': 7, 'name': 'couleur'}]
+    """
+    id_discriminating_labels = get_ids(discriminating_labels)
+
+    # delete all childrens of discriminating labels set
+    query = '''
+                    SELECT 
+                        * 
+                    FROM (
+                            SELECT 
+                                id, 
+                                label_name
+                            FROM 
+                                LABEL 
+                            WHERE 
+                                LABEL.id IN({})
+                        ) 
+                    WHERE 
+                        id NOT IN   (
+                                    SELECT 
+                                        B.id AS id_fils 
+                                    FROM    (
+                                            SELECT 
+                                                * 
+                                            FROM 
+                                                LABEL 
+                                            WHERE 
+                                                id IN ({})
+                                            ) AS A, 
+                                        LABEL AS B 
+                                    WHERE 
+                                        A.id=B.father_id
+                                    )
+        '''.format(id_discriminating_labels, id_discriminating_labels)
+
+    labels = send_query_to_db(query)
+    return labels
+
+def get_ids(objects: List[Dict[int, str]]) -> str :
+    """
+    Return all ids of the object's set
+    :param objects: list[Dict[str, str]]
+    :param attribut: str
+    :return: str
+
+    EXEMPLE
+    -------
+    >>> print(get_ids([{"id":1, "name":"a"},{"id":2, "name":"b"}]))
+    1,2
+    >>> print(get_ids([]))
+    <BLANKLINE>
+    """
+    objects_ids = ""
+    for object in objects:
+        objects_ids +=  str(object["id"]) + ","
+    #remove last extra comma
+    return objects_ids[0:-1]
+
+def get_user_selection(number_of_mandatory_labels: int, optional1: str, optional2: str) -> tuple :
+    '''
+    Return the right values of id_mandatory_labels and id_forbiden_labels when optional2 is missing.
+    It is necessary because optional1 could be id_mandatory_labels or id_forbiden_labels.
+    :param number_of_mandatory_labels: int
+    :param optional1: str
+    :param optional2: str
+    :return:
+    '''
+    if int(number_of_mandatory_labels):
+        id_mandatory_labels = optional1
+        id_forbiden_labels = optional2
+    else:
+        id_mandatory_labels = optional2
+        id_forbiden_labels = optional1
+    return id_mandatory_labels, id_forbiden_labels
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod(verbose=True)
\ No newline at end of file
diff --git a/app/labels_system/request_db.py b/app/labels_system/request_db.py
new file mode 100644
index 0000000000000000000000000000000000000000..602c4a87950c8910b294ac283d8b97245b2d78e6
--- /dev/null
+++ b/app/labels_system/request_db.py
@@ -0,0 +1,15 @@
+from typing import Dict, List
+from app import db
+
+def send_query_to_db(query: str) -> List[Dict[int, str]] :
+    '''
+    Return the result of the query send to the database
+    :param query: str
+    :return: List[Dict[int, str]]
+    '''
+    result = []
+    stmt = db.text(query)
+    response = db.session.execute(stmt)
+    for row in response:
+         result.append({"id": row[0], "name": row[1]})
+    return result
\ No newline at end of file
diff --git a/app/labels_system/routes.py b/app/labels_system/routes.py
new file mode 100644
index 0000000000000000000000000000000000000000..249788514ae55d7e7aaee15be80481c9efafddb0
--- /dev/null
+++ b/app/labels_system/routes.py
@@ -0,0 +1,25 @@
+from typing import Dict, List
+import json
+from app.labels_system.getter import get_selected_elements, get_discriminating_labels, get_high_discriminating_labels, get_user_selection
+from app.labels_system import bp
+
+
+#URLs call to update labels and elements along researchs
+
+@bp.route('/search/<int:number_of_mandatory_labels>', defaults={'optional1':'', 'optional2':''})
+@bp.route('/search/<int:number_of_mandatory_labels>/<string:optional1>', defaults={'optional2':''})
+@bp.route('/search/<int:number_of_mandatory_labels>/<string:optional1>/<string:optional2>')
+def search(number_of_mandatory_labels: int, optional1: str, optional2: str) -> List[List[Dict[int, str]]] :
+    '''
+    Return updated lists of selected elements and high discriminating labels useful to continu research
+    :param number_of_mandatory_labels: int
+    :param optional1: str
+    :param optional2: str
+    :return: List[List[Dict[int, str]]]
+    '''
+    id_mandatory_labels, id_forbiden_labels = get_user_selection(number_of_mandatory_labels, optional1, optional2)
+    selected_elements = get_selected_elements(id_mandatory_labels, id_forbiden_labels, number_of_mandatory_labels)
+    high_discriminating_labels = get_high_discriminating_labels(get_discriminating_labels(selected_elements))
+    result = [selected_elements, high_discriminating_labels]
+    return json.dumps(result)
+
diff --git a/app/my_datas b/app/my_datas
deleted file mode 100644
index 3222ff6b08435077bf2c3efea7313c696849b450..0000000000000000000000000000000000000000
--- a/app/my_datas
+++ /dev/null
@@ -1,3 +0,0 @@
-jour:merchredi
-mois:octobre
-anne:2018
diff --git a/app/sql_request.py b/app/sql_request.py
deleted file mode 100644
index 0c95c01a19fa79e2fe78b93b2337d01bc4e4b705..0000000000000000000000000000000000000000
--- a/app/sql_request.py
+++ /dev/null
@@ -1,29 +0,0 @@
-import datetime
-from sqlalchemy import create_engine, Column, Integer, String, DateTime
-from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import sessionmaker
-
-engine = create_engine('sqlite:///app/bdd_for_labels.db', connect_args={'check_same_thread':False}, echo=True)
-con = engine.connect()
-Base = declarative_base()
-Session = sessionmaker(bind=engine)
-session = Session()
-
-class Elements(Base):
-    __tablename__ = 'elements'
-    id = Column(Integer, primary_key=True)
-    title = Column(String(400))
-    link = Column(String(500))
-    date = Column(DateTime, default=datetime.datetime.utcnow)
-    prescriber = Column(String(200))
-
-class Elements_labels(Base):
-    __tablename__ = 'elements_labels'
-    id_element = Column(Integer, primary_key=True)
-    id_label = Column(Integer, primary_key=True)
-
-def send_sql(request):
-    req = con.execute(request)
-    result = []
-    [result.append(dict(g)) for g in req]
-    return (result)
\ No newline at end of file
diff --git a/app/static/css/annimation.css b/app/static/css/annimation.css
deleted file mode 100644
index 096787315386df0e9123352f195dbda16cdbe3ac..0000000000000000000000000000000000000000
--- a/app/static/css/annimation.css
+++ /dev/null
@@ -1,20 +0,0 @@
-.tutos-enter-active {
-	transition: all 1.2s;
-}
-
-.new_labels-enter-active {
-	transition: all 0.4s;
-}
-
-.new_labels-leave-active, .tutos-leave-active {
-	transition: all 0.1s;
-}
-
-.new_labels-enter, .new_labels-leave-to, .tutos-enter, .tutos-leave-to {
-	opacity: 0;
-	transform: translateY(0px);
-}
-
-.len_input {
-	width: 400px;
-}
\ No newline at end of file
diff --git a/app/static/css/hierarchy.css b/app/static/css/hierarchy.css
deleted file mode 100644
index 95db03ac127578d8f8d15a99f57e75a920e6e4d5..0000000000000000000000000000000000000000
--- a/app/static/css/hierarchy.css
+++ /dev/null
@@ -1,46 +0,0 @@
-.hierarchy {
-    padding-top: 5px;
-    font-size: 18px;
-    text-align: left;
-    line-height: 190%;
-}
-
-/* Hierarchy title */
-
-#hierarchy-title_ang {
-    margin-left: 9%;
-    margin-right: 4%;
-}
-
-#hierarchy-title_fr {
-    margin-left: -6%;
-    margin-right: 4%;
-}
-
-
-/* Hierarchy language icons */
-
-.hierarchy-lang_icon_left {
-    height:25px;
-    width:25px;
-    margin-right: 3%;
-}
-
-.hierarchy-lang_icon_right {
-    height:25px;
-    width:25px;
-}
-
-/* Hierarchy diver icon */
-
-.hierarchy-icone_left {
-    float: left;
-    margin-right: 4%;
-    margin-left: 10px;
-    margin-top: 7px;
-}
-.hierarchy-icone_right {
-    float: right;
-    margin-right: 10px;
-    margin-top: 5px;
-}
\ No newline at end of file
diff --git a/app/static/css/main.css b/app/static/css/main.css
deleted file mode 100644
index fdbfe6bc4df274bcec69e197d186da8439c192d5..0000000000000000000000000000000000000000
--- a/app/static/css/main.css
+++ /dev/null
@@ -1,25 +0,0 @@
-#project_title {
-    text-align: center;
-}
-
-.title {
-    font-size: 20px;
-    text-align: center;
-}
-
-.glyphicon-tags {
-    font-size: 16px;
-    padding-right: 10px;
-}
-
-.badge_title {
-    padding-top: 5px;
-}
-
-body {
-    background-image: url("../img/background_loop.png");
-}
-
-.panel {
-    background-color: rgba(255, 255, 255, 0.8);
-}
\ No newline at end of file
diff --git a/app/static/css/result.css b/app/static/css/result.css
deleted file mode 100644
index c886d7e5f8abd5f780aac551032e4768284e9d6e..0000000000000000000000000000000000000000
--- a/app/static/css/result.css
+++ /dev/null
@@ -1,37 +0,0 @@
-#result-title {
-    margin-left: 9%;
-    margin-right: 3%;
-}
-
-
-/* Result language icons */
-
-#result-lang {
-    margin-left: 0%;
-}
-
-.result-lang_icon_left {
-    height:25px; 
-    width:25px;
-    margin-right: 2%;
-}
-
-.result-lang_icon_right {
-    height:25px;
-    width:25px;
-    margin-right: 3%;
-}
-
-
-/* Result elements */
-
-.list-group {
-    overflow:scroll;
-    max-height: 470px;
-}
-
-.single_result {
-    font-size: 16px;
-    padding-left: 20px;
-    text-align: center;
-}
\ No newline at end of file
diff --git a/app/static/img/background.png b/app/static/img/background.png
deleted file mode 100644
index 532f8a9908603e9de23f4e5768b3b0268798f3d7..0000000000000000000000000000000000000000
Binary files a/app/static/img/background.png and /dev/null differ
diff --git a/app/static/img/background_loop2.png b/app/static/img/background_loop2.png
deleted file mode 100644
index 04753458eb390a52335609cc29f61d5ecf1094df..0000000000000000000000000000000000000000
Binary files a/app/static/img/background_loop2.png and /dev/null differ
diff --git a/app/static/img/background_loop3.png b/app/static/img/background_loop3.png
deleted file mode 100644
index 1232d0fd32972539c6999f50fe1d50499acfb277..0000000000000000000000000000000000000000
Binary files a/app/static/img/background_loop3.png and /dev/null differ
diff --git a/app/static/img/background_origin.png b/app/static/img/background_origin.png
deleted file mode 100644
index fc0da49e01b64fb9a6f054ecd48e5a29f72bee76..0000000000000000000000000000000000000000
Binary files a/app/static/img/background_origin.png and /dev/null differ
diff --git a/app/static/img/boue_france.png b/app/static/img/boue_france.png
deleted file mode 100644
index 99b0cb40a579aef85e72d2abf9ee7fc7e8644c27..0000000000000000000000000000000000000000
Binary files a/app/static/img/boue_france.png and /dev/null differ
diff --git a/app/static/img/boue_france_black.png b/app/static/img/boue_france_black.png
deleted file mode 100644
index 482398b1dd626a19dfd21ca2b261479d7612b0d3..0000000000000000000000000000000000000000
Binary files a/app/static/img/boue_france_black.png and /dev/null differ
diff --git a/app/static/img/boue_usa.png b/app/static/img/boue_usa.png
deleted file mode 100644
index 7fd6dff66c05867ccc88418bbfa8b11a696dbf28..0000000000000000000000000000000000000000
Binary files a/app/static/img/boue_usa.png and /dev/null differ
diff --git a/app/static/img/boue_usa_black.png b/app/static/img/boue_usa_black.png
deleted file mode 100644
index 03300b70cb8b12d37660b5281e82178f0623dcb1..0000000000000000000000000000000000000000
Binary files a/app/static/img/boue_usa_black.png and /dev/null differ
diff --git a/app/static/img/checked.png b/app/static/img/checked.png
deleted file mode 100644
index 5f56440a13b9ffa3e112ca7f58d8dafc3974b43e..0000000000000000000000000000000000000000
Binary files a/app/static/img/checked.png and /dev/null differ
diff --git a/app/static/img/close.png b/app/static/img/close.png
deleted file mode 100644
index 191fe2b9151082a3d3d3a7bb108c2bcfee0c99ef..0000000000000000000000000000000000000000
Binary files a/app/static/img/close.png and /dev/null differ
diff --git a/app/static/img/die.black.png b/app/static/img/die.black.png
deleted file mode 100644
index 4dadf5fc44634741ed86d1b9b499f08c68207f31..0000000000000000000000000000000000000000
Binary files a/app/static/img/die.black.png and /dev/null differ
diff --git a/app/static/img/die.grey.png b/app/static/img/die.grey.png
deleted file mode 100644
index 2c664819e1ff0e67fbe0314c74f856a98d4765e6..0000000000000000000000000000000000000000
Binary files a/app/static/img/die.grey.png and /dev/null differ
diff --git a/app/static/img/die.red.png b/app/static/img/die.red.png
deleted file mode 100644
index 0df2a49c98898f64f94a028d9f2b530ed3d88bd0..0000000000000000000000000000000000000000
Binary files a/app/static/img/die.red.png and /dev/null differ
diff --git a/app/static/img/swimming.small.png b/app/static/img/swimming.small.png
deleted file mode 100644
index dcec0843da94de48879a3e5fed202862f0b403d1..0000000000000000000000000000000000000000
Binary files a/app/static/img/swimming.small.png and /dev/null differ
diff --git a/app/static/img/swimming.small_no.png b/app/static/img/swimming.small_no.png
deleted file mode 100644
index d822ac41b57e512b8c5214f5e316932179ae62e7..0000000000000000000000000000000000000000
Binary files a/app/static/img/swimming.small_no.png and /dev/null differ
diff --git a/app/static/img/swimming.small_yes.png b/app/static/img/swimming.small_yes.png
deleted file mode 100644
index 28cad747905bd4fefe1aaf1fbc87c7fe442c0b5a..0000000000000000000000000000000000000000
Binary files a/app/static/img/swimming.small_yes.png and /dev/null differ
diff --git a/app/static/img/synchronized.black.png b/app/static/img/synchronized.black.png
deleted file mode 100644
index eeae4e433e384eff72a1011ae54bf63ca9c8c1c8..0000000000000000000000000000000000000000
Binary files a/app/static/img/synchronized.black.png and /dev/null differ
diff --git a/app/static/img/synchronized.green.png b/app/static/img/synchronized.green.png
deleted file mode 100644
index 608cf4111df6f5eb7f44bcdf641717f17e0a632f..0000000000000000000000000000000000000000
Binary files a/app/static/img/synchronized.green.png and /dev/null differ
diff --git a/app/static/img/synchronized.grey.png b/app/static/img/synchronized.grey.png
deleted file mode 100644
index 46aa77f0a658980a800a92ccf6a1b0e334d10c77..0000000000000000000000000000000000000000
Binary files a/app/static/img/synchronized.grey.png and /dev/null differ
diff --git a/app/static/img/unchecked_swimming.small.png b/app/static/img/unchecked_swimming.small.png
deleted file mode 100644
index 7c1bcf8f1d9d8b78fd29ff7f4c74e23093085099..0000000000000000000000000000000000000000
Binary files a/app/static/img/unchecked_swimming.small.png and /dev/null differ
diff --git a/app/static/js/ajax.js b/app/static/js/ajax.js
deleted file mode 100644
index 28c559feb37ae7f94217b78f5928b37910f6754a..0000000000000000000000000000000000000000
--- a/app/static/js/ajax.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Functions for send ajax request with differents methods. 
- */
-
-function request_ajax(address) {
-    /**
-     * Send request with GET.
-     */
-    var xhr = new XMLHttpRequest();
-    xhr.open("GET", "get_datas/"+address, false);
-    xhr.send();
-    return (xhr.responseText);
-};
-
-function request_ajax_post(address, data) {
-    /**
-     * Send request by POST.
-     */
-    var req = new XMLHttpRequest();
-    req.open('POST', "get_datas/"+address, false);
-    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-    req.send("data="+data);
-    return (req.responseText);
-}
\ No newline at end of file
diff --git a/app/static/js/array_opperations.js b/app/static/js/array_opperations.js
deleted file mode 100644
index 4c45228c2962e6372d8f137b98aa088583cfeac5..0000000000000000000000000000000000000000
--- a/app/static/js/array_opperations.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * This file contains all the functions to operate on arrays. 
- */
-
-function create_empty_tab(size) {
-    /**
-     * Create a table to store the status of labels 
-     * (activate or innactivate).
-     */
-    var result = [];
-    for (var i = 0; i < size; i++)
-        result.push(0);
-    return (result);
-}
-
-function is_in_tab(value, tab, index, dimension) {
-    /**
-     * Search a value in multidimensional array and if
-     * if it is found return it's index. Else return -1.
-     */
-    for (var i = 0; tab[i]; i++) {
-        if ((dimension == 1 && tab[i] == value) ||
-            (dimension == 2 && tab[i][index] == value))
-            return (i);
-    }
-    return (-1);
-}
-
-function calc_nb_occu_in_array(value, tab) {
-    /**
-     * Return the number of occurence of the 'value' in 'tab'.
-     */
-    var nb_occu = 0;
-    for (var i = 0; tab[i]; i++) {
-        if (value == tab[i])
-            nb_occu++;
-    }
-    return (nb_occu);
-}
-
-function sort_tab_of_labels(tab_labels) {
-    /**
-     * Sort by alphabetic order new_labels_tab.
-     */
-    var result = [];
-    var sort_tab = [];
-    var labels_copy = [];
-    for (var i = 0; tab_labels[i]; i++)
-        sort_tab.push(tab_labels[i]['name']);
-    labels_copy = sort_tab.slice(0);
-    sort_tab = sort_tab.sort();
-    for (var i = 0; sort_tab[i]; i++)
-        result.push(tab_labels[labels_copy.indexOf(sort_tab[i])]);
-    return (result);
-}
\ No newline at end of file
diff --git a/app/static/js/cookies.js b/app/static/js/cookies.js
deleted file mode 100644
index f8816e095626e76f2234618dad9e8a307739f0b7..0000000000000000000000000000000000000000
--- a/app/static/js/cookies.js
+++ /dev/null
@@ -1,94 +0,0 @@
-function setCookie(name, value) {
-    /**
-     * Create a cookie for ten years?
-     */
-    var today = new Date();
-    var expires = new Date();
-
-    expires.setTime(today.getTime() + (10*365*24*60*60*1000));
-    document.cookie = name + "=" + value + ";expires=" + expires.toGMTString();
-}
-
-function getCookie(name) {
-    /**
-     * Retrieve the value of a cookie due to it's name.
-     */
-    var regex = new RegExp("(?:; )?" + name + "=([^;]*);?");
-
-    if (regex.test(document.cookie))
-        return (RegExp["$1"]);
-    else
-        return null;
-}
-
-function labels_tab_to_str(labels) {
-    /**
-     * Transform tab of labels to string.
-     * ex : [{'id_label': 1, 'name': "Learn C++", 'father_id': 6}]
-     * = 1, Learn C++, 6|...
-     */
-    var result = "";
-    var inter = []
-    for (var i = 0; labels[i]; i++)
-        inter.push([labels[i]['id_label'], labels[i]['name'], labels[i]['father_id']]);
-    result = inter.join('|');
-    return (result);
-}
-
-function str_to_labels_tab(str) {
-    /**
-     * Transform string to 2D tab.
-     * Ex : "42, test, 5|56, salut, 3" =>
-     * [[42, 'test', 5], [56, 'salut', 3]]
-     */
-    var result = [];
-    var split = str.split('|');
-    for (var i = 0; split[i]; i++) {
-        var inter = split[i].split(',')
-        if (inter.length == 2)
-            result.push({'id_label': inter[0], 'name': inter[1]});
-        else
-            result.push({'id_label': inter[0], 'name': inter[1], 'father_id': inter[2]});
-    }
-    return (result);
-}
-
-function save_session() {
-    /**
-     * Save old_labels_tab and unselect_tab in Cookies.
-     */
-    setCookie("old_labels_tab", labels_tab_to_str(hierarchy.old_labels_tab));
-    setCookie("unselect_labels_tab", labels_tab_to_str(hierarchy.unselect_tab));
-    setCookie("language", hierarchy.labels_language);
-}
-
-function setup_session() {
-    /**
-     * Return 0 no cookies are found return 0.
-     * Else return 1 if old_tab cookie are found => the initialization of tutos
-     * and labels is done from the labels contained in old_tab.
-     * If language cookie are found, juste th language is modified => labels tab's 
-     * need to be initialise (return 0).
-     */
-    var success = 0;
-    if (getCookie('language') != null && getCookie('language').length != 0)
-        hierarchy.labels_language = result.labels_language = getCookie('language');
-    if (getCookie('old_labels_tab') != null && getCookie('old_labels_tab').length != 0)
-        hierarchy.old_labels_tab = str_to_labels_tab(getCookie('old_labels_tab'));
-    if (getCookie('unselect_labels_tab') != null && getCookie('unselect_labels_tab').length != 0)
-        hierarchy.unselect_tab = str_to_labels_tab(getCookie('unselect_labels_tab'));
-
-    if (getCookie('old_labels_tab') != null && getCookie('old_labels_tab').length != 0) {
-        hierarchy.init_all_labels();
-        result.maj_results(3);
-        success = 1;
-    } else if (getCookie('unselect_labels_tab') != null && getCookie('unselect_labels_tab').length != 0) {
-        hierarchy.init_all_labels();
-        result.init_result_tab();
-        del_unselect_language();
-        result.del_unselected_results();
-        hierarchy.maj_new_labels_tab();
-        success = 1;
-    }
-    return (success);
-}
\ No newline at end of file
diff --git a/app/static/js/create_arbo.js b/app/static/js/create_arbo.js
deleted file mode 100644
index b95c875f75049a15b66e0fc36668737a93125eda..0000000000000000000000000000000000000000
--- a/app/static/js/create_arbo.js
+++ /dev/null
@@ -1,137 +0,0 @@
-function request(address) {
-	var xhr = new XMLHttpRequest();
-	/*xhr.onreadystatechange = function () {
-		//if (xhr.readyState == 4)
-		//alert("reponse = " + xhr.responseText);
-	};*/
-	xhr.open("GET", /*"http://127.0.0.1:5000/"+*/address, false);
-	xhr.send();
-	return (xhr.responseText);
-}
-
-function have_a_father(labels_tab, father_id) {
-	/**
-	 * Search in labels_tab if there is a father of a child.
-	 * If it as father return his position else return -1.
-	 */
-	for (var i = 0; labels_tab[i]; i++) {
-		if (labels_tab[i]['id'] == father_id)
-			return (i);
-	}
-	return (-1);
-}
-
-function add_in_tab(tab, add, posi) {
-	/**
-	* Put add in tab[posi] without remove the previous value.
-	 */
-	var result = [];
-
-	for (var i = 0; i < posi; i++)
-		result[i] = tab[i];
-	result.push(add);
-	for(var i = posi; tab[i]; i++)
-		result.push(tab[i]);
-	return(result);
-}
-
-	function order_labels_list(labels_tab) {
-	/**
-	 * Organise labels_tab in this order:
-	 * Before: [[DadA, ...], [DadB, ...], [ChildA, ...], [ChildA, ...]]
-	 * After : [[DadA, ...], [ChildA, ...], [ChildA, ...], [DadB, ...]]
-	 * Dad before his childs. It's for print labels in the order.
-	 * In the first loop we retrieve labels without father and in the
-	 * second we add their childs at their right.
-	 */
-	var labels_tab_final = [];
-	var posi_father = -1;
-
-	for (var i = 0; labels_tab[i]; i++) {
-		if (!labels_tab[i]['father_id'])
-			labels_tab_final.push(labels_tab[i]);
-	}
-	for (var i = 0; labels_tab[i]; i++) {
-		posi_father = -1;
-		if (labels_tab[i]['father_id']) {
-			posi_father = have_a_father(labels_tab_final, labels_tab[i]['father_id']);
-			if (posi_father != -1)
-				labels_tab_final = add_in_tab(labels_tab_final, labels_tab[i], posi_father + 1);
-		}
-	}
-	return (labels_tab_final);
-}
-
-function revstr(str) {
-	/**
-	 * Return reverse string pass in parameter.
-	 */
-	for (var i = 0, inter = '', str = str.split(''); i < str.length / 2; i++) {
-		inter = str[i];
-		str[i] = str[str.length - 1 - i];
-		str[str.length - 1 - i] = inter;
-	}
-	return (str.join(''));
-}
-
-function create_tab_lvl_intent(labels_tab) {
-	/**
-	 * Create tab in each case represent a number of father
-	 * of the label.
-	 */
-	var result = [];
-	var len = 0;
-
-	for (var i = 0; labels_tab[i]; i++) {
-		var inter = labels_tab[i];
-		while (inter['father_id'] != undefined) {
-			len++;
-			inter = labels_tab[have_a_father(labels_tab, inter['father_id'])];
-		}
-		result.push(len);
-		len = 0;
-	}
-	return (result);
-}
-
-function intent(labels_tab, tab_lvl_intent) {
-	/**
-	 * Create a new labels_tab and add \t to label name due
-	 * to tab_lvl_intent.
-	 */
-	var result = labels_tab;
-
-	for (var i = 0; i < tab_lvl_intent.length; i++) {
-		if (tab_lvl_intent[i] != 0) {
-			labels_tab[i]['name'] = revstr(labels_tab[i]['name']);
-			labels_tab[i]['name'] = labels_tab[i]['name'].split('');
-			for (var p = 0; p < tab_lvl_intent[i]; p++) {
-				if ((p == 0 && tab_lvl_intent[i] <= 1) ||
-					(p == tab_lvl_intent[i] - 1))
-					labels_tab[i]['name'].push('────├');
-				else
-					labels_tab[i]['name'].push('────');
-			}
-			labels_tab[i]['name'] = labels_tab[i]['name'].join('');
-			labels_tab[i]['name'] = revstr(labels_tab[i]['name']);
-		}
-		else {
-			var inter = '[' + labels_tab[i]['name'] + ']';
-			labels_tab[i]['name'] = inter;
-		}
-	}
-	return (result);
-}
-
-function order_intent_labels_tab() {
-	/**
-	 * Order labels tab and add the right number of \t before labels
-	 * name.
-	 */
-	var labels_tab = JSON.parse(request("get_datas/labels"))
-
-	labels_tab = order_labels_list(labels_tab);
-	var lvl_intent = create_tab_lvl_intent(labels_tab);
-	var intent_labels_tab = intent(labels_tab, lvl_intent);
-	return (intent_labels_tab);
-}
\ No newline at end of file
diff --git a/app/static/js/father_child.js b/app/static/js/father_child.js
deleted file mode 100644
index 96ce857e27f4ca6c950f3635b92a59f96108e83a..0000000000000000000000000000000000000000
--- a/app/static/js/father_child.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * All functions for manage interactions between father and chlid labels.
- */
-
-function get_all_childs_of_father(tab_labels, father_id) {
-    /**
-     * Gets all the childs (label id) from a father.
-     */
-    var childs = [];
-    for (var i = 0; tab_labels[i]; i++) {
-        if (tab_labels[i]['father_id'] == father_id) {
-            childs.push(tab_labels[i]['id_label'])
-            childs = childs.concat(get_all_childs_of_father(tab_labels, tab_labels[i]['id_label']));
-        }
-    }
-    return (childs);
-}
-
-function get_all_fathers_of_child(tab_labels, child_id) { //MOD
-    /**
-     * Gets all the fathers (label id) of a child.
-     */
-    var fathers = [];
-    var posi_child = is_in_tab(child_id, tab_labels, 'id_label', 2);
-    if (posi_child <= 0)
-        return (fathers);
-    for (var i = 0; tab_labels[i]; i++) {
-        if (tab_labels[posi_child]['father_id'] == tab_labels[i]['id_label']) {
-            fathers.push(tab_labels[i]['id_label']);
-            fathers = fathers.concat(get_all_fathers_of_child(tab_labels, tab_labels[i]['id_label']));
-        }
-    }
-    return (fathers);
-}
-
-function get_all_childs_from_old(tab_labels, old_labels_tab) {
-    /**
-     * Put in array all label childs of every labels 
-     * contain hierarchy.old_labels_tab.
-     */
-    var all_childs = [];
-    for (var i = 0; old_labels_tab[i]; i++)
-        all_childs = all_childs.concat(get_all_childs_of_father(tab_labels, old_labels_tab[i]['id_label']));
-    return (all_childs);
-}
-
-function remove_childs_of_tab(tab_id, all_labels) { //MOD
-    /**
-     * If there is a father with his child in new tab,
-     * we have to keep just the father, not his childs.
-     */
-    var fathers = [];
-    var in_tab = 0;
-    var result = [];
-    for (var i = 0; tab_id[i]; i++) {
-        fathers = get_all_fathers_of_child(all_labels, tab_id[i]);
-        if (fathers.length != 0) {
-            for (var j = 0; fathers[j]; j++) {
-                var posi = is_in_tab(fathers[j], tab_id, null, 1);
-                if (posi != -1)
-                    in_tab = 1;
-            }
-        }
-        if (fathers.len == 0 || in_tab == 0)
-            result.push(tab_id[i]);
-        in_tab = 0;
-    }
-    return (result);
-}
-
-function add_father_to_child_tab(old_tab, childs_tab) {
-    for (var i = 0; old_tab[i]; i++) 
-        childs_tab += ','+old_tab[i][0];
-    return (childs_tab);
-}
-
-function keep_the_oldest_father(labels_tab) {
-    /**
-     * If there is two labels in tab of the same family,
-     * the oldest is keep. For example : Computer => [OS] => [free]
-     * Ubuntu. We select OS between OS and free.
-     */
-     /*for (var i = 0; labels_tab[i]; i++)
-        if (get_all_childs_of_father());*/
-}
\ No newline at end of file
diff --git a/app/static/js/labels.js b/app/static/js/labels.js
deleted file mode 100644
index 12bb1942dce073299b56336126c459cff1208945..0000000000000000000000000000000000000000
--- a/app/static/js/labels.js
+++ /dev/null
@@ -1,92 +0,0 @@
-function create_tab_of_labels(tab_id_labels, all_labels) { // MOD
-    /**
-     * Thanks to an array of id_labels, select row in all_labels
-     * that have the same id and copy this row [id, name, father_id]
-     * in result.
-     */
-    var result = [];
-    var index = -1;
-    var in_old_labels_tab = -1;
-    for (var i = 0; tab_id_labels[i]; i++) {
-        in_old_labels_tab = is_in_tab(tab_id_labels[i], hierarchy.old_labels_tab, 'id_label', 2);
-        if (in_old_labels_tab == -1) {
-            index = is_in_tab(tab_id_labels[i], all_labels, 'id_label', 2);
-            if (index != -1)
-                result.push(all_labels[index]);
-        }
-    }
-    return (result);
-}
-
-function get_diff_between_labels(labels_tab) {
-    /**
-     * Put in 'final_tab' all labels that do not appear
-     * in each tutorial.
-     */
-    var final_tab = [];
-    var nb_tutos = result.result_tab.length;
-    var nb_occu = 0;
-    for (var i = 0; labels_tab[i]; i++) {
-        nb_occu = calc_nb_occu_in_array(labels_tab[i], labels_tab);
-        if (nb_occu != nb_tutos && is_in_tab(labels_tab[i], final_tab, null, 1) == -1) {
-            final_tab.push(labels_tab[i]);
-        }
-    }
-    return (final_tab);
-}
-
-function remove_labels_language(labels_tab, id_labels_lang, line) {
-    /**
-     * deletes labels that correspond to a language.
-     * if line == 1 => [id_label, name, father_id] is return
-     * else jsute the ID of the label is return.
-     */
-    var new_tab = [];
-    var a = 0;
-    for (var i = 0; labels_tab[i]; i++) {
-        for (var j = 0; id_labels_lang[j]; j++) {
-            if (labels_tab[i]['id_label'] == id_labels_lang[j]['id'])
-                a++;
-        }
-        if (a == 0)
-            (line == 1) ? new_tab.push(labels_tab[i]) : new_tab.push(labels_tab[i]['id_label']);
-        a = 0;
-    }
-    return (new_tab);
-}
-
-function join_labels_from_old_tab(old_tab) {
-    /**
-     * Take all id of labels from old_tab and join them.
-     * Used for sql requests.
-     * ex : '12,34,15,...'
-     */
-    var result = '';
-    for (var i = 0; old_tab[i]; i++) {
-        if (i != 0)
-            result += ',';
-        result += old_tab[i]['id_label'];
-    }
-    return (result);
-}
-
-function join_col(tab, col) {
-    /**
-     * Join all col of the tab.
-     */
-    var result = '';
-    for (var i = 0; tab[i]; i++) {
-        if (i != 0)
-            result += ',';
-        result += tab[i][col];
-    }
-    return (result);
-}
-
-function get_id_label(label_name) {
-    var posi = is_in_tab(label_name, hierarchy.all_labels, 1, 2);
-    if (posi != -1)
-        return (hierarchy.all_labels[posi][0]);
-    else
-        return (-1);
-}
\ No newline at end of file
diff --git a/app/static/js/maj_tutorial.js b/app/static/js/maj_tutorial.js
deleted file mode 100644
index 6657f0f32429e7ef01642d80ee83c84c8ed0a911..0000000000000000000000000000000000000000
--- a/app/static/js/maj_tutorial.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * These functions allow to update the list of tutotials
- * to print based on the labels contain in hierarcy.old_labels_tab.
- */
-
-function del_unselect_language() {
-	/**
-	 * Due to link of tutos, check if each tuto correspond at the language
-	 * selected. If not, the tuto is not selected for result_tab.
-	 */
-	var posi = -2;
-	var result_final = [];
-
-	if (result.results_language[0] % 2 == 0 && result.results_language[1] % 2 == 0)
-		return;
-	for (var i = 0; result.result_tab[i]; i++) {
-		if (result.results_language[0] % 2 == 0)
-			posi = is_in_tab(result.result_tab[i]['id'], result.results_fr, 'id_element', 2);
-		if (posi >= 0)
-			result_final.push(result.result_tab[i]);
-		posi = -2;
-		if (result.results_language[1] % 2 == 0)
-			posi = is_in_tab(result.result_tab[i]['id'], result.results_us, 'id_element', 2);
-		if (posi >= 0)
-			result_final.push(result.result_tab[i]);
-		posi = -2;
-	}
-	result.result_tab = result_final;
-}
-
-// function maj_results_from_db() {
-// 	/**
-//	 *                 [NOT USED]
-// 	 * Selects links related to labels in 'childs_of_old_labels'
-// 	 * and labels in old tab and fill 'result_tab' with tutorials
-// 	 * related to this links.
-// 	 */
-// 	var all_links = [];
-// 	var join_labels = '';
-// 	result.result_tab = [];
-// 	if (result.childs_of_old_labels.length != 0)
-// 		join_labels = result.childs_of_old_labels.join(',');
-// 	else
-// 		join_labels = join_labels_from_old_tab(hierarchy.old_labels_tab);
-// 	join_labels = add_father_to_child_tab(hierarchy.old_labels_tab, join_labels);
-// 	all_links = JSON.parse(request_ajax("labels_links/"+join_labels));
-// 	result.links_of_results = "'"+all_links.join("','")+"'";
-// 	result.result_tab = JSON.parse(request_ajax_post('tutos', result.links_of_results));
-// 	del_unselect_language();
-// 	result.del_unselected_results();
-// 	hierarchy.maj_new_labels_tab();
-// }
-
-function maj_tutos_after_unselect() {
-	/**
-	 * If old_labels_tab is empty and the user add one label to
-	 * unselect tab. Every childs of this label are selected and 
-	 * all elements excepted the elements that have a link to these childs
-	 * are selected to be display. 
-	 */
-	var all_id_labels = [];
-	var join_labels = '';
-	result.result_tab = [];
-	result.links_of_results = ""
-	var unselect_label_childs = get_all_childs_of_father(hierarchy.all_labels, hierarchy.unselect_tab[0]['id_label'])
-	if (unselect_label_childs.length == 0)
-		join_labels = hierarchy.unselect_tab[0]['id_label'];
-	else
-		join_labels = unselect_label_childs.join(',')+','+hierarchy.unselect_tab[0]['id_label'];
-	elements_have_these_labels = JSON.parse(request_ajax("labels_links/"+join_labels));
-	elements_have_not_these_labels = JSON.parse(request_ajax("all_id_elements_except/"+join_col(elements_have_these_labels, 'id_element')));
-	for (var i = 0; elements_have_not_these_labels[i]; i++) {
-		if (i != 0)
-			result.links_of_results += ',';
-		result.links_of_results += elements_have_not_these_labels[i]['id'];
-	}
-	result.result_tab = JSON.parse(request_ajax("tutos/"+result.links_of_results));
-	del_unselect_language();
-	result.del_unselected_results();
-	hierarchy.maj_new_labels_tab();
-}
-
-function maj_results_after_remove() {
-	/**
-	 * Select tutos from database but each tuto
-	 * returned must have all selected labels. For example, AFTER
-	 * REMOVE one label they stay : "Calcul, CPP". The tutos
-	 * selected must have this two labels.
-	 */
-	join_labels = join_labels_from_old_tab(hierarchy.old_labels_tab);
-	all_id_labels = JSON.parse(request_ajax("tuto_family/"+join_labels));
-	var all_id_labels_line = "";
-	for (var i = 0; all_id_labels[i]; i++) {
-		if (i != 0)
-			all_id_labels_line += ',';
-		all_id_labels_line += all_id_labels[i]['id_element'];
-	}
-	result.links_of_results = all_id_labels_line;
-	result.result_tab = JSON.parse(request_ajax("tutos/"+result.links_of_results));
-	del_unselect_language();
-	result.del_unselected_results();
-	hierarchy.maj_new_labels_tab();
-}
-
-function maj_results_for_many_labels() {
-	/**
-	 * If there is several labels (after left click on one label from hierachy)
-	 * in old_tab we select just the last and we keep
-	 * just the tutos in result_tab affiliate to this label.
-	 * This happens when a [new label is added] to precedents
-	 */
-	var final_tab = [];
-	var last_label = hierarchy.old_labels_tab[hierarchy.old_labels_tab.length - 1]['id_label'];
-	var tuto_links_last_label = JSON.parse(request_ajax("link/"+last_label));
-	
-	for (var i = 0; result.result_tab[i]; i++) {
-		if (is_in_tab(result.result_tab[i]['id'], tuto_links_last_label, 'id_element', 2) != -1)
-			final_tab.push(result.result_tab[i]);
-	}
-	result.result_tab = final_tab;
-	del_unselect_language();
-	result.del_unselected_results();
-	hierarchy.maj_new_labels_tab();
-}
\ No newline at end of file
diff --git a/app/templates/add_new_tuto.html b/app/templates/add_new_tuto.html
deleted file mode 100644
index e7972526d0264287891fe4babab83a9094e86d53..0000000000000000000000000000000000000000
--- a/app/templates/add_new_tuto.html
+++ /dev/null
@@ -1,197 +0,0 @@
-<html>
-	<head>
-		<meta charset="utf-8">
-		<meta http-equiv="X-UA-Compatible" content="IE=edge">
-		<meta name="viewport" content="width=device-width, initial-scale=1">
-		<title>Add tutos</title>
-	
-		<link rel="stylesheet" href="static/css/annimation.css">
-		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
-		<!-- Bootstrap -->
-		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
-	</head>
-
-	<body>
-
-		<div class="container">
-
-			<div class="row">
-				<div class="offset-md-1 col-md-3">
-					<div id='hierarchy'>
-						<span v-for='(value, index) in table'>
-							<span @click="activate_lo(index)">{{ value.name }}</span>
-							<img v-if='is_active[index] % 2 == 1' src="static/img/checked.png">
-							<br>
-						</span>
-						<!-- {{ labels_add }} -->
-						<span v-bind:src="labels_add"></span>
-						<br>
-					</div>
-				</div>
-
-
-				<div class="col-md-7">
-					<div id='form'>
-						<h3>[[ status ]]</h3>
-						<form name="form1" method="post" action="">
-							<div class="form-group">
-								<label>Titre : </label>
-								<input type="text" name="title" class="len_input form-control" placeholder="Créer une image Docker"/>
-							</div>
-							<div class="form-group">
-								<label>Lien : </label>
-								<input type="text" name="link" class="len_inpu form-control" placeholder="http://"/>
-							</div>
-							<div class="form-group">
-								<label>Prescriber : </label>
-								<input type="text" name="prescriber" class="len_input form-control" placeholder="Jean Dupont"/>
-							</div>
-							<input type="hidden" name="labels" value= "" />
-							<button type="submit" class="btn btn-primary">Ajouter</button>
-						</form>
-					</div>
-				</div>
-			</div>
-
-		</div>
-
-	</body>
-
-	<script src="static/js/create_arbo.js"></script>
-	<script src="static/js/array_opperations.js"></script>
-	<script src="static/js/ajax.js"></script>
-	<script>
-
-		function create_empty_tab(size) {
-			var result = [];
-
-			for (var i = 0; i < size; i++)
-				result.push(0);
-			return (result);
-		}
-
-		function get_all_childs_of_father(tab_labels, father_id) {
-   			/**
-   			* Gets all the childs (label id) from a father.
-   			*/
-   			var childs = [];
-  			for (var i = 0; tab_labels[i]; i++) {
-  		      	if (tab_labels[i]['id_label'] == father_id) {
-					childs.push(tab_labels[i]['id'])
-					childs = childs.concat(get_all_childs_of_father(tab_labels, tab_labels[i]['id']));
-   		    	}
-    		}
-  			return (childs);
-		}
-
-		function get_father_id(child_id) {
-			var posi = is_in_tab(child_id, hierarchy.all_labels, 'id', 2);
-			if (posi != -1)
-				return (hierarchy.all_labels[posi]['father_id']);
-			else
-				return (-1);
-		}
-
-		function get_all_fathers_of_child(tab_labels, child_id) {
-			/**
-			 * Gets all the fathers (label id) of a child.
-			 */
-			var fathers = [];
-			var posi_child = is_in_tab(child_id, tab_labels, 'id', 2);
-			for (var i = 0; tab_labels[i]; i++) {
-				if (tab_labels[posi_child]['father_id'] == tab_labels[i]['id']) {
-					fathers.push(tab_labels[i]['id']);
-					fathers = fathers.concat(get_all_fathers_of_child(tab_labels, tab_labels[i]['id']));
-				}
-			}
-			return (fathers);
-		}
-
-		function having_child_in_active_tab(father_id) {
-			var all_childs = get_all_childs_of_father(hierarchy.all_labels, father_id);
-			for (var i = 0; all_childs[i]; i++) {
-				posi = is_in_tab(all_childs[i], hierarchy.labels_add, 0, 1);
-				if (posi != -1)
-					return (1);
-			}
-			return (-1);
-		}
-
-		function remove_father_label(father_id) {
-			if (having_child_in_active_tab(father_id) != 1) {
-				//suppression du pere si il a pas d'enfants selectionnés
-				var posi = is_in_tab(father_id, hierarchy.labels_add, 0, 1);
-				hierarchy.labels_add.splice(posi, 1);
-				hierarchy.is_active[is_in_tab(father_id, hierarchy.table, 0, 2)] = 0;
-				//L> on remonte au pere suivant.
-				var new_father = get_father_id(father_id);
-				if (new_father != -1)
-					remove_father_label(new_father);
-				else
-					return;
-			} else {
-				//si il a des enfants on le le supprime pas et on s'arrête.
-				return;
-			}
-		}
-
-		function select_label(id_label) {
-			var all_fathers = get_all_fathers_of_child(hierarchy.all_labels, id_label);
-			var all_childs = get_all_childs_of_father(hierarchy.all_labels, id_label);
-			var posi = -1;
-			hierarchy.labels_add.push(id_label);
-			for (var i = 0; all_fathers[i]; i++) {
-				posi = is_in_tab(all_fathers[i], hierarchy.labels_add, 0, 1);
-				if (posi == -1) {
-					hierarchy.labels_add.push(all_fathers[i]);
-					hierarchy.is_active[is_in_tab(all_fathers[i], hierarchy.table, 'id', 2)] = 1;
-				}
-			}
-			for (var i = 0; all_childs[i]; i++) {
-				posi = is_in_tab(all_childs[i], hierarchy.labels_add, 0, 1);
-				if (posi == -1) {
-					hierarchy.labels_add.push(all_childs[i]);
-					hierarchy.is_active[is_in_tab(all_childs[i], hierarchy.table, 'id', 2)] = 1;
-				}
-			}
-		}
-
-		function unselect_label(id_label) {
-			var all_childs = get_all_childs_of_father(hierarchy.all_labels, id_label);
-			hierarchy.labels_add.splice(hierarchy.labels_add.indexOf(id_label), 1);
-			for (var i = 0; all_childs[i]; i++) {
-				posi = is_in_tab(all_childs[i], hierarchy.labels_add, 0, 1);
-				if (posi != -1) {
-					hierarchy.labels_add.splice(posi, 1);
-					hierarchy.is_active[is_in_tab(all_childs[i], hierarchy.table, 0, 2)] = 0;
-				}
-			}
-			//remove_father_label(get_father_id(id_label));
-		}
-
-		var hierarchy = new Vue({
-			el: '#hierarchy',
-			data: {
-				all_labels: JSON.parse(request_ajax("labels")),
-				table: order_intent_labels_tab(),
-				is_active: [],
-				labels_add: []
-			},
-			methods: {
-				activate_lo: function (index) {
-					var id_lab = this.table[index]['id'];
-					this.is_active[index] += 1;
-					if (this.is_active[index] % 2 == 1)
-						select_label(this.table[index]['id']);
-					else
-						unselect_label(this.table[index]['id']);
-					document.form1.labels.value = this.labels_add;
-				}
-			}
-		});
-
-		hierarchy.is_active = create_empty_tab(hierarchy.all_labels.length);
-
-	</script>
-
-</html>
diff --git a/app/templates/browse.html b/app/templates/browse.html
deleted file mode 100644
index f441ce52b2d61c6171e06f58aa57c39ae8d9e760..0000000000000000000000000000000000000000
--- a/app/templates/browse.html
+++ /dev/null
@@ -1,471 +0,0 @@
-<html>
-	<head>
-		<meta charset="utf-8">
-		<meta http-equiv="X-UA-Compatible" content="IE=edge">
-		<meta name="viewport" content="width=device-width, initial-scale=1">
-		<title>Browse</title>
-
-		<link rel="stylesheet" href="static/css/annimation.css">
-		<link rel="stylesheet" href="static/css/main.css">
-		<link rel="stylesheet" href="static/css/hierarchy.css">
-		<link rel="stylesheet" href="static/css/result.css">
-		<!-- Bootstrap -->
-		<link rel="stylesheet" href="static/css/bootstrap.css">
-		<!-- VueJs -->
-		<script src="static/js/vue.js"></script>
-		<style type="text/css">[v-cloak] {display: none;}</style>
-	</head>
-
-	<body>
-
-		<div class='container'>
-		
-			<br>
-			<div class="row">
-				<div class="col-md-12" id="project_title">
-					<h1><b>[[ txt['project_name'] ]]</b></h1>
-				</div>
-			</div>
-			<br>
-			
-			<div class="row">
-				<!-- <div class="col-md-1"></div> -->
-				<div class="col-md-3">
-					<div id='hierarchy' class="panel panel-primary" v-cloak>
-						<div class="panel-heading title">
-							<span v-if="this.labels_language == 'US'" id="hierarchy-title_ang"><span class="glyphicon glyphicon-tags"></span>[[ txt['labels_title_ang'] ]]</span>
-							<span v-else id="hierarchy-title_fr"><span class="glyphicon glyphicon-tags"></span>[[ txt['labels_title_fr'] ]]</span>
-							<span style="margin-right: -10%;">
-								<span v-if='this.labels_language == "FR"'>
-									<img class="hierarchy-lang_icon_left" src="static/img/boue_france.png">
-									<img title="Passe le nom des étiquettes en Anglais" @click="change_labels_language('US')" class="hierarchy-lang_icon_right" src="static/img/boue_usa_black.png" onmouseover="this.src='static/img/boue_usa.png'" onmouseout="this.src='static/img/boue_usa_black.png'">
-								</span>
-								<span v-else>
-									<img title="Pass the name of the labels in French" @click="change_labels_language('FR')" class="hierarchy-lang_icon_left" src="static/img/boue_france_black.png" onmouseover="this.src='static/img/boue_france.png'" onmouseout="this.src='static/img/boue_france_black.png'">
-									<img class="hierarchy-lang_icon_right" src="static/img/boue_usa.png">
-								</span>
-							</span>
-						</div>
-
-						<div class="pannel-body hierarchy">
-							<!-- HIERARCHY.OLD_LABELS_TAB -->
-							<span v-for='(label, index) in old_labels_tab' :key="index">
-								<img v-if="labels_language == 'FR'" title="Désélectionne les éléments portant cette étiquette" class="hierarchy-icone_left" @click="rm_label_of_old_tab(index)" src="static/img/synchronized.black.png" onmouseover="this.src='static/img/synchronized.grey.png'" onmouseout="this.src='static/img/synchronized.black.png'">
-								<img v-else-if="labels_language == 'US'" title="Deselect the elements bearing this label" class="hierarchy-icone_left" @click="rm_label_of_old_tab(index)" src="static/img/synchronized.black.png" onmouseover="this.src='static/img/synchronized.grey.png'" onmouseout="this.src='static/img/synchronized.black.png'">
-								<span v-if="(label.name.length <= 12)"><b>{{ label.name }}</b></span>
-								<span v-else v-bind:title="label.name"><b>{{ label.name.slice(0, 10)+"..." }}</b></span>
-								<img class="hierarchy-icone_right" src="static/img/swimming.small.png" style="visibility: hidden;"><br>
-							</span>
-							<!-- HIERARCHY.OLD_LABELS_TAB -->
-
-							<!-- HIERARCHY.UNSELECT_TAB -->
-							<span v-for='(label, index) in unselect_tab' :key="index">
-								<img class="hierarchy-icone_left" src="static/img/synchronized.grey.png" style="visibility: hidden;">
-								<span v-if="(label.name.length <= 11)"><b>{{ label.name }}</b></span>
-								<span v-else v-bind:title="label.name"><b>{{ label.name.slice(0, 9)+"..." }}</b></span>
-								<img v-if="labels_language == 'FR'" title="Autorise les éléments portant cette étiquette" class="hierarchy-icone_right" @click="rm_label_to_unselect_tab(index)" src="static/img/die.black.png" onmouseover="this.src='static/img/die.grey.png'" onmouseout="this.src='static/img/die.black.png'">
-								<img v-if="labels_language == 'US'" title="Authorizes elements bearing this label" class="hierarchy-icone_right" @click="rm_label_to_unselect_tab(index)" src="static/img/die.black.png" onmouseover="this.src='static/img/die.grey.png'" onmouseout="this.src='static/img/die.black.png'">
-								<br>
-							</span>
-							<!-- HIERARCHY.UNSELECT_TAB -->
-							
-							<!-- HIERARCHY.NEW_LABELS_TAB -->
-							<div v-if="this.loading == 1">
-								<hr v-if="(this.old_labels_tab.length > 0 || this.unselect_tab.length > 0) && this.new_labels_tab.length > 0"/>
-								<transition-group name="new_labels">
-									<span v-for='(label, index) in new_labels_tab' :key="index">
-										<img v-if="labels_language == 'FR'" title="Sélectionne les éléments possèdant cette étiquette"  class="hierarchy-icone_left" @click="add_label_to_old_tab(index, 1)" src="static/img/synchronized.grey.png" onmouseover="this.src='static/img/synchronized.green.png'" onmouseout="this.src='static/img/synchronized.grey.png'">
-										<img v-else-if="labels_language == 'US'" title="Selects elements with this label" class="hierarchy-icone_left" @click="add_label_to_old_tab(index, 1)" src="static/img/synchronized.grey.png" onmouseover="this.src='static/img/synchronized.green.png'" onmouseout="this.src='static/img/synchronized.grey.png'">
-										<span v-if="(label.name.length <= 11)"><b>{{ label.name }}</b></span>
-										<span v-else v-bind:title="label.name"><b>{{ label.name.slice(0, 8)+"..." }}</b></span>
-										<img v-if="labels_language == 'FR'" title="Interdit les éléments possèdant cette étiquette" class="hierarchy-icone_right" @click="add_label_to_unselect_tab(index)" src="static/img/die.grey.png" onmouseover="this.src='static/img/die.red.png'" onmouseout="this.src='static/img/die.grey.png'">
-										<img v-if="labels_language == 'US'" title="Prohibits elements with this label" class="hierarchy-icone_right" @click="add_label_to_unselect_tab(index)" src="static/img/unchecked_swimming.small.png" src="static/img/die.grey.png" onmouseover="this.src='static/img/die.red.png'" onmouseout="this.src='static/img/die.grey.png'">
-										<br>
-									</span>
-								</transition-group>
-							</div>
-							<!-- HIERARCHY.NEW_LABELS_TAB -->
-						</div>
-					</div>
-					
-				</div>
-
-				<div class="col-md-9" id="result" v-cloak>
-					<div class="panel panel-primary">
-						<div class="panel-heading title">
-							<span id="result-title">
-								<span class="glyphicon glyphicon-book"></span>
-								<span v-if="this.labels_language == 'FR'">[[ txt['result_title_fr'] ]]</span>
-								<span v-else="this.labels_language == 'US'">[[ txt['result_title_ang'] ]]</span>
-							</span>
-
-							<!-- RESULT LANG ICONS -->
-							<span id="result-lang">
-								<span v-if="this.results_language[0] % 2 == 0 && this.results_language[1] % 2 == 0">
-									<img title="Enlève les tutoriels en langue française" class="result-lang_icon_left" @click="change_results_language([1, 0])" src="static/img/boue_france.png" onmouseover="this.src='static/img/boue_france_black.png'" onmouseout="this.src='static/img/boue_france.png'">
-									<img title="Enlève les tutoriels en langue anglaise" class="result-lang_icon_right" @click="change_results_language([0, 1])" src="static/img/boue_usa.png" onmouseover="this.src='static/img/boue_usa_black.png'" onmouseout="this.src='static/img/boue_usa.png'">
-								</span>
-								<span v-if="this.results_language[0] % 2 != 0 && this.results_language[1] % 2 == 0">
-									<img title="Remet les tutoriels en langue française" class="result-lang_icon_left" @click="change_results_language([1, 0])" src="static/img/boue_france_black.png" onmouseover="this.src='static/img/boue_france.png'" onmouseout="this.src='static/img/boue_france_black.png'">
-									<img class="result-lang_icon_right" src="static/img/boue_usa.png">
-								</span>
-								<span v-if="this.results_language[0] % 2 == 0 && this.results_language[1] % 2 != 0">
-									<img class="result-lang_icon_left" src="static/img/boue_france.png">
-									<img title="Remet les tutoriels en langue anglaise" class="result-lang_icon_right" @click="change_results_language([0, 1])" src="static/img/boue_usa_black.png" onmouseover="this.src='static/img/boue_usa.png'" onmouseout="this.src='static/img/boue_usa_black.png'">
-								</span>
-							</span>
-							<!-- RESULT LANG ICONS -->
-						</div>
-
-						<!-- PRINT ELEMENTS -->
-						<ul v-if="this.loading == 1" class="list-group">
-							<li class="list-group-item" v-for='element in result_tab' v-bind:key="element.id">
-									<b class="single_result"><a v-bind:href="element.link">{{ element.title }}</a></b>
-								</span>
-								
-							</li>
-						</ul>
-						<!-- PRINT ELEMENTS -->
-					</div>
-				</div>
-
-			</div>
-			
-		</div>
-
-	</body>
-
-	<script src="static/js/ajax.js"></script>
-	<script src="static/js/array_opperations.js"></script>
-	<script src="static/js/father_child.js"></script>
-	<script src="static/js/labels.js"></script>
-	<script src="static/js/maj_tutorial.js"></script>
-	<script src="static/js/cookies.js"></script>
-
-	<script>
-		function init_research() {
-			/**
-			 * Initialise the two different par of hierarcy and
-			 * the array that contain all tutos.
-			 */
-			setup = setup_session();
-			if (setup == 0) {
-				hierarchy.init_all_labels();
-				hierarchy.init_new_labels_tab();
-				result.init_result_tab();
-			}
-		}
-
-		function update_loading(value) {
-			/**
-			 * The 'loading' value is common to both hierarchy and 
-			 * result views. When it is equal to 0, the content of 
-			 * hierarchy.new_labels_tab (new labels) and result.result_tab
-			 * (tutoriels) must not be display. After modifications, loading
-			 * changes to one and they are displayed.
-			 */
-			hierarchy.loading = value;
-			result.loading = value;
-		}
-
-		function create_tab_of_id(all_tuto_labels, id_element) {
-			/**
-			 * Create a tab of all id_label associate to this element.
-			 */
-			 var result = [];
-			for (var i = 0; i < all_tuto_labels.length; i++) {
-				if (all_tuto_labels[i]['id_element'] == id_element)
-					result.push(all_tuto_labels[i]['id_label']);
-			}
-			return (result)
-		}
-
-		var hierarchy = new Vue ({
-			el: '#hierarchy',
-			data: {
-				/**
-				 * - 'all_labels' contain all labels in DB [id, name, father_id].
-				 * - 'old_labels_tab' contain all labels previously selected. They
-				 * are used for select the tutos and they are signaled by a check.
-				 * - 'new_labels_tab' contain the labels generated thanks to tutorials.
-				 * For 'loading' see update_loading function above.
-				 *  If one of them is selected. It pass in old_tab.
-				 */
-				all_labels : [],
-				old_labels_tab: [],
-				new_labels_tab: [],
-				unselect_tab: [],
-				loading: 1,
-				labels_language: "FR",
-				labels_language_id: JSON.parse(request_ajax("labels_lang_id"))
-			},
-			methods: {
-				init_all_labels: function() {
-				/**
-				 * Get all 'labels' table [id, name, father_id]
-				 */
-					this.all_labels = JSON.parse(request_ajax("all_labels/"+this.labels_language));
-				},
-				init_new_labels_tab: function() {
-				/**
-				 * Initialise 'new_labels_tab' with the main labels (labels
-				 * that don't have a father.
-				 */
-					this.new_labels_tab = JSON.parse(request_ajax("main_labels/"+this.labels_language));
-					this.new_labels_tab = remove_labels_language(this.new_labels_tab, this.labels_language_id, 1);
-				},
-				reset : function() {
-					/**
-					 * Clear all array of hierarchy.
-					 */
-					this.old_labels_tab = [];
-					this.new_labels_tab = [];
-					this.unselect_tab = [];
-					result.result_tab = [];
-					update_loading(0);
-					hierarchy.init_all_labels();
-					result.init_result_tab();
-					del_unselect_language();
-					hierarchy.maj_new_labels_tab();
-					save_session();
-					update_loading(1);
-				},
-				change_labels_language: function(lang) {
-					/**
-					 * Change the language of all labels.
-					 * hierarchy.all_labels is updated with the labels of the corresponding language.
-					 * research() search the equivalent of each label of 'old_tab' in updapted labels.
-					 * If they are equal, label is replace by the other label in new language.
-					 */
-					update_loading(0);
-					this.labels_language = lang;
-					result.labels_language = lang;
-					this.init_all_labels();
-					var research = function(old_tab, all_labels) {
-						tab_inter = old_tab;
-						old_tab = [];
-						var posi = -1;
-						for (var i = 0; tab_inter[i]; i++) {
-							posi = is_in_tab(tab_inter[i]['id_label'], all_labels, 'id_label', 2);
-							if (posi >= 0)
-								old_tab.push(all_labels[posi]);
-							posi = -1;
-						}
-						return (old_tab);
-					}
-					this.new_labels_tab = research(this.new_labels_tab, this.all_labels);
-					this.old_labels_tab = research(this.old_labels_tab, this.all_labels);
-					this.unselect_tab = research(this.unselect_tab, this.all_labels);
-					save_session();
-					update_loading(1);
-				},
-				add_label_to_old_tab: function(index, source) {
-					/**
-					 * Move selected label from [new tab => old tab] or
-					 * from [unselect_tab => old tab].
-					 */
-					if (source == 1) {
-						this.old_labels_tab.push(this.new_labels_tab[index]);
-						update_loading(0);
-						this.new_labels_tab.splice(index, 1);
-						result.maj_results(2);
-					} else if (source == 2) {
-						this.old_labels_tab.push(this.unselect_tab[index]);
-						update_loading(0);
-						this.unselect_tab.splice(index, 1);
-						result.maj_results(3);
-					}
-					save_session();
-					update_loading(1);
-				},
-				rm_label_of_old_tab: function(index) {
-					/**
-					 * If a label in 'old_labels_tab' is selected, it is deleted
-					 * of this tab. If this tab is empty, the new_labels_tab
-					 * is filled with the main labels (labels without father).
-					 */
-				 	update_loading(0);
-					this.old_labels_tab.splice(this.old_labels_tab.indexOf(this.old_labels_tab[index]), 1);
-					if (this.old_labels_tab.length == 0 && this.unselect_tab.length > 0) {
-						result.result_tab = JSON.parse(request_ajax("all_tutos"));
-						result.del_unselected_results();
-						hierarchy.maj_new_labels_tab();
-					} else if (this.old_labels_tab.length == 0) {
-						this.reset();
-					} else
-						result.maj_results(3);
-					save_session();
-					update_loading(1);
-				},
-				add_label_to_unselect_tab: function(index) {
-					/**
-					 * After click on cross of new_labels_tab. 
-					 * This label is add to unselect_tab and it is remove from previous tab ().
-					 * Next the list of tutos is updated.
-					 */
-					update_loading(0);
-					hierarchy.unselect_tab.push(this.new_labels_tab[index]);
-					hierarchy.new_labels_tab.splice(index, 1);
-					if (this.old_labels_tab.length == 0)
-						result.maj_results(4);
-					else
-						result.maj_results(3);
-					save_session();
-					update_loading(1);
-				},
-				rm_label_to_unselect_tab: function(index) {
-					/**
-					 * After click on cross of labels from unselect_tab, this label
-					 * is remove of this tab and the list of tutos is updated.
-					 */
-					update_loading(0);
-					this.unselect_tab.splice(index, 1);
-					if (this.unselect_tab.length == 0 && this.old_labels_tab.length == 0)
-						this.reset();
-					else if (this.old_labels_tab.length == 0 && this.unselect_tab.length > 0) {
-						result.result_tab = JSON.parse(request_ajax("all_tutos"));
-						result.del_unselected_results();
-						hierarchy.maj_new_labels_tab();
-					} else
-						result.maj_results(3);
-					save_session();
-					update_loading(1);
-				},
-				maj_new_labels_tab: function() {
-					/**
-					 * Update the tab hierarchy.new_labels_tab whith labels
-					 * of the new tutos. 
-					 * - If there is 1 father and his childs, only the 
-					 * highest father is selected.
-					 * - If all tutos have the same label, it is deleted.
-					 * -The labels are sorted alphabetically.
-					 */
-					var all_labels = '';
-					this.new_labels_tab = [];
-					var len_tab = result.result_tab.length;
-					update_loading(0);
-					if (result.result_tab.length != 1) {
-						var inter_labels = '';
-						var all_id_elements = "";
-						for (var i = 0; i < len_tab; i++) {
-							all_id_elements += result.result_tab[i]['id'];
-							(i != len_tab - 1) ? all_id_elements+= ',' : all_id_elements += '';
-						}
-						all_labels = JSON.parse(request_ajax('labels_of_a_link_in/'+all_id_elements));
-						all_labels = remove_labels_language(all_labels, this.labels_language_id, 0);
-						var diff_labels = get_diff_between_labels(all_labels);
-						diff_labels = remove_childs_of_tab(diff_labels, this.all_labels);
-						this.new_labels_tab = create_tab_of_labels(diff_labels, this.all_labels);
-						this.new_labels_tab = sort_tab_of_labels(this.new_labels_tab);
-						save_session();
-					}
-					update_loading(1);
-				}
-			}
-		});
-
-		var result = new Vue ({
-			el: '#result',
-			data: {
-				/**
-				 * - 'result_tab' contain all tutos to display on this
-				 * form : [title, link, date].
-				 * - 'childs_of_old_labels' contain the id of chilf labels
-				 * of labels contain in 'hierarchy.old_labels_tab'.
-				 * - 'link_of_results' is a string contauning the tutorial links
-				 * contained in 'result_tab'. (Used for SQL requests)
-				 * For 'loading' see update_loading function above.
-				 */
-				result_tab: [],
-				childs_of_old_labels: [],
-				links_of_results: '',
-				loading: 1,
-				labels_language: hierarchy.labels_language,
-				results_language: [0, 0],
-				local_change: 0,
-				results_fr: JSON.parse(request_ajax("tutos_language/Français")),
-				results_us: JSON.parse(request_ajax("tutos_language/Anglais")),
-				all_results_labels: JSON.parse(request_ajax("all_tutos_labels"))
-			},
-			methods: {
-				init_result_tab: function() {
-					/**
-					 * Retrive all tutorials from the database
-					 * which will all be displayed the first time.
-					 */
-					this.result_tab = JSON.parse(request_ajax("all_tutos"));
-				},
-				change_results_language: function(lang) {
-					/**
-					 * lang[0] value for 'Français'. lang[1] value for 'Anglais'
-					 * If on of this value is pair => this language is selected.
-					 * At eatch click we increase this value for unselect and select.
-					 */
-					if (lang[0] == 1)
-						Vue.set(this.results_language, 0, this.results_language[0] + 1);
-					if (lang[1] == 1)
-						Vue.set(this.results_language, 1, this.results_language[1] + 1);
-					update_loading(0);
-					if (hierarchy.old_labels_tab.length == 0 && hierarchy.unselect_tab.length == 0)
-						hierarchy.reset();
-					else if (hierarchy.old_labels_tab.length > 0)
-						result.maj_results(3);
-					else if (hierarchy.unselect_tab.length > 0)
-						result.maj_results(4);
-					del_unselect_language();
-					hierarchy.maj_new_labels_tab();
-					update_loading(1);
-				},
-				del_unselected_results: function() {
-					/**
-			 		 * Delete all tutos from result.result_tab that have the
-			 		 * same labels contain in hierarchy.unselect_tab.
-			 		 */
-					var childs = [];
-					var tab_tutos_final = [];
-					var nb_diff_labels = 0;
-					for (var i = 0; result.result_tab[i]; i++) {
-						labels_tab = create_tab_of_id(this.all_results_labels, result.result_tab[i]['id']);
-						for (var j = 0; labels_tab[j]; j++) {
-							if (is_in_tab(labels_tab[j], hierarchy.unselect_tab, 'id_label', 2) == -1)
-								nb_diff_labels++;
-							else
-								break;
-						}
-						if (nb_diff_labels == labels_tab.length)
-							tab_tutos_final.push(result.result_tab[i]);
-						nb_diff_labels = 0;
-					}
-					result.result_tab = tab_tutos_final;
-				},
-				maj_results: function(type) {
-					/**
-					 * Update tutorials.
-					 */
-					this.childs_of_old_labels = get_all_childs_from_old(hierarchy.all_labels, hierarchy.old_labels_tab);
-					if (type == 4) {
-						console.log("AFTER to unselect");
-						maj_tutos_after_unselect();
-					} else if (type == 1) {// || hierarchy.old_labels_tab.length == 1) {
-						// [NOT USED]
-						console.log("SEARCH FROM DB");
-						maj_results_from_db();
-					} else if (type == 3) {
-						console.log('MAJ AFTER RM')
-						maj_results_after_remove();
-					} else if (type == 2 || hierarchy.old_labels_tab.length >= 1) {
-						console.log("PLUSIEURS label dans OLD")
-						maj_results_for_many_labels();
-					} else {
-						console.log("NOTHING");
-						this.result_tab = [];
-					}
-				}
-			}
-		});
-
-		init_research();
-
-	</script>
-
-</html>
diff --git a/app/templates/manage_labels.html b/app/templates/manage_labels.html
deleted file mode 100644
index a196b7522740d701738a58b94c863d4d58c7e690..0000000000000000000000000000000000000000
--- a/app/templates/manage_labels.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<html>
-	<head>
-		<meta charset="utf-8">
-		<meta http-equiv="X-UA-Compatible" content="IE=edge">
-		<meta name="viewport" content="width=device-width, initial-scale=1">
-
-		<title>Manage Labels</title>
-		<!-- Bootstrap -->
-		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
-		<!-- VueJS -->
-		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
-		<script src="static/js/ajax.js"></script>
-	</head>
-
-	<body>
-		<div class="container">
-
-			<div class="row">
-				<div class="offset-md-1 col-md-3">
-					<div id='hierarchy'>
-						<span v-for='(value, index) in table'>
-							<span @click="activate_lo(index)">{{ value[1] }}</span>
-							<img v-if='is_active[index] % 2 == 1' src="static/checked.png">
-							<br>
-						</span>
-					<!-- {{ labels_add }} -->
-						<span v-bind:src="labels_add"></span>
-						<br>
-					</div>
-				</div>
-			</div>
-
-			
-			<div class="row">
-				<div class="offset-md-1 col-md-5">
-					<p>[[ success ]]</p>
-					<div id='input_zone'>
-						<form action="" method="POST">
-							<textarea class="text" type="text" name="alias_input" cols="60" rows="40">[[ labels ]]</textarea>
-							<br>
-							<input type="submit" value="Envoyer"/>
-						</form>
-					</div>
-				</div>
-			</div>
-
-		</div>
-	</body>
-
-	<script>
-		var hierarchy = new Vue({
-			el: '#hierarchy',
-			data: {
-				all_labels: this.all_labels = JSON.parse(request_ajax("labels")),
-				table: order_intent_labels_tab(),
-				is_active: create_empty_tab(20),
-				labels_add: []
-			},
-			methods: {
-			}
-		});
-	</script>
-
-</html>
diff --git a/app/update_labels.py b/app/update_labels.py
deleted file mode 100644
index 0648ba94095a3955727dfae42d5052ee640c1f0a..0000000000000000000000000000000000000000
--- a/app/update_labels.py
+++ /dev/null
@@ -1,154 +0,0 @@
-'''Take user input and send labels and alias in database if they don't exist.
-'''
-
-import sqlite3
-from sql_request import *
-conn = sqlite3.connect('app/bdd_for_labels.db', check_same_thread=False)
-c = conn.cursor()
-
-def get_file_content(filename):
-    '''For tests. Read file that contain user input.
-    '''
-    my_file = open(filename, "r")
-    content = my_file.read()
-    content = content.split('\n')
-    my_file.close()
-    return (content)
-
-def put_labels_in_db(content, labels_table):
-    '''Send all labels contained in content if it doesn't exist
-    in labels table (in DB). If label line contain alias, just the
-    first alias is send. executemany() requiere 2D array. It's why
-    label is put in intermediate array 'inter'.
-    '''
-    labels_name = []
-    for line in content:
-        inter = []
-        line = line.replace("\t", '')
-        line = line.split(',')
-        inter.append(line[0])
-        if (is_in_labels_table(line[0], labels_table) != 1):
-            labels_name.append(inter)
-    c.executemany("INSERT INTO labels(name) VALUES(?)", labels_name)
-    conn.commit()
-
-def get_labels_table():
-    '''Retrieve all the content in 'labels' from DB.
-    '''
-    c.execute('SELECT * FROM labels')
-    all_table = c.fetchall()
-    return (all_table)
-
-def get_tab_alias_name():
-    '''Select all alias in DB
-    '''
-    c.execute('SELECT name FROM alias')
-    all_table = c.fetchall()
-    return (all_table)
-
-def is_in_labels_table(name, labels_table):
-    '''Return 1 if name is in 'labels' table or 0 if not.
-    '''
-    name = name.lower()
-    for label in labels_table:
-        inter = label[1]
-        inter = inter.lower()
-        if (inter == name):
-            return (1)
-    return (0)
-
-def is_an_alias(name, tab_alias_name):
-    '''Return 1 if name is in 'alias' table or 0 if not.
-    '''
-    name = name.lower()
-    for alias in tab_alias_name:
-        inter = alias[0]
-        inter = inter.lower()
-        if (inter == name):
-            return (1)
-    return (0)
-
-def is_alias_or_label(name, labels_table, tab_alias_name):
-    '''Return 1 if name is a label or and alias.
-    '''
-    if (is_in_labels_table(name, labels_table) == 1):
-        return (1)
-    if (is_an_alias(name, tab_alias_name) == 1):
-        return (1)
-    return (0)
-
-
-def get_last_element(tab):
-    '''Retrive the last element from the pile 'tab' because pop()
-    delete the last element when is it return.
-    '''
-    for case in tab:
-        result = case
-    return (case)
-
-def get_father_id(father_name, labels_table):
-    '''Return the ID of an label stock in 'labels' table.
-    This ID will be send in 'father' column of the child.
-    '''
-    for label in labels_table:
-        if (label[1] == father_name):
-            return (label[0])
-    return (-1)
-
-def update_alias(content, labels_table, tab_alias_name):
-    '''Check the user input and add alias in alias tab if it's not
-    a label or an alias.
-    '''
-    label_alias = []
-    for line in content:
-        line = line.replace("\t", '')
-        line = line.replace(", ", ',')
-        line = line.split(',')
-        label = line[0]
-        line.remove(line[0])
-        for alias in line:
-            inter = []
-            if (is_alias_or_label(alias, labels_table, tab_alias_name) != 1):
-                inter.append(get_father_id(label, labels_table))
-                inter.append(alias)
-                label_alias.append(inter)
-    c.executemany("INSERT INTO alias(id_label, name) VALUES(?, ?)", label_alias)
-    conn.commit()
-
-def update_father_id_in_db(content, labels_table):
-    '''Get the user input and with the number of '\t' behind label
-    dermine if the label is a father or a child.
-    If it's a child, the id of his father is send in his
-    'father_id' column.
-    '''
-    father_pile = ['no_father']
-    father_name = ''
-    prece = ''
-    for line in content:
-        line_alias = line.split(',')
-        label = line_alias[0]
-        if (line.count('\t') > prece.count('\t')):
-            father_pile.append(prece.replace("\t", ''))
-        if (line.count('\t') < prece.count('\t')):
-            nb_tour = prece.count('\t') - line.count('\t')
-            for i in range(0, nb_tour):
-                father_pile.pop()
-        father_name = get_last_element(father_pile)
-        father_id = get_father_id(father_name, labels_table)
-        if (father_id != -1):
-            c.execute('UPDATE labels SET father_id = ? WHERE name = ?', (father_id, label.replace("\t", '')))
-            conn.commit()
-        prece = label
-
-def update_labels(content):
-    '''Get the user input and add new lables in 'labels' table of DB.
-    '''
-    #content = get_file_content("labels")
-    content = content.split('\r\n')
-    labels_table = get_labels_table()
-    tab_alias_name = get_tab_alias_name()
-    put_labels_in_db(content, labels_table)
-    labels_table = get_labels_table()
-    print (labels_table)
-    update_father_id_in_db(content, labels_table)
-    update_alias(content, labels_table, tab_alias_name)
diff --git a/dist/.gitignore b/dist/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a4a0268d8e8bd7de423f28731052700e30614435
--- /dev/null
+++ b/dist/.gitignore
@@ -0,0 +1,2 @@
+# ignore wheel file until distribution is ready for production (if ready => git add --force .*whl)
+*.whl
\ No newline at end of file
diff --git a/dist/LICENSE b/dist/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..0097ebbe0d39d89f4dc92d1539878f5a6f8ad090
--- /dev/null
+++ b/dist/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 CNRS
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/dist/MANIFEST.in b/dist/MANIFEST.in
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/dist/MANIFEST.in
@@ -0,0 +1 @@
+
diff --git a/dist/build.sh b/dist/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f3e40646986a154ffa1112c4dc42cdbbef42890f
--- /dev/null
+++ b/dist/build.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# This ensures that we are in this script directory,
+# even if we call it from another one.
+SCRIPT_NAME=${BASH_SOURCE[0]}
+cd `dirname ${SCRIPT_NAME}`
+
+cp -f setup.py LICENSE  ..
+rm -rf ../labelstower.egg-info
+mv -f labelstower.egg-info ..
+cd ..
+python3 setup.py bdist_wheel
+rm -f setup.py LICENSE
+mv -f labelstower.egg-info dist/
\ No newline at end of file
diff --git a/dist/setup.py b/dist/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..f63bac8174a1922c29970dd99b3f19344cae3b28
--- /dev/null
+++ b/dist/setup.py
@@ -0,0 +1,29 @@
+import setuptools
+
+with open("README.md", "r") as readme_file:
+    long_description = readme_file.read()
+
+with open("dist/version.txt", "r") as version_file:
+    version_content = version_file.read()
+
+setuptools.setup(
+    name="labelstower",
+    version=version_content,
+    author="IJCLab",
+    author_email="ing-info-developpement@ijclab.in2p3.fr",
+    description="Label sorting system",
+    long_description=long_description,
+    long_description_content_type="text/markdown",
+    url="https://gitlab.in2p3.fr/MaitresNageurs/README/LabelsTower",
+    packages=setuptools.find_packages(),
+    include_package_data=True,
+    classifiers=[
+        "Programming Language :: Python :: 3",
+        "License :: OSI Approved :: MIT License",
+        "Operating System :: OS Independent",
+    ],
+    python_requires='>=3.6',
+    install_requires=[
+    ],
+)
+
diff --git a/dist/version.txt b/dist/version.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8a9ecc2ea99d607e92feae1656ddbf6fdd82a2c1
--- /dev/null
+++ b/dist/version.txt
@@ -0,0 +1 @@
+0.0.1
\ No newline at end of file
diff --git a/docker/.gitignore b/docker/.gitignore
deleted file mode 100644
index b80f0bd60822d4fa4893de455958ef32f6c521bf..0000000000000000000000000000000000000000
--- a/docker/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-app
diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev
index d68070ca2093cac758fab0ef63387509d466aeab..4c6f478f3658f78bc65b8d93d9b7c78d967a095f 100644
--- a/docker/Dockerfile.dev
+++ b/docker/Dockerfile.dev
@@ -5,15 +5,25 @@ FROM python:3.6.6-slim-stretch
 # Ensure use of bash
 SHELL ["/bin/bash","-c"]
 
+# Sqlite3
+RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
+ARG DEBIAN_FRONTEND=noninteractive
+RUN apt-get update \
+&& apt-get install -yq apt-utils \
+&& apt-get install -yq sqlite3 \
+&& apt-get install -yq curl \
+&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
 # Install flask
 COPY requirements.txt requirements.txt
 RUN pip install --trusted-host pypi.python.org -r requirements.txt
 
 # Run flask
 EXPOSE 5000
-ENV FLASK_APP=app/labelsTower.py
 ENV FLASK_ENV=development
-ENV FLASK_DEBUG=1
 ENV LC_ALL=C.UTF-8
 ENV LANG=C.UTF-8
-CMD [ "flask", "run", "--host", "0.0.0.0" ]
\ No newline at end of file
+
+ENV LABELSTOWER_ENV="app.config.ConfigCodingPool"
+
+CMD [ "flask", "run", "--reload", "--host", "0.0.0.0" ]
\ No newline at end of file
diff --git a/docker/Dockerfile.prod b/docker/Dockerfile.prod
deleted file mode 100644
index 10ce5aaf25f2b2966cf0b263d9028ba9cf90d71d..0000000000000000000000000000000000000000
--- a/docker/Dockerfile.prod
+++ /dev/null
@@ -1,20 +0,0 @@
-
-# Version DEV
-FROM gitlab-registry.in2p3.fr/maitresnageurs/readme/labelstower:dev0.4
-
-# Ensure use of bash
-SHELL ["/bin/bash","-c"]
-
-# Copy framework files
-COPY app app
-
-# Run flask
-EXPOSE 80
-ENV FLASK_APP=app/labelsTower.py
-ENV FLASK_ENV=production
-ENV LC_ALL=C.UTF-8
-ENV LANG=C.UTF-8
-CMD [ "flask", "run", "--host", "0.0.0.0", "--port", "80" ]
-
-
-
diff --git a/docker/Dockerfile_externals b/docker/Dockerfile_externals
new file mode 100644
index 0000000000000000000000000000000000000000..aa20cedff5a6b9b614808c9416cb8fff2f8442d8
--- /dev/null
+++ b/docker/Dockerfile_externals
@@ -0,0 +1,32 @@
+
+# Version DEV
+FROM python:3.6.6-slim-stretch
+
+# Ensure use of bash
+SHELL ["/bin/bash","-c"]
+
+# Sqlite3
+RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
+ARG DEBIAN_FRONTEND=noninteractive
+RUN apt-get update \
+&& apt-get install -yq apt-utils \
+&& apt-get install -yq sqlite3 \
+&& apt-get install -yq curl \
+&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+# Install flask
+RUN pip3 install --upgrade pip setuptools wheel
+COPY requirements.txt requirements.txt
+RUN pip3 install --trusted-host pypi.python.org -r requirements.txt
+
+# Run flask in development mode
+
+EXPOSE 5000
+
+ENV FLASK_APP=demo_flask
+ENV FLASK_ENV=development
+
+ENV LC_ALL=C.UTF-8
+ENV LANG=C.UTF-8
+
+ENV LABELSTOWER_ENV="app.config.ConfigCodingPool"
diff --git a/docker/Dockerfile_latest b/docker/Dockerfile_latest
new file mode 100644
index 0000000000000000000000000000000000000000..0d39417ce2d6035d5f0e9158a48d268e0213e884
--- /dev/null
+++ b/docker/Dockerfile_latest
@@ -0,0 +1,24 @@
+
+# Version DEMO
+FROM labelstower:dev
+
+# Ensure use of bash
+SHELL ["/bin/bash","-c"]
+
+# Install labelstower
+RUN pip3 install --upgrade pip setuptools wheel
+COPY labelstower-latest-py3-none-any.whl labelstower-latest-py3-none-any.whl
+RUN pip3 install labelstower-latest-py3-none-any.whl
+
+# Run flask
+EXPOSE 5000
+
+ENV FLASK_APP=demo_flask
+ENV FLASK_ENV=development
+
+ENV LC_ALL=C.UTF-8
+ENV LANG=C.UTF-8
+
+ENV LABELSTOWER_ENV="app.config.ConfigCodingPool"
+
+CMD [ "flask", "run", "--reload", "--host", "0.0.0.0" ]
\ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
index 1ce1263c946c78316d6009add0f94095f5e6c52d..55f221bf75b3bf8b70925987c98b82cf062f7b4d 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -1,22 +1,9 @@
+Testing the LabelsTower code thanks to Docker requires only Docker to be installed. Yet, if one wants also to take profit of the utility scripts provided in the current directory, the command `/usr/bin/env bash` (used as a shebang in the scripts) must return a valid bash shell.
 
-# Image for development
-
-Those commands are meant to be launched within the `docker` directory. Each time a significant change is made to the `Dockerfile.dev`, please increase the version number in `image_dev.txt`.
+The commands below are meant to be launched within the `docker` directory. Each time a significant change is made to the `Dockerfile`, please increase the version number in `image.txt`.
 
 * build_dev.sh : build a local image.
-* run_dev.sh : run the local image, mounting `..` as `/work`.
-* push_dev.sh : once image is stable, push it to `gitlab.in2p3.fr`.
-
-The "dev" flavor of all files is meant to produce an image which
-includes all the needed external packages, but not the LabelsTower application itself,
-which should be mounted when creatin the container, so that any file modification
-is directly reflected in the browser, on the default flask port 5000.
-
-
-# Image for deployment
-
-The "prod" flavor of all files is meant to produce an image which includes all the needed files,
-and served on the default port 80. 
-
+* run_dev.sh : run the demo web server, thanks to the local image, mounting `..` as `/work`.
 
+Worth to note : as one can see in the Dockerfile command, Flask is started with the option `--host 0.0.0.0`, which is necessary so that the http server, running  potentially on a small virtual machine (at least on MacOS and Windows), can be seen from the real local machine.
 
diff --git a/docker/build_externals.sh b/docker/build_externals.sh
new file mode 100755
index 0000000000000000000000000000000000000000..eb5cce1e012cff14f72a9d9bc787dffdb0191e29
--- /dev/null
+++ b/docker/build_externals.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# This ensures that we are in this script directory,
+# even if we call it from another one.
+SCRIPT_NAME=${BASH_SOURCE[0]}
+cd `dirname ${SCRIPT_NAME}`
+
+docker build -f Dockerfile_externals -t labelstower:dev .
+# --force-rm --no-cache
diff --git a/docker/build_latest.sh b/docker/build_latest.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2f2de2438d7d88980e5eb8069bde7afd8ba4e4d6
--- /dev/null
+++ b/docker/build_latest.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# This ensures that we are in this script directory,
+# even if we call it from another one.
+SCRIPT_NAME=${BASH_SOURCE[0]}
+cd `dirname ${SCRIPT_NAME}`
+
+# Get current labelstower package
+version=`cat ../dist/version.txt`
+cp ../dist/labelstower-${version}-py3-none-any.whl labelstower-latest-py3-none-any.whl
+
+docker build -f Dockerfile_latest -t labelstower:demo .
+# --force-rm --no-cache
+
+# cleaning
+rm -f labelstower-latest-py3-none-any.whl
\ No newline at end of file
diff --git a/docker/build_prod.sh b/docker/build_prod.sh
deleted file mode 100755
index c7c725cd843b96e2df052c520753b6a4f0538937..0000000000000000000000000000000000000000
--- a/docker/build_prod.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-rm -rf app
-cp -r ../app app
-docker build  -f Dockerfile.prod -t `cat image_prod.txt` .
-# --force-rm --no-cache
\ No newline at end of file
diff --git a/docker/image_dev.txt b/docker/image_dev.txt
index efe511a063264dc25752a1aee97c7711b11b0b88..bd907f54a3fbe2fb72db2bc6524973ed05e50f59 100644
--- a/docker/image_dev.txt
+++ b/docker/image_dev.txt
@@ -1 +1 @@
-gitlab-registry.in2p3.fr/maitresnageurs/readme/labelstower:dev0.4
\ No newline at end of file
+gitlab-registry.in2p3.fr/erichard/prototype_labelstower:dev0.1
diff --git a/docker/image_prod.txt b/docker/image_prod.txt
deleted file mode 100644
index 5c7319018fcdf6e7344caf851a428a15ae84d955..0000000000000000000000000000000000000000
--- a/docker/image_prod.txt
+++ /dev/null
@@ -1 +0,0 @@
-gitlab-registry.in2p3.fr/maitresnageurs/readme/labelstower:v0.4
\ No newline at end of file
diff --git a/docker/push_dev.sh b/docker/push_dev.sh
deleted file mode 100755
index cc7e2f5a29a7ae8de60ac5cf622d858719c935a2..0000000000000000000000000000000000000000
--- a/docker/push_dev.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-docker push `cat image_dev.txt`
diff --git a/docker/push_prod.sh b/docker/push_prod.sh
deleted file mode 100755
index 14bbdf47b97a493f052513233c72c9f8a8433364..0000000000000000000000000000000000000000
--- a/docker/push_prod.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-docker push `cat image_prod.txt`
diff --git a/docker/requirements.txt b/docker/requirements.txt
index d138c5bfeb896d4a18205129651199d61cf76226..362db1f261727b8059fa9ebd700c5c4647ca1566 100644
--- a/docker/requirements.txt
+++ b/docker/requirements.txt
@@ -1,5 +1,18 @@
-Flask==1.0.2
-sqlalchemy==1.2
-flask-login==0.4.1
+asn1crypto==1.0.1
+blinker==1.4
+cffi==1.12.3
+Click==7.0
+cryptography==2.7
+Flask==1.1.1
+Flask-Login==0.4.1
 Flask-Mail==0.9.1
-cryptography==2.4.2
+Flask-SQLAlchemy==2.4.1
+itsdangerous==1.1.0
+Jinja2==2.10.3
+MarkupSafe==1.1.1
+pycparser==2.19
+six==1.12.0
+SQLAlchemy==1.3.13
+Werkzeug==0.16.0
+WTForms==2.2.1
+Flask-Cors==3.0.8
diff --git a/docker/run_dev.sh b/docker/run_dev.sh
index a2f699834d2669d2574ea90158098218c9627ee8..f2e7b2053a19a5ddb786dab9e69a22054a3a4ce6 100755
--- a/docker/run_dev.sh
+++ b/docker/run_dev.sh
@@ -1,5 +1,3 @@
 #!/bin/bash
-# Flask opère sur le port 5000
-docker run -it --rm -p 5000:5000 -v $PWD/..:/work -w /work `cat image_dev.txt`
-
- 
\ No newline at end of file
+# Flask opère par defaut sur le port 5000
+docker run -it --rm -p 5000:5000 -v $PWD/..:/work -w /work `cat image_dev.txt` $*
diff --git a/docker/run_externals.sh b/docker/run_externals.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6eef2a15377a45b4035d65d9bbf275e5a27e9ce1
--- /dev/null
+++ b/docker/run_externals.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# This ensures that we are in this script directory,
+# even if we call it from another one.
+SCRIPT_NAME=${BASH_SOURCE[0]}
+cd `dirname ${SCRIPT_NAME}`
+
+# Flask opère sur le port 5000
+docker run -it --rm -p 5000:5000 -v $PWD/..:/work -w /work codeguards:dev $*
\ No newline at end of file
diff --git a/docker/run_latest.sh b/docker/run_latest.sh
new file mode 100755
index 0000000000000000000000000000000000000000..86dcfd9896b93e22357d96e174996a3fd5be5f77
--- /dev/null
+++ b/docker/run_latest.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# This ensures that we are in this script directory,
+# even if we call it from another one.
+SCRIPT_NAME=${BASH_SOURCE[0]}
+cd `dirname ${SCRIPT_NAME}`
+
+# Flask opère sur le port 5000
+docker run -it --rm -p 5000:5000 -v $PWD/..:/work -w /work/test labelstower:demo $*
\ No newline at end of file
diff --git a/docker/run_prod.sh b/docker/run_prod.sh
deleted file mode 100755
index f5d91c1ce7d352b7c1ae15fb205c980a389db484..0000000000000000000000000000000000000000
--- a/docker/run_prod.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-docker run -it --rm -p 80:80 `cat image_prod.txt`
-
- 
\ No newline at end of file
diff --git a/documentation/.~lock.Documentation.odt# b/documentation/.~lock.Documentation.odt#
new file mode 100644
index 0000000000000000000000000000000000000000..7035abb2a48379dcc82a2fd9c0ea3774bb345d7f
--- /dev/null
+++ b/documentation/.~lock.Documentation.odt#
@@ -0,0 +1 @@
+,erichard,nb-erichard,30.01.2020 13:50,file:///home/erichard/.config/libreoffice/4;
\ No newline at end of file
diff --git a/documentation/Documentation.odt b/documentation/Documentation.odt
new file mode 100644
index 0000000000000000000000000000000000000000..e9ea8893c7cdc0c0b33b760e22094fdc4b96f685
Binary files /dev/null and b/documentation/Documentation.odt differ
diff --git a/documentation/MCD.odg b/documentation/MCD.odg
new file mode 100644
index 0000000000000000000000000000000000000000..fd6d84a0893d8aabb76e084c050d86f65052b6c1
Binary files /dev/null and b/documentation/MCD.odg differ
diff --git a/documentation/MCD.pdf b/documentation/MCD.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..e9a7e3d4adbf1a125f4fbcfa955367f2cc93687e
Binary files /dev/null and b/documentation/MCD.pdf differ
diff --git a/documentation/SR.odg b/documentation/SR.odg
new file mode 100644
index 0000000000000000000000000000000000000000..ac2298ed62ca5090895ba4e45ef75d5fe89181cb
Binary files /dev/null and b/documentation/SR.odg differ
diff --git a/documentation/SR.pdf b/documentation/SR.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..feee2cae871ba3d07bcf48c070e5b8e3c46be794
Binary files /dev/null and b/documentation/SR.pdf differ
diff --git a/documentation/labelsTower_folders.odg b/documentation/labelsTower_folders.odg
new file mode 100644
index 0000000000000000000000000000000000000000..64281cd96c15caff555c628fdcc5dcca023bf748
Binary files /dev/null and b/documentation/labelsTower_folders.odg differ
diff --git a/documentation/labelsTower_folders.pdf b/documentation/labelsTower_folders.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..b4b6abec81e716a80533e45b7ae020344576e4b1
Binary files /dev/null and b/documentation/labelsTower_folders.pdf differ
diff --git a/test/README.md b/test/README.md
deleted file mode 100644
index 731137b20df0cb3b684cd93f7027a92dba63191d..0000000000000000000000000000000000000000
--- a/test/README.md
+++ /dev/null
@@ -1,114 +0,0 @@
-
-# Signets Exploitation & Developpement
-
-Dans ce test, on manipule des signets (bookmarks).
-La liste des étiquettes est la suivante :
-
-```
-Exploitation, Administration
-  MacOS, MacOSX, Apple, OSX
-  Linux
-    Debian
-    Ubuntu
-Programmation, Programming
-  C++, CPP
-  Python
-```
-
-La liste des signets et de leurs étiquettes :
-
-```
-Url-A : Programming, Debian => Programmation, Debian, Linux, Exploitation
-Url-B : Python              => Python, Programmation
-Url-E : Ubuntu              => Ubuntu, Linux, Exploitation
-Url-C : C++                 => C++, Programmation
-Url-D : Debian, Python      => Debian, Linux, Exploitation, Python, Programmation
-```
-
-## Affichage initial
-
-On part de la liste complète des URLs, données par ordre alphabétique
-dans le cadre de droite. Les étiquettes à afficher dans le cadre de gauche
-sont les étiquettes discriminantes (celles qui ne sont pas présentes pour tous
-les tutoriels) de plus haut niveau (par exemple on élimine "CPP" si "Programmation"
-est présent, en prenant l'alias principal (par exemple "C++" plutôt que "CPP")
-et en triant par ordre alphabétique.
-
-```
-  Exploitation       Url-A
-  Programmation      Url-B
-                     Url-C
-                     Url-D
-                     Url-E
-```
-
-## Sélection d'une étiquette
-
-Si on sélection "Exploitation", on la fera apparaitre en haut de la liste des
-étiquettes, avec une marque particulière pour montrer qu'elle est active. A
-droite, on ne garde que les URLs qui possèdent l'étiquette sélectionnée,
-puis on met à jour le cadre de gauche selon els mêmes règles que ci-dessus
-(étiquettes discriminates principales et de plus haut niveau).
-
-```
-* Exploitation      Url-A
-  Debian            Url-D
-  Programmation     Url-E
-  Ubuntu
-```
-
-## Sélection d'une deuxième étiquette
-
-Sélectionnons à présent "Debian". Attention : dans la liste en haut et à
-gauche des étiquettes actives, je garde l'ordre dans lequel j'ai sélectionné,
-qui est censé "faire sens". Je NE retrie PAS par ordre alphabétique, et je ne
-supprime pas "Exploitation sous prétexte qu'il est implicite avec "Debian".
-Par contre, à droite, puis à gauche pour les étiquettes discriminanates,
-procédure habituelle. "Programmation" n'est plus discriminant, et disparait
-au profit de "Python".
-
-```
-* Exploitation      Url-A
-* Debian            Url-D
-  Python
-```
-
-## Sélection d'une troisième étiquette
-
-Si enfin je sélectionne Python, il n'y a plus qu'une seule URL valide et
-plus d'étiquettes discriminantes :
-
-```
-* Exploitation      Url-D
-* Debian 
-* Python
-```
-
-## Désélection de la deuxième étiquette
-
-A ce stade, je veux par exemple pouvoir désélectionner l'étiquette "Debian".
-Il n'y a toujours qu'une seule URL valide. A gauche, à l'exception de
-l'étiquette que je viens d'enlever, je garde les autres étiquettes, dans
-le même ordre :
-
-```
-* Exploitation      Url-D
-* Python
-```
-
-## Désélection de la première étiquette
-
-Si à présent je désélectionne "Exploitation", je réouvre un ma liste
-d'URLs et d'étiquettes discriminantes :
-
-```
-* Python            Url-B
-  Exploitation      Url-D
-```
-
-## Boucle
-
-Si je désélectionne "Python", je reviens qu point de départ. Etc.
-
-
-
diff --git a/app/static/fonts/glyphicons-halflings-regular.eot b/test/__init__.py
similarity index 100%
rename from app/static/fonts/glyphicons-halflings-regular.eot
rename to test/__init__.py
diff --git a/test/bdd_for_labels.db b/test/bdd_for_labels.db
deleted file mode 100644
index d08e4d482e58a1d8695fa7aee630b774d24a11c1..0000000000000000000000000000000000000000
Binary files a/test/bdd_for_labels.db and /dev/null differ
diff --git a/test/create_random_db.py b/test/create_random_db.py
deleted file mode 100644
index a4808a8721d8896f441408809f854b6c6c15331c..0000000000000000000000000000000000000000
--- a/test/create_random_db.py
+++ /dev/null
@@ -1,100 +0,0 @@
-import sqlite3
-import string
-import sys
-import os
-from random import random, choice, randint
-
-def send_sql_request(request, fetchall = 1, many = 0, values = []):
-    '''Execute sql request on bdd_for_labels database.
-    If second parameter is 0 return one line of the response
-    else return all lines.
-    '''
-    global connection
-    cursor = connection.cursor()
-    if (many == 0):
-        cursor.execute(request)
-    else:
-        cursor.executemany(request, values)
-    connection.commit()
-    if (fetchall == 1):
-        res = cursor.fetchall()
-    else:
-        res = cursor.fetchone()
-    return (res)
-
-def create_database():
-    req = [
-        "CREATE TABLE IF NOT EXISTS tutos (title VARCHAR(300),link VARCHAR(500) NOT NULL,date DEFAULT CURRENT_TIMESTAMP,prescriber VARCHAR(100),CONSTRAINT pk_tutos PRIMARY KEY (link));"
-        ,"CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(100) NOT NULL,father_id UNISGNED MEDIUM INT DEFAULT NULL);"
-        ,"CREATE TABLE IF NOT EXISTS labels_languages (id_label INTEGER,country_code VARCHAR(3),name VARCHAR(100),CONSTRAINT pk_labels_languages PRIMARY KEY(id_label, country_code));"
-        ,"CREATE TABLE IF NOT EXISTS tutos_labels (link VARCHAR(200) NOT NULL,id_label UNSIGNED MEDIUM INT,CONSTRAINT pk_tutos_labels PRIMARY KEY(link, id_label));"
-    ]
-    for request in req:
-        send_sql_request(request)
-    #les executer une par une
-
-def random_generator(size=6):
-    return (''.join(choice(string.ascii_uppercase + string.digits) for _ in range(size)))
-
-def create_tutos(nb_tutos):
-    name_tutos = []
-    values1 = []
-    for i in range (nb_tutos):
-        values1.append([random_generator(), "http://"+random_generator(9)])
-    request = "INSERT INTO tutos (title, link) VALUES (?, ?)"
-    send_sql_request(request, many=1, values=values1)
-
-def create_labels(nb_labels):
-    values1 = []
-    for i in range(nb_labels):
-        father = randint(1, nb_labels)
-        while (father == i):
-            father = randint(1, nb_labels)
-        values1.append([random_generator(7), father])
-    request = "INSERT INTO labels (name, father_id) VALUES (?, ?)"
-    send_sql_request(request, many=1, values=values1)
-
-def link_tutos_labels(nb_tutos, nb_labels):
-    all_links = send_sql_request("SELECT link FROM tutos")
-    request = "INSERT INTO tutos_labels (link, id_label) VALUES (?, ?)"
-    values1 = []
-    for i in range (nb_tutos):
-        nb_local_labels = randint(1, 5)
-        all_id_tab = []
-        for j in range(nb_local_labels):
-            id_label = randint(1, nb_labels)
-            while (id_label in all_id_tab):
-                id_label = randint(1, nb_labels)
-            values1.append([all_links[i][0], id_label])
-            all_id_tab.append(id_label)
-        # print (str(i)+"/"+str(nb_tutos))
-    send_sql_request(request, many=1, values=values1)
-
-def add_labels_language(nb_labels):
-    labels = send_sql_request("SELECT id, name FROM labels")
-    values1 = []
-    for i in range(nb_labels):
-        inter = [str(labels[i][0]), 'U', labels[i][1]]
-        values1.append(inter)
-    request = "INSERT INTO labels_languages (id_label, country_code, name) VALUES (?, ?, ?)"
-    send_sql_request(request, many=1, values=values1)
-
-def create_all_db(db_name, nb_tutos, nb_labels):
-    create_database()
-    create_tutos(nb_tutos)
-    create_labels(nb_labels)
-    add_labels_language(nb_labels)
-    link_tutos_labels(nb_tutos, nb_labels)
-
-if (len(sys.argv) == 2):
-    print("exec [db_name] [nb_tutos] [nb_labels]") if (sys.argv[1] == "-h") else print("bad parameters")
-elif (len(sys.argv) == 4):
-    db_name = sys.argv[1]
-    nb_tutos = int(sys.argv[2])
-    nb_labels = int(sys.argv[3])
-    connection = sqlite3.connect(db_name, check_same_thread=False)
-    create_all_db(db_name, nb_tutos, nb_labels)
-    print ("Succès")
-else:
-    print ("bad parameters, use \"create_random_db.py [db_name] [nb_tutos] [nb_labels]\"")
-
diff --git a/test/demo_flask/__init__.py b/test/demo_flask/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f4d397e92b8a6a3474d59e2491be89279e2b0c9
--- /dev/null
+++ b/test/demo_flask/__init__.py
@@ -0,0 +1,38 @@
+import os
+from flask import Flask, render_template
+from flask_sqlalchemy import SQLAlchemy
+from flask_cors import CORS
+
+
+db = SQLAlchemy()
+
+class CustomFlask(Flask):
+    jinja_options = Flask.jinja_options.copy()
+    jinja_options.update(dict(
+        variable_start_string='[[', 
+        variable_end_string=']]', 
+        ))
+
+def create_app():
+
+    text_component = {"project_name": "LabelsTower", 
+                      "Element_name": "Element(s)", 
+                      "Label": "Label(s)"
+                      }
+    app = CustomFlask(__name__)
+    CORS(app)
+    db.init_app(app)
+
+    app.config.from_object(os.environ['LABELSTOWER_ENV'])
+
+    from app.labels_system import bp
+    app.register_blueprint(bp, url_prefix='/sort')
+
+    @app.route('/')
+    @app.route('/browse')
+    def home():
+        return render_template('browse.html', txt=text_component)
+    return app
+
+
+
diff --git a/test/demo_flask/config.py b/test/demo_flask/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..5461e27b03dd6a8d0d6482a1800d6c821e34c243
--- /dev/null
+++ b/test/demo_flask/config.py
@@ -0,0 +1,5 @@
+class ConfigCodingPool():
+    SQLALCHEMY_DATABASE_URI = 'sqlite:///../instance/codingpool.db'
+
+class ConfigVoiture():
+    SQLALCHEMY_DATABASE_URI = 'sqlite:///../instance/voiture.db'
\ No newline at end of file
diff --git a/test/demo_flask/models.py b/test/demo_flask/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..d51e7595abcf58572e82bf298955ce1676b37f9a
--- /dev/null
+++ b/test/demo_flask/models.py
@@ -0,0 +1,42 @@
+from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+
+app = Flask(__name__)
+app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
+db = SQLAlchemy(app)
+
+
+element_label = db.Table('Element_Label', db.Model.metadata,
+                         db.Column('id_element', db.Integer, db.ForeignKey('element.id')),
+                         db.Column('id_label', db.Integer, db.ForeignKey('label.id'))
+                         )
+
+class Element(db.Model):
+    id = db.Column(db.INTEGER, primary_key=True)
+    element_name = db.Column(db.String(50), unique=True, nullable=False)
+    labels = db.relationship(
+        "Label",
+        secondary=element_label,
+        back_populates="elements")
+
+class Label(db.Model):
+    id = db.Column(db.INTEGER, primary_key=True)
+    label_name = db.Column(db.String(50), unique=True, nullable=False)
+    father_id = db.Column(db.INTEGER, db.ForeignKey('label.id'))
+    children = db.relationship("Label",
+                    backref=db.backref('parent', remote_side=[id])
+                    )
+    aliases = db.relationship('Alias', back_populates='label')
+    elements = db.relationship(
+        "Element",
+        secondary=element_label,
+        back_populates="labels")
+
+class Alias(db.Model):
+    alias_name = db.Column(db.String(100), primary_key=True)
+    id_label = db.Column(db.INTEGER, db.ForeignKey('label.id'), nullable=False)
+    label = db.relationship('Label', back_populates='aliases')
+
+
+
+
diff --git a/app/static/categories.txt b/test/demo_flask/static/categories.txt
similarity index 100%
rename from app/static/categories.txt
rename to test/demo_flask/static/categories.txt
diff --git a/app/static/css/bootstrap.css b/test/demo_flask/static/css/bootstrap.css
similarity index 99%
rename from app/static/css/bootstrap.css
rename to test/demo_flask/static/css/bootstrap.css
index 495779a591566e7fa6612d963a04ae4ea52dc1f0..9d8f35a1faed0a930c8427e346be2abc959b99af 100644
--- a/app/static/css/bootstrap.css
+++ b/test/demo_flask/static/css/bootstrap.css
@@ -5248,7 +5248,7 @@ a.thumbnail.active {
 .list-group-item {
   position: relative;
   display: block;
-  padding: 10px 15px;
+  padding: 8px 15px;
   margin-bottom: -1px;
   /* background-color: #fff; */
   /* background-color: rgba(23, 68, 194, 0.7); */
@@ -6038,7 +6038,7 @@ button.close {
   padding: 3px 8px;
   color: #fff;
   text-align: center;
-  background-color: #000;
+  background-color: #2fc4dd;
   border-radius: 4px;
 }
 .tooltip-arrow {
diff --git a/app/static/css/bootstrap_1.css b/test/demo_flask/static/css/bootstrap_1.css
similarity index 100%
rename from app/static/css/bootstrap_1.css
rename to test/demo_flask/static/css/bootstrap_1.css
diff --git a/test/demo_flask/static/css/hierarchy.css b/test/demo_flask/static/css/hierarchy.css
new file mode 100644
index 0000000000000000000000000000000000000000..8f2475d2dcabb768d03a4b28b787db1f510f3caa
--- /dev/null
+++ b/test/demo_flask/static/css/hierarchy.css
@@ -0,0 +1,28 @@
+.hierarchy {
+    padding-top: 5px;
+    font-size: 17px;
+    text-align: left;
+    line-height: 190%;
+    padding-bottom: 5px;
+}
+
+/* Hierarchy diver icon */
+
+.hierarchy-icone_left {
+    float: left;
+    margin-right: 4%;
+    margin-left: 10px;
+    margin-top: 7px;
+}
+.hierarchy-icone_right {
+    float: right;
+    margin-right: 10px;
+    margin-top: 5px;
+}
+
+/* Hierarchy separator */
+#hierarchy-separator {
+    text-align: center;
+    margin-top: 10px;
+    margin-bottom: 10px;
+}
\ No newline at end of file
diff --git a/test/demo_flask/static/css/main.css b/test/demo_flask/static/css/main.css
new file mode 100644
index 0000000000000000000000000000000000000000..ab7cc3b9f8520ebbf128f3ca4c02078931b44c6d
--- /dev/null
+++ b/test/demo_flask/static/css/main.css
@@ -0,0 +1,36 @@
+#project_title {
+    text-align: center;
+    color: 124f66;
+}
+
+.title {
+    font-size: 20px;
+    text-align: center;
+}
+
+
+body {
+	background-image: url("../img/background_loop.png");
+	background-size: 100% 100%;
+	background-attachment: fixed;
+}
+
+#footer {
+    text-align: center;
+    font-size: 17px;
+    color: 124f66;
+    /* width: 100%; */
+}
+
+@media (min-width: 991px) {
+    #footer {
+        position:fixed; 
+        bottom: 15px;
+        left: 0;
+        width: 100%;
+    }
+}
+
+.panel {
+    background-color: rgba(255, 255, 255, 0.8);
+}
\ No newline at end of file
diff --git a/test/demo_flask/static/css/result.css b/test/demo_flask/static/css/result.css
new file mode 100644
index 0000000000000000000000000000000000000000..8f735049f7f14422d84063728e3d0b99f9e6fbf2
--- /dev/null
+++ b/test/demo_flask/static/css/result.css
@@ -0,0 +1,11 @@
+/* Result elements */
+
+.list-group {
+    overflow-y: scroll;
+}
+
+.single_result {
+    font-size: 16px;
+    padding-left: 20px;
+}
+
diff --git a/app/static/fonts/glyphicons-halflings-regular.svg b/test/demo_flask/static/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from app/static/fonts/glyphicons-halflings-regular.svg
rename to test/demo_flask/static/fonts/glyphicons-halflings-regular.eot
diff --git a/app/static/fonts/glyphicons-halflings-regular.ttf b/test/demo_flask/static/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from app/static/fonts/glyphicons-halflings-regular.ttf
rename to test/demo_flask/static/fonts/glyphicons-halflings-regular.svg
diff --git a/app/static/fonts/glyphicons-halflings-regular.woff b/test/demo_flask/static/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from app/static/fonts/glyphicons-halflings-regular.woff
rename to test/demo_flask/static/fonts/glyphicons-halflings-regular.ttf
diff --git a/app/static/fonts/glyphicons-halflings-regular.woff2 b/test/demo_flask/static/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from app/static/fonts/glyphicons-halflings-regular.woff2
rename to test/demo_flask/static/fonts/glyphicons-halflings-regular.woff
diff --git a/test/demo_flask/static/fonts/glyphicons-halflings-regular.woff2 b/test/demo_flask/static/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/static/img/background_loop.png b/test/demo_flask/static/img/background_loop.png
similarity index 100%
rename from app/static/img/background_loop.png
rename to test/demo_flask/static/img/background_loop.png
diff --git a/test/demo_flask/static/img/moins-encadre-rouge.png b/test/demo_flask/static/img/moins-encadre-rouge.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f6cfcfbf7234f59a8db8c9a58d259aec6a90893
Binary files /dev/null and b/test/demo_flask/static/img/moins-encadre-rouge.png differ
diff --git a/test/demo_flask/static/img/moins-encadre.png b/test/demo_flask/static/img/moins-encadre.png
new file mode 100644
index 0000000000000000000000000000000000000000..3531c4e8b668438fae4f24c2e7e5f54196d7f98f
Binary files /dev/null and b/test/demo_flask/static/img/moins-encadre.png differ
diff --git a/test/demo_flask/static/img/moins-rouge.png b/test/demo_flask/static/img/moins-rouge.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad28725fd2cb194093b238ccfd92067af6a2990f
Binary files /dev/null and b/test/demo_flask/static/img/moins-rouge.png differ
diff --git a/test/demo_flask/static/img/moins.png b/test/demo_flask/static/img/moins.png
new file mode 100644
index 0000000000000000000000000000000000000000..11077db303ca64cf636031d5bce93a504860f84d
Binary files /dev/null and b/test/demo_flask/static/img/moins.png differ
diff --git a/test/demo_flask/static/img/monSeparateur.png b/test/demo_flask/static/img/monSeparateur.png
new file mode 100644
index 0000000000000000000000000000000000000000..f33abdf41f436ec8215a0665c67f29adb58764c2
Binary files /dev/null and b/test/demo_flask/static/img/monSeparateur.png differ
diff --git a/test/demo_flask/static/img/plus-encadre-vert.png b/test/demo_flask/static/img/plus-encadre-vert.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ea067a548006bcaf0375a5853ccc90aaa31cc32
Binary files /dev/null and b/test/demo_flask/static/img/plus-encadre-vert.png differ
diff --git a/test/demo_flask/static/img/plus-encadre.png b/test/demo_flask/static/img/plus-encadre.png
new file mode 100644
index 0000000000000000000000000000000000000000..3795f38cf29b5ceff96acc9dcdae01b39444a208
Binary files /dev/null and b/test/demo_flask/static/img/plus-encadre.png differ
diff --git a/test/demo_flask/static/img/plus-vert.png b/test/demo_flask/static/img/plus-vert.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a968f2a50d2364e2603b766c1118bf3220a1db9
Binary files /dev/null and b/test/demo_flask/static/img/plus-vert.png differ
diff --git a/test/demo_flask/static/img/plus.png b/test/demo_flask/static/img/plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfd6e588cccf33cfd41a0f0cd4da6e3897eb6852
Binary files /dev/null and b/test/demo_flask/static/img/plus.png differ
diff --git a/test/demo_flask/static/js/ajax.js b/test/demo_flask/static/js/ajax.js
new file mode 100644
index 0000000000000000000000000000000000000000..94e9566ccf4dafe8b6545ebe09a0cead5ce6fe06
--- /dev/null
+++ b/test/demo_flask/static/js/ajax.js
@@ -0,0 +1,12 @@
+function send_simple_request(address) {
+/*
+    Return response to request send at address on the web-server
+    :param address: String
+    :return: (JSON) String
+*/
+    var xhr = new XMLHttpRequest();
+    xhr.open("GET", address, false);
+    xhr.send();
+    console.log(xhr.status);
+    return (xhr.responseText); 
+}
\ No newline at end of file
diff --git a/test/demo_flask/static/js/cookies.js b/test/demo_flask/static/js/cookies.js
new file mode 100644
index 0000000000000000000000000000000000000000..edbc7bc146db7d772a7df7e7a98e51a4ae57801a
--- /dev/null
+++ b/test/demo_flask/static/js/cookies.js
@@ -0,0 +1,85 @@
+function setCookie(label_name, value) {
+    /**
+     * Create a cookie for ten years?
+     */
+    var today = new Date();
+    var expires = new Date();
+
+    expires.setTime(today.getTime() + (10*365*24*60*60*1000));
+    document.cookie = label_name + "=" + value + ";expires=" + expires.toGMTString();
+}
+
+function getCookie(label_name) {
+    /**
+     * Retrieve the value of a cookie due to it's label_name.
+     */
+    var regex = new RegExp("(?:; )?" + label_name + "=([^;]*);?");
+
+    if (regex.test(document.cookie))
+        return (RegExp["$1"]);
+    else
+        return null;
+}
+
+function labels_tab_to_str(labels) {
+    /**
+     * Transform tab of labels to string.
+     * ex : [{'id_label': 1, 'label_name': "Learn C++", 'father_id': 6}]
+     * = 1, Learn C++, 6|...
+     */
+    var result = "";
+    var inter = []
+    for (var i = 0; labels[i]; i++)
+        inter.push([labels[i]['id'], labels[i]['name'], labels[i]['father_id']]);
+    result = inter.join('|');
+    return (result);
+}
+
+function str_to_labels_tab(str) {
+    /**
+     * Transform string to 2D tab.
+     * Ex : "42, test, 5|56, salut, 3" =>
+     * [[42, 'test', 5], [56, 'salut', 3]]
+     */
+    var result = [];
+    var split = str.split('|');
+    for (var i = 0; split[i]; i++) {
+        var inter = split[i].split(',')
+        if (inter.length == 2)
+            result.push({'id': inter[0], 'name': inter[1]});
+        else
+            result.push({'id': inter[0], 'name': inter[1], 'father_id': inter[2]});
+    }
+    return (result);
+}
+
+function save_session() {
+    /**
+     * Save mandatory_labels and unselect_tab in Cookies.
+     */
+    setCookie("cookies_mandatory_labels", labels_tab_to_str(hierarchy.mandatory_labels));
+    setCookie("cookies_forbiden_labels", labels_tab_to_str(hierarchy.forbiden_labels));
+}
+
+function setup_session() {
+    /**
+     * Return 0 no cookies are found return 0.
+     * Else return 1 if old_tab cookie are found => the initialization of tutos
+     * and labels is done from the labels contained in old_tab.
+     * need to be initialise (return 0).
+     */
+    var success = 0;
+    if (getCookie('cookies_mandatory_labels') != null && getCookie('cookies_mandatory_labels').length != 0)
+        hierarchy.mandatory_labels = str_to_labels_tab(getCookie('cookies_mandatory_labels'));
+    if (getCookie('cookies_forbiden_labels') != null && getCookie('cookies_forbiden_labels').length != 0)
+        hierarchy.forbiden_labels = str_to_labels_tab(getCookie('cookies_forbiden_labels'));
+
+    if (getCookie('cookies_mandatory_labels') != null && getCookie('cookies_mandatory_labels').length != 0) {
+        update_elements_and_labels();
+        success = 1;
+    } else if (getCookie('cookies_forbiden_labels') != null && getCookie('cookies_forbiden_labels').length != 0) {
+        update_elements_and_labels();
+        success = 1;
+    }
+    return (success);
+}
\ No newline at end of file
diff --git a/test/demo_flask/static/js/search_new_elements.js b/test/demo_flask/static/js/search_new_elements.js
new file mode 100644
index 0000000000000000000000000000000000000000..6bf41b57022ae70fe46c4527574c347077b694c9
--- /dev/null
+++ b/test/demo_flask/static/js/search_new_elements.js
@@ -0,0 +1,40 @@
+function update_elements_and_labels(){
+/*
+    Update elements and labels when user change mandatory or forbiden labels.
+    :return: void
+*/
+    //step-1 parse the parameters into the URL
+    url =""
+    url += "/sort/search/"+hierarchy.mandatory_labels.length
+    if(hierarchy.mandatory_labels.length>0){
+        url += "/"+get_ids(hierarchy.mandatory_labels,"id")
+        if(hierarchy.forbiden_labels.length>0){
+            url +="/"+get_ids(hierarchy.forbiden_labels,"id")
+        }
+    }else{
+        if(hierarchy.forbiden_labels.length>0){
+            url +="/"+get_ids(hierarchy.forbiden_labels,"id")
+        }
+    }
+    //step-2 get the updated elements and labels list
+    //result<-[elements, labels]
+    results = JSON.parse(send_simple_request(url));
+    //step-3 update vues
+    result.selected_elements = results[0]
+    hierarchy.high_discriminating_labels = results[1]
+    }
+
+function get_ids(labels,column){
+/*
+    Return all the id of the labels
+    :param labels    : List[Dict[int, str]]
+    :param varaiable :     column  : chaine de caratère
+    :return: String
+*/
+    var chaine = ""
+    labels.forEach(function(label){
+						chaine += label[column]+",";
+	});
+	chaine = chaine.slice(0,-1);
+	return chaine;
+}
\ No newline at end of file
diff --git a/app/static/js/vue.js b/test/demo_flask/static/js/vue.js
similarity index 100%
rename from app/static/js/vue.js
rename to test/demo_flask/static/js/vue.js
diff --git a/test/demo_flask/templates/api_documentation.html b/test/demo_flask/templates/api_documentation.html
new file mode 100644
index 0000000000000000000000000000000000000000..08e9165a16ef80592fe2965c348431ed522bb51e
--- /dev/null
+++ b/test/demo_flask/templates/api_documentation.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8" />
+        <title>user authentification API</title>
+    </head>
+
+    <body>
+        <table>
+            <tr>
+                <th>n°</th>
+                <th>function</th>
+                <th>URL</th>
+                <th>return</th>
+            </tr>
+            <tr>
+                <td>1</td>
+                <td>login</td>
+                <td>/auth/login</td>
+                <td>true or false</td>
+            </tr>
+        </table>
+    </body>
+</html>
\ No newline at end of file
diff --git a/test/demo_flask/templates/browse.html b/test/demo_flask/templates/browse.html
new file mode 100644
index 0000000000000000000000000000000000000000..b3b8d215354d6cc54005fcb866b017a583fc840f
--- /dev/null
+++ b/test/demo_flask/templates/browse.html
@@ -0,0 +1,320 @@
+<html>
+	<head>
+		<meta charset="utf-8">
+		<meta http-equiv="X-UA-Compatible" content="IE=edge">
+		<meta name="viewport" content="width=device-width, initial-scale=1">
+		<title>Browse</title>
+
+		<link rel="stylesheet" href="static/css/annimation.css">
+		<link rel="stylesheet" href="static/css/main.css">
+		<link rel="stylesheet" href="static/css/header.css">
+		<link rel="stylesheet" href="static/css/hierarchy.css">
+		<link rel="stylesheet" href="static/css/result.css">
+		<!-- Bootstrap -->
+		<link rel="stylesheet" href="static/css/bootstrap.css" media="screen">
+		<!-- VueJs -->
+		<script src="static/js/vue.js"></script>
+		<style type="text/css">[v-cloak] {display: none;}</style>
+	</head>
+
+	<body>
+
+		<div class='container'>
+
+			<br><br>
+			<div id="header" v-cloak>
+				<div class="row">
+					<div class="col-md-12" id="project_title">
+						<a href="/" style="text-decoration:none; color: 124f66;">
+						<h1 style="display: inline;"><b> [[ txt['project_name'] ]] </b></h1>
+						</a>
+					</div>
+				</div>
+			</div>
+			<br>
+
+			<div class="row">
+				<!-- <div class="col-md-1"></div> -->
+				<div class="col-md-3">
+					<div id='hierarchy' class="panel panel-primary" v-cloak>
+						<div class="panel-heading title">
+							<span id="hierarchy-title_ang" @click="reset()" title="Reset labels selection">[[ txt['Label'] ]]</span>
+						</div>
+
+						<div class="pannel-body hierarchy">
+							<!-- HIERARCHY.MANDATORY_LABELS -->
+							<span v-for='(label, index) in mandatory_labels'>
+								<img title="Deselect the elements bearing this label" class="hierarchy-icone_left" @click="rm_mandatory_label(index)" src="static/img/plus-encadre.png" onmouseover="this.src='static/img/plus-encadre-vert.png'" onmouseout="this.src='static/img/plus-encadre.png'">
+								<span :title="label['name']"><b>{{ redim_labels(label['name']) }}</b></span>
+								<img class="hierarchy-icone_right" src="static/img/moins.png" style="visibility: hidden;"><br> <!-- MARQUEUR (elliot)-->
+							</span>
+							<!-- HIERARCHY.MANDATORY_LABELS -->
+
+							<!-- HIERARCHY.FORBIDEN_LABELS -->
+							<span v-if="forbiden_labels.length != 0" v-for='(label, index) in forbiden_labels'>
+								<img class="hierarchy-icone_left" src="static/img/plus.png" style="visibility: hidden;">
+								<span :title="label['name']"><b>{{ redim_labels(label['name']) }}</b></span>
+								<img title="Authorizes elements bearing this label" class="hierarchy-icone_right" @click="rm_forbiden_label(index)" src="static/img/moins-encadre.png" onmouseover="this.src='static/img/moins-encadre-rouge.png'" onmouseout="this.src='static/img/moins-encadre.png'">
+								<br>
+							</span>
+							<!-- HIERARCHY.FORBIDEN_LABELS -->
+							
+							<!-- HIERARCHY.HIGH_DISCRIMATING_LABELS -->
+							<div v-if="loading == 1">
+								<div id="hierarchy-separator" v-if="(mandatory_labels.length > 0 || forbiden_labels.length > 0) && high_discriminating_labels.length > 0">
+									<img src="static/img/monSeparateur.png"/>
+								</div>
+								<transition-group name="new_labels">
+									<span v-for='(label, index) in high_discriminating_labels' v-bind:key="label['name']">
+										<img title="Selects elements with this label" class="hierarchy-icone_left" @click="add_mandatory_label(index, 'new')" src="static/img/plus.png" onmouseover="this.src='static/img/plus-vert.png'" onmouseout="this.src='static/img/plus.png'">
+										<span :title="label['name']"><b>{{ redim_labels(label['name']) }}</b></span>
+										<img title="Prohibits elements with this label" class="hierarchy-icone_right" @click="add_forbiden_label(index, 'new')" src="static/img/moins.png" onmouseover="this.src='static/img/moins-rouge.png'" onmouseout="this.src='static/img/moins.png'">
+										<br>
+									</span>
+								</transition-group>
+							</div>
+							<!-- HIERARCHY.HIGH_DISCRIMATING_LABELS -->
+
+						</div>
+					</div>
+					
+				</div>
+
+				<div class="col-md-9" id="result" v-cloak>
+					<div class="panel panel-primary">
+						<div class="panel-heading title">
+							<span id="result-title">
+								<span >{{ selected_elements.length }} [[ txt['Element_name'] ]]</span>
+							</span>
+						</div>
+
+						<!-- PRINT ELEMENTS -->
+						<ul v-if="loading == 1" class="list-group" v-bind:style="'max-height: '+((width_window > 991) ? (height_window - 151 - 70) : (450))+'px;'">
+							<li class="list-group-item" v-for='element in selected_elements' v-bind:key="element['id']">
+								<span>
+									<b class="single_result" v-bind:title="(redim_element(element['name']).indexOf('...') == -1) ? '' : element['name']">{{ redim_element(element['name']) }}</b>
+								</span>
+							</li>
+						</ul>
+
+					</div>
+				</div>
+
+			</div>
+			
+		</div>
+
+	</body>
+
+	<script src="static/js/search_new_elements.js"></script>
+	<script src="static/js/ajax.js"></script>
+	<script src="static/js/cookies.js"></script>
+	
+	<script>
+
+		function init_research() {
+			/**
+			 * Initialise the two different part of hierarchy and
+			 * the array that contain all elements.
+			 */
+			setup = setup_session();
+			if (setup == 0) {
+				update_elements_and_labels();
+			}
+		}
+
+		function update_loading(value) {
+			/**
+			 * The 'loading' value is common to both hierarchy and 
+			 * result views. When it is equal to 0, the content of 
+			 * hierarchy.high_discriminating_labels (new labels) and result.selected_elements
+			 * (new elements) must not be display. After modifications, loading
+			 * changes to one and they are displayed.
+			 */
+			hierarchy.loading = value;
+			result.loading = value;
+		}
+
+
+
+		var hierarchy = new Vue ({
+			el: '#hierarchy',
+			data: {
+				/**
+				 * - 'mandatory_labels' contain all labels previously selected. They
+				 * are used for select the elements and they are signaled by a plus.
+				 * - 'forbiden_labels' contain all labels previously selected. They
+				 * are used for select the elements and they are signaled by a minus.
+				 * - 'high_discriminating_labels' contain the labels generated thanks to elements.
+				 * For 'loading' see update_loading function above.
+				 */
+				mandatory_labels: [],
+				forbiden_labels: [],
+				high_discriminating_labels: [],
+				size_div: 0,
+				loading: 1
+			},
+			methods: {
+				reset : function() {
+					/**
+					 * Clear all array of hierarchy.
+					 */
+					hierarchy.mandatory_labels = [];
+					hierarchy.high_discriminating_labels = [];
+					hierarchy.forbiden_labels = [];
+					result.selected_elements = [];
+					update_loading(0);
+					update_elements_and_labels();
+					save_session();
+					update_loading(1);
+				},
+				add_mandatory_label: function(index) {
+					/**
+					 * Move selected label from [high_discriminating_labels => mandatory_labels]
+					 */
+					update_loading(0);
+					hierarchy.mandatory_labels.push(hierarchy.high_discriminating_labels[index]);
+					hierarchy.high_discriminating_labels.splice(index, 1);
+					console.log("av")
+					update_elements_and_labels();
+					console.log("ap")
+					save_session();
+					update_loading(1);
+				},
+				rm_mandatory_label: function(index) {
+				/**
+				 * If a label in 'mandatory_labels' is selected, it is deleted
+				 * of this tab. If this tab is empty, the high_discriminating_labels
+				 * is filled with the main labels (labels without father).
+				 */
+					update_loading(0);
+					hierarchy.mandatory_labels.splice(hierarchy.mandatory_labels.indexOf(hierarchy.mandatory_labels[index]), 1);
+					update_elements_and_labels();
+					save_session();
+					update_loading(1);
+				},
+				add_forbiden_label: function(index) {
+					/**
+					 * After click on cross of high_discriminating_labels.
+					 * This label is add to forbiden_labels and it is remove from previous high_discriminating_labels.
+					 * Next the list of elements is updated.
+					 */
+					update_loading(0);
+					hierarchy.forbiden_labels.push(hierarchy.high_discriminating_labels[index]);
+					hierarchy.high_discriminating_labels.splice(index, 1);
+					update_elements_and_labels();
+					save_session();
+					update_loading(1);
+				},
+				rm_forbiden_label: function(index) {
+					/**
+					 * After click on minus of labels from forbiden_labels, this label
+					 * is remove of this tab and the list of elements is updated.
+					 */
+					update_loading(0);
+					hierarchy.forbiden_labels.splice(index, 1);
+					update_elements_and_labels();
+					save_session();
+					update_loading(1);
+				},
+				redim_labels(name) {
+					/**
+					 * In function of the len of hierarchy div and name length,
+					 * the label name is truncated.
+					 **/
+					var size_div = hierarchy.size_div;
+					if (size_div <= 213 && name.length > 12)
+						return (name.slice(0, 8)+"...");
+					else if (size_div <= 270 && name.length > 15)
+						return (name.slice(0, 10)+"...");
+					else if (size_div <= 368 && name.length > 23)
+						return (name.slice(0, 16)+"...");
+					else if (size_div <= 462 && name.length > 43)
+						return (name.slice(0, 29)+"...");
+					else if (size_div <= 581 && name.length > 43)
+						return (name.slice(0, 40)+"...");
+					else if (size_div <= 690 && name.length > 59)
+						return (name.slice(0, 56)+"...");
+					else if (size_div <= 720 && name.length > 73)
+						return (name.slice(0, 70)+"...");
+					return (name);
+				}
+			}
+		});
+
+		var result = new Vue ({
+			el: '#result',
+			data: {
+				/**
+				 * - 'selected_elements'
+				 *		contain all elements to display on this form : [id, name].
+				 * - 'loading'* - size_div
+				 *		contain the size (width of the result block) for be able to truncate
+				 * 		the name of elements.
+				 */
+				selected_elements: [],
+				loading: 1,
+				size_div: 0,
+				height_window: 0,
+				width_window: 0
+			},
+			methods: {
+				redim_element(name) {
+					/**
+					 * In function of the length of result div and name length,
+					 * the name of the element is truncated.
+					 **/
+					size_div = result.size_div;
+					if (size_div <= 643 && name.length >= 27)
+						return (name.slice(0, 22)+"...");
+					else if (size_div <= 649 && name.length >= 29)
+						return (name.slice(0, 26)+"...");
+					else if (size_div <= 695 && name.length >= 36)
+					 	return (name.slice(0, 29)+"...");
+					else if (size_div <= 716 && name.length >= 36)
+						return (name.slice(0, 33)+"...");
+					else if (size_div <= 750 && name.length > 40)
+						return (name.slice(0, 35)+"...");
+					else if (size_div <= 878 && name.length >= 50)
+						return (name.slice(0, 45)+"...");
+					return (name);
+				}
+			}
+		});
+
+		var footer = new Vue ({
+			el: '#footer',
+			data: {
+			},
+			methods: {
+			}
+		});
+
+		var header = new Vue ({
+			el: '#header',
+			data: {
+			},
+			methods: {
+				
+			}
+		});
+
+		window.onresize = function () {
+			/**
+			 * If the size of the window varies the value of this variables changes.
+			 **/
+			hierarchy.size_div = document.getElementById("hierarchy").offsetWidth;
+			result.size_div = document.getElementById("result").offsetWidth;
+			result.height_window = window.innerHeight;
+			result.width_window = window.innerWidth;
+		};
+
+		result.size_div = document.getElementById("result").offsetWidth;
+		hierarchy.size_div = document.getElementById("hierarchy").offsetWidth;
+		result.height_window = window.innerHeight;
+		result.width_window = window.innerWidth;
+		init_research();
+
+	</script>
+
+</html>
diff --git a/test/instance/data_codingpool.sql b/test/instance/data_codingpool.sql
new file mode 100644
index 0000000000000000000000000000000000000000..de9a149f6b6edc7fdd0f364b5da14676fbdfd9e9
--- /dev/null
+++ b/test/instance/data_codingpool.sql
@@ -0,0 +1,451 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+INSERT INTO ELEMENT VALUES(45,'Python 3, premier pas');
+INSERT INTO ELEMENT VALUES(46,'Pandas');
+INSERT INTO ELEMENT VALUES(47,'Mon premier programme MPI');
+INSERT INTO ELEMENT VALUES(48,'TensorFlow');
+INSERT INTO ELEMENT VALUES(49,'Python Panda DataFrames');
+INSERT INTO ELEMENT VALUES(50,'Rudiments de Machine Learning');
+INSERT INTO ELEMENT VALUES(51,'Root');
+INSERT INTO ELEMENT VALUES(52,'Geant');
+INSERT INTO ELEMENT VALUES(53,'Les caches');
+INSERT INTO ELEMENT VALUES(54,'L''alignement des données');
+INSERT INTO ELEMENT VALUES(55,'Profilage avec Perf');
+INSERT INTO ELEMENT VALUES(56,'Rudiments de calcul flottant');
+INSERT INTO ELEMENT VALUES(57,'Rudiments de vectorisation');
+INSERT INTO ELEMENT VALUES(58,'Random123');
+INSERT INTO ELEMENT VALUES(59,'QuantStack Xsimd');
+INSERT INTO ELEMENT VALUES(60,'Mon premier programme OpenCL');
+INSERT INTO ELEMENT VALUES(61,'Initiation à Kokkos');
+INSERT INTO ELEMENT VALUES(62,'Le modèle Roofline');
+INSERT INTO ELEMENT VALUES(63,'Mon premier programme OpenMP');
+INSERT INTO ELEMENT VALUES(64,'HDF5');
+INSERT INTO ELEMENT VALUES(65,'Spack');
+INSERT INTO ELEMENT VALUES(66,'Module');
+INSERT INTO ELEMENT VALUES(67,'CMake');
+INSERT INTO ELEMENT VALUES(27,'Gitlab CI TP 1');
+INSERT INTO ELEMENT VALUES(28,'Gitlab CI TP 2');
+INSERT INTO ELEMENT VALUES(1,'Inférence de type (auto)');
+INSERT INTO ELEMENT VALUES(2,'Références jetables (&&) et déplacement de données');
+INSERT INTO ELEMENT VALUES(3,'Fonctions lambda');
+INSERT INTO ELEMENT VALUES(4,'Dive into Go');
+INSERT INTO ELEMENT VALUES(5,'Passer de Python 2 à Python 3');
+INSERT INTO ELEMENT VALUES(6,'Piscine Ada');
+INSERT INTO ELEMENT VALUES(7,'Plongeon MultiLangages');
+INSERT INTO ELEMENT VALUES(8,'Petit aperçu de l''utilisation de Spark');
+INSERT INTO ELEMENT VALUES(9,'Git 1 : Introduction');
+INSERT INTO ELEMENT VALUES(10,'Git 2 : gestion de versions');
+INSERT INTO ELEMENT VALUES(11,'Git 3 : gestion de branches');
+INSERT INTO ELEMENT VALUES(12,'Git 4 : à plusieurs');
+INSERT INTO ELEMENT VALUES(13,'Sphinx : un outil de génération de documentations');
+INSERT INTO ELEMENT VALUES(14,'Plongeon LimeSurvey');
+INSERT INTO ELEMENT VALUES(15,'Aperçu de la base de données MongoDB');
+INSERT INTO ELEMENT VALUES(16,'Plongeon PyQt4');
+INSERT INTO ELEMENT VALUES(17,'Docker 0 : installer sous Linux');
+INSERT INTO ELEMENT VALUES(18,'Docker 0 : installer sous MacOSX');
+INSERT INTO ELEMENT VALUES(19,'Docker 0 : installer sous Windows');
+INSERT INTO ELEMENT VALUES(20,'Docker 0 : installer sur du vieux matériel Apple');
+INSERT INTO ELEMENT VALUES(21,'Docker 0 : installer sur un vieux Windows');
+INSERT INTO ELEMENT VALUES(22,'Docker 1 : run');
+INSERT INTO ELEMENT VALUES(23,'Docker 2 : Build');
+INSERT INTO ELEMENT VALUES(24,'Docker 3 : Network');
+INSERT INTO ELEMENT VALUES(25,'Docker 3 : volume');
+INSERT INTO ELEMENT VALUES(29,'Docker 4 : compose');
+INSERT INTO ELEMENT VALUES(30,'Docker 6 : compose advanced');
+INSERT INTO ELEMENT VALUES(31,'Kubernetes');
+INSERT INTO ELEMENT VALUES(32,'Mon premier notebook');
+INSERT INTO ELEMENT VALUES(68,'Functional programming & Scala');
+INSERT INTO ELEMENT VALUES(69,'Singularity 1 :  utilisation basique');
+INSERT INTO ELEMENT VALUES(70,'Singularity 2 : utilisation d''openMPI');
+INSERT INTO ELEMENT VALUES(71,'Singularity 3 : utilisation avancée');
+INSERT INTO ELEMENT VALUES(33,'Introduction to Functional Programming in OCaml');
+INSERT INTO ELEMENT VALUES(34,'Cryptography I');
+INSERT INTO ELEMENT VALUES(35,'Cryptography II');
+INSERT INTO ELEMENT VALUES(36,'Introduction to Cyber Security');
+INSERT INTO ELEMENT VALUES(37,'Machine Learning');
+INSERT INTO ELEMENT VALUES(38,'The Rust Programming Language');
+INSERT INTO ELEMENT VALUES(39,'Pro Git (en)');
+INSERT INTO ELEMENT VALUES(40,'Pro Git (fr)');
+INSERT INTO ELEMENT VALUES(72,'Data Analysis and Visualization with R');
+INSERT INTO ELEMENT VALUES(73,'Data Analysis and Visualization with Python');
+INSERT INTO LABEL VALUES(23,'Programmation',NULL);
+INSERT INTO LABEL VALUES(24,'Languages',23);
+INSERT INTO LABEL VALUES(25,'C++',24);
+INSERT INTO LABEL VALUES(26,'Python',24);
+INSERT INTO LABEL VALUES(27,'Data Science',23);
+INSERT INTO LABEL VALUES(29,'Software Engineering',23);
+INSERT INTO LABEL VALUES(30,'Git',55);
+INSERT INTO LABEL VALUES(31,'Gitlab',29);
+INSERT INTO LABEL VALUES(32,'Documentation',29);
+INSERT INTO LABEL VALUES(33,'Notebooks',23);
+INSERT INTO LABEL VALUES(34,'Jupyter',33);
+INSERT INTO LABEL VALUES(35,'Database',23);
+INSERT INTO LABEL VALUES(36,'Human-Machine Interfaces',23);
+INSERT INTO LABEL VALUES(37,'Exploitation',NULL);
+INSERT INTO LABEL VALUES(38,'Continuous Integration',37);
+INSERT INTO LABEL VALUES(39,'Containers',37);
+INSERT INTO LABEL VALUES(40,'Docker',39);
+INSERT INTO LABEL VALUES(41,'Orchestration',37);
+INSERT INTO LABEL VALUES(42,'Kubernetes',41);
+INSERT INTO LABEL VALUES(43,'Office',NULL);
+INSERT INTO LABEL VALUES(46,'Rust',24);
+INSERT INTO LABEL VALUES(47,'OCaml',24);
+INSERT INTO LABEL VALUES(48,'Functional',23);
+INSERT INTO LABEL VALUES(49,'Scientific Computing',23);
+INSERT INTO LABEL VALUES(51,'Machine learning',49);
+INSERT INTO LABEL VALUES(52,'Parallelism',49);
+INSERT INTO LABEL VALUES(53,'Security',NULL);
+INSERT INTO LABEL VALUES(54,'Encryption',53);
+INSERT INTO LABEL VALUES(55,'Versioning',29);
+INSERT INTO LABEL VALUES(58,'Singularity',39);
+INSERT INTO LABEL VALUES(60,'MPI',59);
+INSERT INTO LABEL VALUES(59,'High Performance Computing',49);
+INSERT INTO LABEL VALUES(45,'In2p3',NULL);
+INSERT INTO LABEL VALUES(56,'English',NULL);
+INSERT INTO LABEL VALUES(57,'French',NULL);
+INSERT INTO LABEL VALUES(64,'Scala',24);
+INSERT INTO LABEL VALUES(61,'Physics',NULL);
+INSERT INTO LABEL VALUES(65,'R',24);
+INSERT INTO LABEL VALUES(62,'Package Management',29);
+INSERT INTO LABEL VALUES(63,'Build Process of Software',29);
+INSERT INTO ALIAS VALUES('Coding',2);
+INSERT INTO ALIAS VALUES('Languages',3);
+INSERT INTO ALIAS VALUES('Langage',3);
+INSERT INTO ALIAS VALUES('Language',3);
+INSERT INTO ALIAS VALUES('CPP',4);
+INSERT INTO ALIAS VALUES('C Plus Plus',4);
+INSERT INTO ALIAS VALUES('Big Data',7);
+INSERT INTO ALIAS VALUES('Données massives',7);
+INSERT INTO ALIAS VALUES('Software Engineering',8);
+INSERT INTO ALIAS VALUES('Notebook',12);
+INSERT INTO ALIAS VALUES('Databases',14);
+INSERT INTO ALIAS VALUES('Base de donnée',14);
+INSERT INTO ALIAS VALUES('Database',14);
+INSERT INTO ALIAS VALUES('Interface Homme-Machine',15);
+INSERT INTO ALIAS VALUES('GUI',15);
+INSERT INTO ALIAS VALUES('Graphic User Interfaces',15);
+INSERT INTO ALIAS VALUES('Graphic User Interface',15);
+INSERT INTO ALIAS VALUES('Administration',16);
+INSERT INTO ALIAS VALUES('ASR',16);
+INSERT INTO ALIAS VALUES('Administration Systèmes et Réseaux',16);
+INSERT INTO ALIAS VALUES('Administration Système et Réseau',16);
+INSERT INTO ALIAS VALUES('Continuous Integration',17);
+INSERT INTO ALIAS VALUES('Conteneur',18);
+INSERT INTO ALIAS VALUES('Containers',18);
+INSERT INTO ALIAS VALUES('Container',18);
+INSERT INTO ALIAS VALUES('Desktop Tools',22);
+INSERT INTO ALIAS VALUES('Desktop Tool',22);
+INSERT INTO ALIAS VALUES('Office',22);
+INSERT INTO ALIAS VALUES('Calcul',49);
+INSERT INTO ELEMENT_LABEL VALUES(1,23);
+INSERT INTO ELEMENT_LABEL VALUES(1,24);
+INSERT INTO ELEMENT_LABEL VALUES(1,25);
+INSERT INTO ELEMENT_LABEL VALUES(1,45);
+INSERT INTO ELEMENT_LABEL VALUES(1,57);
+INSERT INTO ELEMENT_LABEL VALUES(2,23);
+INSERT INTO ELEMENT_LABEL VALUES(2,24);
+INSERT INTO ELEMENT_LABEL VALUES(2,25);
+INSERT INTO ELEMENT_LABEL VALUES(2,45);
+INSERT INTO ELEMENT_LABEL VALUES(2,57);
+INSERT INTO ELEMENT_LABEL VALUES(3,23);
+INSERT INTO ELEMENT_LABEL VALUES(3,24);
+INSERT INTO ELEMENT_LABEL VALUES(3,25);
+INSERT INTO ELEMENT_LABEL VALUES(3,45);
+INSERT INTO ELEMENT_LABEL VALUES(3,57);
+INSERT INTO ELEMENT_LABEL VALUES(4,23);
+INSERT INTO ELEMENT_LABEL VALUES(4,45);
+INSERT INTO ELEMENT_LABEL VALUES(4,57);
+INSERT INTO ELEMENT_LABEL VALUES(5,23);
+INSERT INTO ELEMENT_LABEL VALUES(5,24);
+INSERT INTO ELEMENT_LABEL VALUES(5,26);
+INSERT INTO ELEMENT_LABEL VALUES(5,45);
+INSERT INTO ELEMENT_LABEL VALUES(5,57);
+INSERT INTO ELEMENT_LABEL VALUES(6,23);
+INSERT INTO ELEMENT_LABEL VALUES(6,45);
+INSERT INTO ELEMENT_LABEL VALUES(6,57);
+INSERT INTO ELEMENT_LABEL VALUES(7,23);
+INSERT INTO ELEMENT_LABEL VALUES(7,45);
+INSERT INTO ELEMENT_LABEL VALUES(7,57);
+INSERT INTO ELEMENT_LABEL VALUES(8,23);
+INSERT INTO ELEMENT_LABEL VALUES(8,27);
+INSERT INTO ELEMENT_LABEL VALUES(8,45);
+INSERT INTO ELEMENT_LABEL VALUES(8,57);
+INSERT INTO ELEMENT_LABEL VALUES(9,23);
+INSERT INTO ELEMENT_LABEL VALUES(9,29);
+INSERT INTO ELEMENT_LABEL VALUES(9,30);
+INSERT INTO ELEMENT_LABEL VALUES(9,45);
+INSERT INTO ELEMENT_LABEL VALUES(9,55);
+INSERT INTO ELEMENT_LABEL VALUES(9,57);
+INSERT INTO ELEMENT_LABEL VALUES(10,23);
+INSERT INTO ELEMENT_LABEL VALUES(10,29);
+INSERT INTO ELEMENT_LABEL VALUES(10,30);
+INSERT INTO ELEMENT_LABEL VALUES(10,45);
+INSERT INTO ELEMENT_LABEL VALUES(10,55);
+INSERT INTO ELEMENT_LABEL VALUES(10,57);
+INSERT INTO ELEMENT_LABEL VALUES(11,23);
+INSERT INTO ELEMENT_LABEL VALUES(11,29);
+INSERT INTO ELEMENT_LABEL VALUES(11,30);
+INSERT INTO ELEMENT_LABEL VALUES(11,45);
+INSERT INTO ELEMENT_LABEL VALUES(11,55);
+INSERT INTO ELEMENT_LABEL VALUES(11,57);
+INSERT INTO ELEMENT_LABEL VALUES(12,23);
+INSERT INTO ELEMENT_LABEL VALUES(12,29);
+INSERT INTO ELEMENT_LABEL VALUES(12,30);
+INSERT INTO ELEMENT_LABEL VALUES(12,45);
+INSERT INTO ELEMENT_LABEL VALUES(12,55);
+INSERT INTO ELEMENT_LABEL VALUES(12,57);
+INSERT INTO ELEMENT_LABEL VALUES(13,23);
+INSERT INTO ELEMENT_LABEL VALUES(13,29);
+INSERT INTO ELEMENT_LABEL VALUES(13,32);
+INSERT INTO ELEMENT_LABEL VALUES(13,45);
+INSERT INTO ELEMENT_LABEL VALUES(13,57);
+INSERT INTO ELEMENT_LABEL VALUES(14,43);
+INSERT INTO ELEMENT_LABEL VALUES(14,45);
+INSERT INTO ELEMENT_LABEL VALUES(14,57);
+INSERT INTO ELEMENT_LABEL VALUES(15,23);
+INSERT INTO ELEMENT_LABEL VALUES(15,35);
+INSERT INTO ELEMENT_LABEL VALUES(15,45);
+INSERT INTO ELEMENT_LABEL VALUES(15,57);
+INSERT INTO ELEMENT_LABEL VALUES(16,23);
+INSERT INTO ELEMENT_LABEL VALUES(16,36);
+INSERT INTO ELEMENT_LABEL VALUES(16,45);
+INSERT INTO ELEMENT_LABEL VALUES(16,57);
+INSERT INTO ELEMENT_LABEL VALUES(17,37);
+INSERT INTO ELEMENT_LABEL VALUES(17,39);
+INSERT INTO ELEMENT_LABEL VALUES(17,40);
+INSERT INTO ELEMENT_LABEL VALUES(17,45);
+INSERT INTO ELEMENT_LABEL VALUES(17,57);
+INSERT INTO ELEMENT_LABEL VALUES(18,37);
+INSERT INTO ELEMENT_LABEL VALUES(18,39);
+INSERT INTO ELEMENT_LABEL VALUES(18,40);
+INSERT INTO ELEMENT_LABEL VALUES(18,45);
+INSERT INTO ELEMENT_LABEL VALUES(18,57);
+INSERT INTO ELEMENT_LABEL VALUES(19,37);
+INSERT INTO ELEMENT_LABEL VALUES(19,39);
+INSERT INTO ELEMENT_LABEL VALUES(19,40);
+INSERT INTO ELEMENT_LABEL VALUES(19,45);
+INSERT INTO ELEMENT_LABEL VALUES(19,57);
+INSERT INTO ELEMENT_LABEL VALUES(20,37);
+INSERT INTO ELEMENT_LABEL VALUES(20,39);
+INSERT INTO ELEMENT_LABEL VALUES(20,40);
+INSERT INTO ELEMENT_LABEL VALUES(20,45);
+INSERT INTO ELEMENT_LABEL VALUES(20,57);
+INSERT INTO ELEMENT_LABEL VALUES(21,37);
+INSERT INTO ELEMENT_LABEL VALUES(21,39);
+INSERT INTO ELEMENT_LABEL VALUES(21,40);
+INSERT INTO ELEMENT_LABEL VALUES(21,45);
+INSERT INTO ELEMENT_LABEL VALUES(21,57);
+INSERT INTO ELEMENT_LABEL VALUES(22,37);
+INSERT INTO ELEMENT_LABEL VALUES(22,39);
+INSERT INTO ELEMENT_LABEL VALUES(22,40);
+INSERT INTO ELEMENT_LABEL VALUES(22,45);
+INSERT INTO ELEMENT_LABEL VALUES(22,57);
+INSERT INTO ELEMENT_LABEL VALUES(23,37);
+INSERT INTO ELEMENT_LABEL VALUES(23,39);
+INSERT INTO ELEMENT_LABEL VALUES(23,40);
+INSERT INTO ELEMENT_LABEL VALUES(23,45);
+INSERT INTO ELEMENT_LABEL VALUES(23,57);
+INSERT INTO ELEMENT_LABEL VALUES(24,37);
+INSERT INTO ELEMENT_LABEL VALUES(24,39);
+INSERT INTO ELEMENT_LABEL VALUES(24,40);
+INSERT INTO ELEMENT_LABEL VALUES(24,45);
+INSERT INTO ELEMENT_LABEL VALUES(24,57);
+INSERT INTO ELEMENT_LABEL VALUES(25,37);
+INSERT INTO ELEMENT_LABEL VALUES(25,39);
+INSERT INTO ELEMENT_LABEL VALUES(25,40);
+INSERT INTO ELEMENT_LABEL VALUES(25,45);
+INSERT INTO ELEMENT_LABEL VALUES(25,57);
+INSERT INTO ELEMENT_LABEL VALUES(27,23);
+INSERT INTO ELEMENT_LABEL VALUES(27,29);
+INSERT INTO ELEMENT_LABEL VALUES(27,31);
+INSERT INTO ELEMENT_LABEL VALUES(27,37);
+INSERT INTO ELEMENT_LABEL VALUES(27,38);
+INSERT INTO ELEMENT_LABEL VALUES(27,45);
+INSERT INTO ELEMENT_LABEL VALUES(27,57);
+INSERT INTO ELEMENT_LABEL VALUES(28,23);
+INSERT INTO ELEMENT_LABEL VALUES(28,29);
+INSERT INTO ELEMENT_LABEL VALUES(28,31);
+INSERT INTO ELEMENT_LABEL VALUES(28,37);
+INSERT INTO ELEMENT_LABEL VALUES(28,38);
+INSERT INTO ELEMENT_LABEL VALUES(28,45);
+INSERT INTO ELEMENT_LABEL VALUES(28,57);
+INSERT INTO ELEMENT_LABEL VALUES(29,37);
+INSERT INTO ELEMENT_LABEL VALUES(29,39);
+INSERT INTO ELEMENT_LABEL VALUES(29,40);
+INSERT INTO ELEMENT_LABEL VALUES(29,41);
+INSERT INTO ELEMENT_LABEL VALUES(29,45);
+INSERT INTO ELEMENT_LABEL VALUES(29,57);
+INSERT INTO ELEMENT_LABEL VALUES(30,37);
+INSERT INTO ELEMENT_LABEL VALUES(30,39);
+INSERT INTO ELEMENT_LABEL VALUES(30,40);
+INSERT INTO ELEMENT_LABEL VALUES(30,41);
+INSERT INTO ELEMENT_LABEL VALUES(30,45);
+INSERT INTO ELEMENT_LABEL VALUES(30,57);
+INSERT INTO ELEMENT_LABEL VALUES(31,37);
+INSERT INTO ELEMENT_LABEL VALUES(31,39);
+INSERT INTO ELEMENT_LABEL VALUES(31,41);
+INSERT INTO ELEMENT_LABEL VALUES(31,42);
+INSERT INTO ELEMENT_LABEL VALUES(31,45);
+INSERT INTO ELEMENT_LABEL VALUES(31,57);
+INSERT INTO ELEMENT_LABEL VALUES(32,23);
+INSERT INTO ELEMENT_LABEL VALUES(32,24);
+INSERT INTO ELEMENT_LABEL VALUES(32,26);
+INSERT INTO ELEMENT_LABEL VALUES(32,33);
+INSERT INTO ELEMENT_LABEL VALUES(32,34);
+INSERT INTO ELEMENT_LABEL VALUES(32,45);
+INSERT INTO ELEMENT_LABEL VALUES(32,57);
+INSERT INTO ELEMENT_LABEL VALUES(33,23);
+INSERT INTO ELEMENT_LABEL VALUES(33,24);
+INSERT INTO ELEMENT_LABEL VALUES(33,47);
+INSERT INTO ELEMENT_LABEL VALUES(33,48);
+INSERT INTO ELEMENT_LABEL VALUES(33,56);
+INSERT INTO ELEMENT_LABEL VALUES(34,23);
+INSERT INTO ELEMENT_LABEL VALUES(34,53);
+INSERT INTO ELEMENT_LABEL VALUES(34,54);
+INSERT INTO ELEMENT_LABEL VALUES(34,56);
+INSERT INTO ELEMENT_LABEL VALUES(35,23);
+INSERT INTO ELEMENT_LABEL VALUES(35,53);
+INSERT INTO ELEMENT_LABEL VALUES(35,54);
+INSERT INTO ELEMENT_LABEL VALUES(35,56);
+INSERT INTO ELEMENT_LABEL VALUES(36,43);
+INSERT INTO ELEMENT_LABEL VALUES(36,53);
+INSERT INTO ELEMENT_LABEL VALUES(36,56);
+INSERT INTO ELEMENT_LABEL VALUES(37,23);
+INSERT INTO ELEMENT_LABEL VALUES(37,49);
+INSERT INTO ELEMENT_LABEL VALUES(37,51);
+INSERT INTO ELEMENT_LABEL VALUES(37,56);
+INSERT INTO ELEMENT_LABEL VALUES(38,23);
+INSERT INTO ELEMENT_LABEL VALUES(38,24);
+INSERT INTO ELEMENT_LABEL VALUES(38,46);
+INSERT INTO ELEMENT_LABEL VALUES(38,49);
+INSERT INTO ELEMENT_LABEL VALUES(38,52);
+INSERT INTO ELEMENT_LABEL VALUES(38,56);
+INSERT INTO ELEMENT_LABEL VALUES(39,23);
+INSERT INTO ELEMENT_LABEL VALUES(39,29);
+INSERT INTO ELEMENT_LABEL VALUES(39,30);
+INSERT INTO ELEMENT_LABEL VALUES(39,55);
+INSERT INTO ELEMENT_LABEL VALUES(39,56);
+INSERT INTO ELEMENT_LABEL VALUES(40,23);
+INSERT INTO ELEMENT_LABEL VALUES(40,29);
+INSERT INTO ELEMENT_LABEL VALUES(40,30);
+INSERT INTO ELEMENT_LABEL VALUES(40,55);
+INSERT INTO ELEMENT_LABEL VALUES(40,57);
+INSERT INTO ELEMENT_LABEL VALUES(45,26);
+INSERT INTO ELEMENT_LABEL VALUES(45,24);
+INSERT INTO ELEMENT_LABEL VALUES(45,23);
+INSERT INTO ELEMENT_LABEL VALUES(45,57);
+INSERT INTO ELEMENT_LABEL VALUES(46,26);
+INSERT INTO ELEMENT_LABEL VALUES(46,24);
+INSERT INTO ELEMENT_LABEL VALUES(46,23);
+INSERT INTO ELEMENT_LABEL VALUES(47,59);
+INSERT INTO ELEMENT_LABEL VALUES(47,49);
+INSERT INTO ELEMENT_LABEL VALUES(47,23);
+INSERT INTO ELEMENT_LABEL VALUES(47,60);
+INSERT INTO ELEMENT_LABEL VALUES(48,27);
+INSERT INTO ELEMENT_LABEL VALUES(48,23);
+INSERT INTO ELEMENT_LABEL VALUES(48,51);
+INSERT INTO ELEMENT_LABEL VALUES(48,49);
+INSERT INTO ELEMENT_LABEL VALUES(48,57);
+INSERT INTO ELEMENT_LABEL VALUES(46,57);
+INSERT INTO ELEMENT_LABEL VALUES(47,57);
+INSERT INTO ELEMENT_LABEL VALUES(49,57);
+INSERT INTO ELEMENT_LABEL VALUES(49,26);
+INSERT INTO ELEMENT_LABEL VALUES(49,24);
+INSERT INTO ELEMENT_LABEL VALUES(49,23);
+INSERT INTO ELEMENT_LABEL VALUES(49,27);
+INSERT INTO ELEMENT_LABEL VALUES(50,51);
+INSERT INTO ELEMENT_LABEL VALUES(50,49);
+INSERT INTO ELEMENT_LABEL VALUES(50,23);
+INSERT INTO ELEMENT_LABEL VALUES(50,57);
+INSERT INTO ELEMENT_LABEL VALUES(51,57);
+INSERT INTO ELEMENT_LABEL VALUES(51,61);
+INSERT INTO ELEMENT_LABEL VALUES(51,25);
+INSERT INTO ELEMENT_LABEL VALUES(51,24);
+INSERT INTO ELEMENT_LABEL VALUES(51,23);
+INSERT INTO ELEMENT_LABEL VALUES(52,57);
+INSERT INTO ELEMENT_LABEL VALUES(52,61);
+INSERT INTO ELEMENT_LABEL VALUES(52,25);
+INSERT INTO ELEMENT_LABEL VALUES(52,24);
+INSERT INTO ELEMENT_LABEL VALUES(52,23);
+INSERT INTO ELEMENT_LABEL VALUES(53,57);
+INSERT INTO ELEMENT_LABEL VALUES(53,49);
+INSERT INTO ELEMENT_LABEL VALUES(53,23);
+INSERT INTO ELEMENT_LABEL VALUES(54,57);
+INSERT INTO ELEMENT_LABEL VALUES(54,49);
+INSERT INTO ELEMENT_LABEL VALUES(54,23);
+INSERT INTO ELEMENT_LABEL VALUES(55,57);
+INSERT INTO ELEMENT_LABEL VALUES(55,49);
+INSERT INTO ELEMENT_LABEL VALUES(55,23);
+INSERT INTO ELEMENT_LABEL VALUES(56,57);
+INSERT INTO ELEMENT_LABEL VALUES(56,49);
+INSERT INTO ELEMENT_LABEL VALUES(56,23);
+INSERT INTO ELEMENT_LABEL VALUES(57,57);
+INSERT INTO ELEMENT_LABEL VALUES(57,49);
+INSERT INTO ELEMENT_LABEL VALUES(57,23);
+INSERT INTO ELEMENT_LABEL VALUES(58,57);
+INSERT INTO ELEMENT_LABEL VALUES(58,49);
+INSERT INTO ELEMENT_LABEL VALUES(58,23);
+INSERT INTO ELEMENT_LABEL VALUES(59,57);
+INSERT INTO ELEMENT_LABEL VALUES(59,49);
+INSERT INTO ELEMENT_LABEL VALUES(59,23);
+INSERT INTO ELEMENT_LABEL VALUES(60,57);
+INSERT INTO ELEMENT_LABEL VALUES(60,49);
+INSERT INTO ELEMENT_LABEL VALUES(60,23);
+INSERT INTO ELEMENT_LABEL VALUES(61,57);
+INSERT INTO ELEMENT_LABEL VALUES(61,49);
+INSERT INTO ELEMENT_LABEL VALUES(61,23);
+INSERT INTO ELEMENT_LABEL VALUES(62,57);
+INSERT INTO ELEMENT_LABEL VALUES(62,49);
+INSERT INTO ELEMENT_LABEL VALUES(62,23);
+INSERT INTO ELEMENT_LABEL VALUES(63,57);
+INSERT INTO ELEMENT_LABEL VALUES(63,49);
+INSERT INTO ELEMENT_LABEL VALUES(63,23);
+INSERT INTO ELEMENT_LABEL VALUES(64,23);
+INSERT INTO ELEMENT_LABEL VALUES(64,57);
+INSERT INTO ELEMENT_LABEL VALUES(64,61);
+INSERT INTO ELEMENT_LABEL VALUES(65,62);
+INSERT INTO ELEMENT_LABEL VALUES(65,29);
+INSERT INTO ELEMENT_LABEL VALUES(65,23);
+INSERT INTO ELEMENT_LABEL VALUES(65,57);
+INSERT INTO ELEMENT_LABEL VALUES(66,57);
+INSERT INTO ELEMENT_LABEL VALUES(66,59);
+INSERT INTO ELEMENT_LABEL VALUES(66,49);
+INSERT INTO ELEMENT_LABEL VALUES(66,23);
+INSERT INTO ELEMENT_LABEL VALUES(66,62);
+INSERT INTO ELEMENT_LABEL VALUES(66,29);
+INSERT INTO ELEMENT_LABEL VALUES(67,63);
+INSERT INTO ELEMENT_LABEL VALUES(67,29);
+INSERT INTO ELEMENT_LABEL VALUES(67,23);
+INSERT INTO ELEMENT_LABEL VALUES(67,57);
+INSERT INTO ELEMENT_LABEL VALUES(68,48);
+INSERT INTO ELEMENT_LABEL VALUES(68,64);
+INSERT INTO ELEMENT_LABEL VALUES(68,57);
+INSERT INTO ELEMENT_LABEL VALUES(68,24);
+INSERT INTO ELEMENT_LABEL VALUES(68,23);
+INSERT INTO ELEMENT_LABEL VALUES(69,57);
+INSERT INTO ELEMENT_LABEL VALUES(69,58);
+INSERT INTO ELEMENT_LABEL VALUES(69,39);
+INSERT INTO ELEMENT_LABEL VALUES(69,37);
+INSERT INTO ELEMENT_LABEL VALUES(70,57);
+INSERT INTO ELEMENT_LABEL VALUES(70,58);
+INSERT INTO ELEMENT_LABEL VALUES(70,39);
+INSERT INTO ELEMENT_LABEL VALUES(70,37);
+INSERT INTO ELEMENT_LABEL VALUES(70,60);
+INSERT INTO ELEMENT_LABEL VALUES(70,59);
+INSERT INTO ELEMENT_LABEL VALUES(70,49);
+INSERT INTO ELEMENT_LABEL VALUES(70,23);
+INSERT INTO ELEMENT_LABEL VALUES(71,57);
+INSERT INTO ELEMENT_LABEL VALUES(71,58);
+INSERT INTO ELEMENT_LABEL VALUES(71,39);
+INSERT INTO ELEMENT_LABEL VALUES(71,37);
+INSERT INTO ELEMENT_LABEL VALUES(72,65);
+INSERT INTO ELEMENT_LABEL VALUES(72,24);
+INSERT INTO ELEMENT_LABEL VALUES(72,23);
+INSERT INTO ELEMENT_LABEL VALUES(72,56);
+INSERT INTO ELEMENT_LABEL VALUES(72,27);
+INSERT INTO ELEMENT_LABEL VALUES(73,56);
+INSERT INTO ELEMENT_LABEL VALUES(73,26);
+INSERT INTO ELEMENT_LABEL VALUES(73,24);
+INSERT INTO ELEMENT_LABEL VALUES(73,23);
+INSERT INTO ELEMENT_LABEL VALUES(73,27);
+COMMIT;
diff --git a/test/instance/data_voiture.sql b/test/instance/data_voiture.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a9c5bf45c62156843063219d3f4c505593317bfc
--- /dev/null
+++ b/test/instance/data_voiture.sql
@@ -0,0 +1,39 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+INSERT INTO ELEMENT VALUES(1,'renault, rouge, 2000');
+INSERT INTO ELEMENT VALUES(2,'renault, bleu, 2000');
+INSERT INTO ELEMENT VALUES(3,'renault, 2000');
+INSERT INTO ELEMENT VALUES(4,'peugeot, 2000');
+INSERT INTO LABEL VALUES(1,'annee',NULL);
+INSERT INTO LABEL VALUES(2,'2000',1);
+INSERT INTO LABEL VALUES(3,'2017',1);
+INSERT INTO LABEL VALUES(4,'marque',NULL);
+INSERT INTO LABEL VALUES(5,'renault',4);
+INSERT INTO LABEL VALUES(6,'peugeot',4);
+INSERT INTO LABEL VALUES(7,'couleur',NULL);
+INSERT INTO LABEL VALUES(8,'rouge',7);
+INSERT INTO LABEL VALUES(9,'bleu',7);
+INSERT INTO ALIAS VALUES('millesime',1);
+INSERT INTO ALIAS VALUES('le nouveau millenaire',2);
+INSERT INTO ALIAS VALUES('y a pas longtemps',3);
+INSERT INTO ELEMENT_LABEL VALUES(1,1);
+INSERT INTO ELEMENT_LABEL VALUES(1,2);
+INSERT INTO ELEMENT_LABEL VALUES(1,4);
+INSERT INTO ELEMENT_LABEL VALUES(1,5);
+INSERT INTO ELEMENT_LABEL VALUES(1,7);
+INSERT INTO ELEMENT_LABEL VALUES(1,8);
+INSERT INTO ELEMENT_LABEL VALUES(2,1);
+INSERT INTO ELEMENT_LABEL VALUES(2,2);
+INSERT INTO ELEMENT_LABEL VALUES(2,4);
+INSERT INTO ELEMENT_LABEL VALUES(2,5);
+INSERT INTO ELEMENT_LABEL VALUES(2,7);
+INSERT INTO ELEMENT_LABEL VALUES(2,9);
+INSERT INTO ELEMENT_LABEL VALUES(3,1);
+INSERT INTO ELEMENT_LABEL VALUES(3,2);
+INSERT INTO ELEMENT_LABEL VALUES(3,4);
+INSERT INTO ELEMENT_LABEL VALUES(3,5);
+INSERT INTO ELEMENT_LABEL VALUES(4,1);
+INSERT INTO ELEMENT_LABEL VALUES(4,2);
+INSERT INTO ELEMENT_LABEL VALUES(4,4);
+INSERT INTO ELEMENT_LABEL VALUES(4,6);
+COMMIT;
diff --git a/test/instance/init_db.sh b/test/instance/init_db.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/tests_fonctionnels.side b/test/tests_fonctionnels.side
deleted file mode 100644
index 402fb8f0a6d4882895a8f2987b49e7eaee8ff0ea..0000000000000000000000000000000000000000
--- a/test/tests_fonctionnels.side
+++ /dev/null
@@ -1,594 +0,0 @@
-{
-  "id": "cab8cc0b-f348-41ac-bbed-9a731c79a927",
-  "version": "1.1",
-  "name": "Basic test",
-  "url": "http://127.0.0.1:5000",
-  "tests": [{
-    "id": "7a6d295e-40e4-4b0c-ab05-b85e2c73a036",
-    "name": "Basic Beginning",
-    "commands": [{
-      "id": "70a3f808-b3ae-4968-b7fe-f81b19a43efd",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "11d698b5-0879-45e3-be2d-d1a805498eb5",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nProgrammation"
-    }, {
-      "id": "605be377-7cb9-4df2-b19f-ab69a1c8318e",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "a\\nb\\nc\\nd\\ne"
-    }]
-  }, {
-    "id": "c9ad6c20-93c5-462e-acf9-e80cb68b8c0d",
-    "name": "basic selection 1",
-    "commands": [{
-      "id": "b7da810c-a0c6-45e5-a265-89ef50baf833",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "fc638d8c-2697-4bc5-a073-c2346769abba",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "16256aaa-168b-46d6-831e-9206c3a0f563",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nDebian\\nProgrammation\\nUbuntu"
-    }, {
-      "id": "ae28c905-05a8-4768-aaa3-2716edd06475",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "a\\nd\\ne"
-    }]
-  }, {
-    "id": "2edb88b9-2291-4869-8db7-afcdcdd07a95",
-    "name": "basic selection 2",
-    "commands": [{
-      "id": "de95dcbf-d564-4ac5-9c68-15e05bc7bdbc",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "c2deed1c-1dd1-4e92-9d71-7c749475e17b",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "f4b6e287-121e-457c-bb4a-c553856759bb",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Programmation\\nC++\\nExploitation\\nPython"
-    }, {
-      "id": "9cbe3813-a8cd-43db-92f8-5a5b87a199a6",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "a\\nb\\nc\\nd"
-    }]
-  }, {
-    "id": "204fb145-6c18-4a3a-9b78-16124d1a4552",
-    "name": "double selection 1",
-    "commands": [{
-      "id": "02c2e369-d95d-4c86-a623-df8524395611",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "e41493ab-5bf6-456f-9323-65a2a71a7cf5",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "7f95fd4f-d57d-4f02-941b-1e1dba7538c4",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[4]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[4]/img", "xpath:idRelative"],
-        ["//span[4]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "a0bdbc11-8eb8-49f9-8d14-adbda4753ea3",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Programmation\\nPython\\nExploitation"
-    }, {
-      "id": "9617f932-e4c3-43a6-bab5-9c22df76e0d0",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "b\\nd"
-    }]
-  }, {
-    "id": "116f6cd5-ce67-455c-816f-b0ae156bf1be",
-    "name": "double selection 2",
-    "commands": [{
-      "id": "ea574b25-0aab-4a69-b582-289fc08bbfb9",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "8727d0d6-3d89-424d-ad22-20ecf3554da2",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "fbaae009-9b76-46fc-a7bc-f7cca7d09b53",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[4]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[4]/img", "xpath:idRelative"],
-        ["//span[4]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "6015af76-f520-41c4-9890-3da1a46ab802",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nUbuntu"
-    }, {
-      "id": "bbc05d79-e065-414a-aaf4-061122ffaec0",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "e"
-    }]
-  }, {
-    "id": "2dbf5c16-a2d5-4ceb-af3e-e734a61f59a6",
-    "name": "triple selection 1",
-    "commands": [{
-      "id": "097ab659-9fdc-432c-87b4-4f408e7cedb9",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "de7d926b-df97-4843-9e09-ae59cb018d1c",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "1ea36b8b-a2c3-40aa-8e69-deb8f753a09a",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "7194c4a2-23f6-4ac7-9d9a-483a9f42a6ea",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[3]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[3]/img", "xpath:idRelative"],
-        ["//span[3]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "a24bafbd-a09c-4016-8e79-9cf5c87fcbfe",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nDebian\\nPython"
-    }, {
-      "id": "b6138ab7-ee50-4053-bac8-cd06a6e3d32a",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "d"
-    }]
-  }, {
-    "id": "46f43834-f4fb-4cdb-81a2-3292efecda3e",
-    "name": "Unselect 1",
-    "commands": [{
-      "id": "ba6d3dd7-e2d9-4951-8116-889c0baaf9d9",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "d7bae272-b587-48eb-8e7a-0297bc89c5a1",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "23d6ea2c-f12f-4c13-8b2a-5e1783aea73c",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[3]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[3]/img", "xpath:idRelative"],
-        ["//span[3]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "2e1318ef-f82e-42a8-b476-0e50197b85f8",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "f38b59ac-1084-4448-8fc3-bc7cd8a5fe4b",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nDebian\\nProgrammation\\nUbuntu"
-    }, {
-      "id": "822728fa-847d-4228-97e0-5a503c465c87",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "a\\nd\\ne"
-    }]
-  }, {
-    "id": "c4697b95-b3c9-4efb-b940-4d5b870bcd8f",
-    "name": "Unselect 2",
-    "commands": [{
-      "id": "98426884-fa9f-4fd1-9cc5-96b3265935f7",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "9241849e-c22d-465c-80bb-58f8c8ca67e2",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "36cc0be2-9817-4aae-81da-ddfa968dae18",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[4]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[4]/img", "xpath:idRelative"],
-        ["//span[4]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "39a55fca-8636-4cdb-ace4-a3792d2d5c42",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "35f2f54f-a657-4ac5-b2e7-8540914cd4a1",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Python\\nExploitation"
-    }, {
-      "id": "f94b2dd1-8688-4c4b-a2da-12c6e1a9090e",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "b\\nd"
-    }]
-  }, {
-    "id": "b248cf71-7d0d-4b91-b5aa-5f9b0c2084b1",
-    "name": "Not include 1",
-    "commands": [{
-      "id": "dd1d72d2-7e67-498e-b28d-c7dfe004e132",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "f6c7821e-8d28-4286-b925-0916fcac5a86",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "39c27d5d-87de-422c-ae19-0c71140c7fd0",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[3]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[3]/img[2]", "xpath:idRelative"],
-        ["//span[3]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "e8bf962d-e739-4721-80d2-549fe299f727",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nProgrammation"
-    }, {
-      "id": "0d7dc55a-80c8-41a3-9adb-d45ace1b6102",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "e"
-    }]
-  }, {
-    "id": "a7336905-e612-4dd1-9990-48210d9b53a2",
-    "name": "Not include 2",
-    "commands": [{
-      "id": "3db8279a-b9cf-4fde-9f07-d10dd895be11",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "cb9a3f92-b721-4d4b-b2a8-c8f6c168d9d6",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "643374b8-dfc0-492a-8a69-b467228cd00f",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img[2]", "xpath:idRelative"],
-        ["//span[2]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "91c01fbb-bc36-44ed-ac70-da675f1cf991",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[4]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[4]/img[2]", "xpath:idRelative"],
-        ["//span[4]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "6b3c99d5-0d61-4fbb-9dc7-f21bab2abf7e",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Programmation\\nC++\\nPython"
-    }, {
-      "id": "963acbce-7db0-4d08-aafb-9426f40d62f1",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "a"
-    }]
-  }, {
-    "id": "a0a0c8fc-06fa-449d-91c5-75e479d5bb83",
-    "name": "Not include 3 (del 1 cross)",
-    "commands": [{
-      "id": "ae7288e4-38d3-46d0-9ce4-cde823f5773e",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "e5371662-15f3-427e-8140-bb15e7d7384a",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img", "xpath:idRelative"],
-        ["//span[2]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "0a5f8b25-3b91-4627-8067-da41736e0883",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img[2]", "xpath:idRelative"],
-        ["//span[2]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "cf81456a-d960-48f9-9c27-10570e41e9c8",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[4]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[4]/img[2]", "xpath:idRelative"],
-        ["//span[4]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "3d52cd02-7411-4f78-859b-56f147c0e13b",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[2]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[2]/img[2]", "xpath:idRelative"],
-        ["//span[2]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "c64fc16e-19dd-4fc5-afab-cbf077c42acd",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Programmation\\nPython\\nC++\\nExploitation"
-    }, {
-      "id": "308cae3e-1fd5-4791-bff9-e44da1c4bca7",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "a\\nc"
-    }]
-  }, {
-    "id": "b2fc81d6-3226-4b26-87cf-b7cecdf5d339",
-    "name": "Not include 4",
-    "commands": [{
-      "id": "85078fbb-77e9-4896-b1b6-cfe8c1e99065",
-      "comment": "",
-      "command": "open",
-      "target": "/",
-      "targets": [],
-      "value": ""
-    }, {
-      "id": "2468750a-d8de-4ddf-a77f-cc3673f40903",
-      "comment": "",
-      "command": "clickAt",
-      "target": "css=img",
-      "targets": [
-        ["css=img", "css"],
-        ["//div[@id='hierarchy']/span/img", "xpath:idRelative"],
-        ["//img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "bd04d999-018c-462a-95c7-32c41809f155",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[4]/img[2]",
-      "targets": [
-        ["//div[@id='hierarchy']/span[4]/img[2]", "xpath:idRelative"],
-        ["//span[4]/img[2]", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "758d8b41-814c-4190-b400-95f0318244c0",
-      "comment": "",
-      "command": "clickAt",
-      "target": "//div[@id='hierarchy']/span[3]/img",
-      "targets": [
-        ["//div[@id='hierarchy']/span[3]/img", "xpath:idRelative"],
-        ["//span[3]/img", "xpath:position"]
-      ],
-      "value": ""
-    }, {
-      "id": "f654ffd3-fd8d-4d9d-8871-f16b518dc312",
-      "comment": "Hierarchy",
-      "command": "verifyText",
-      "target": "id=hierarchy",
-      "targets": [],
-      "value": "Exploitation\\nPython\\nUbuntu"
-    }, {
-      "id": "42f35e6f-e167-45f3-9da0-790faff2718e",
-      "comment": "Result",
-      "command": "verifyText",
-      "target": "id=result",
-      "targets": [],
-      "value": "d"
-    }]
-  }],
-  "suites": [{
-    "id": "1d4907f0-e107-4b24-8a75-f7e9d5eee65d",
-    "name": "/browse",
-    "persistSession": false,
-    "parallel": false,
-    "timeout": 300,
-    "tests": ["7a6d295e-40e4-4b0c-ab05-b85e2c73a036", "c9ad6c20-93c5-462e-acf9-e80cb68b8c0d", "2edb88b9-2291-4869-8db7-afcdcdd07a95", "204fb145-6c18-4a3a-9b78-16124d1a4552", "116f6cd5-ce67-455c-816f-b0ae156bf1be", "b248cf71-7d0d-4b91-b5aa-5f9b0c2084b1", "a7336905-e612-4dd1-9990-48210d9b53a2", "a0a0c8fc-06fa-449d-91c5-75e479d5bb83", "b2fc81d6-3226-4b26-87cf-b7cecdf5d339", "46f43834-f4fb-4cdb-81a2-3292efecda3e", "c4697b95-b3c9-4efb-b940-4d5b870bcd8f", "2dbf5c16-a2d5-4ceb-af3e-e734a61f59a6"]
-  }],
-  "urls": ["http://nightwatchjs.org/", "http://127.0.0.1:5000/", "https://gitlab.in2p3.fr/", "https://www.google.com/"],
-  "plugins": []
-}
\ No newline at end of file