{"id":240,"date":"2022-01-02T17:04:48","date_gmt":"2022-01-02T16:04:48","guid":{"rendered":"https:\/\/www.terranautes.org\/?page_id=240"},"modified":"2022-06-06T16:53:27","modified_gmt":"2022-06-06T14:53:27","slug":"pestilens-pesticides-loupe","status":"publish","type":"page","link":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/","title":{"rendered":"PestiLens, les phytosanitaires \u00e0 la loupe"},"content":{"rendered":"\n<p>Bienvenue sur PestiLens, l&rsquo;outil de visualisation de la toxicit\u00e9 des pesticides. Une description de PestiLens, ses objectifs, sources de donn\u00e9es et m\u00e9thode est <a href=\"https:\/\/www.terranautes.org\/index.php\/2022\/01\/09\/pestilens-1-objectifs-donnees\/\" target=\"_blank\" rel=\"noreferrer noopener\">disponible ici<\/a>.<\/p>\n\n\n\n<link rel=\"stylesheet\" id=\"site-css\" href=\"\/wp-content\/pestilens\/css\/site.css\" media=\"all\">\n    <link rel=\"stylesheet\" href=\"\/wp-content\/pestilens\/css\/bootstrap4.min.css\" integrity=\"sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW\/dAiS6JXm\" crossorigin=\"anonymous\">\n   <link rel=\"stylesheet\" id=\"bootstrap-table\" href=\"\/wp-content\/pestilens\/css\/bootstrap-table.min.css\" media=\"all\">\n    <link rel=\"stylesheet\" id=\"wp-block-library-css\" href=\"https:\/\/www.terranautes.org\/wp-includes\/css\/dist\/block-library\/style.min.css?ver=5.8\" media=\"all\">\n    <link rel=\"stylesheet\" id=\"parent-style-css\" href=\"https:\/\/www.terranautes.org\/wp-content\/themes\/twentysixteen\/style.css?ver=5.8\" media=\"all\">\n    <link rel=\"stylesheet\" id=\"twentysixteen-fonts-css\" href=\"https:\/\/fonts.googleapis.com\/css?family=Merriweather%3A400%2C700%2C900%2C400italic%2C700italic%2C900italic%7CMontserrat%3A400%2C700%7CInconsolata%3A400&amp;subset=latin%2Clatin-ext&amp;display=fallback\" media=\"all\">\n    \n\n    <script src=\"\/wp-content\/pestilens\/js\/vue.js\"><\/script>\n    <script src=\"\/wp-content\/pestilens\/js\/papaparse.js\"><\/script>\n    <script src=\"\/wp-content\/pestilens\/js\/jquery-3.6.0.min.js\"><\/script>\n    <script src=\"\/wp-content\/pestilens\/js\/chart.min.js\"><\/script>\n    <script src=\"\/wp-content\/pestilens\/js\/popper.min.js\" integrity=\"sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K\/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q\" crossorigin=\"anonymous\"><\/script>\n    <script src=\"\/wp-content\/pestilens\/js\/bootstrap4.min.js\" integrity=\"sha384-JZR6Spejh4U02d8jOt6vLEHfe\/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl\" crossorigin=\"anonymous\"><\/script>\n<script src=\"\/wp-content\/pestilens\/js\/sortable.js\"><\/script>\n\n\n\n<style>\n        body {\n            font-size: 1em;\n        }\n\n        .myFilters {\n            font-size: 0.9em;\n            line-height: 1.1em;\n        }\n\n        .tooltip {\n            pointer-events: none;\n        }\n\n        .tooltip-inner {\n            max-width: 400px;\n        }\n\n        .smallNumber {\n            font-family: Roboto,\"Helvetica Neue\",Arial,sans-serif;\n            font-size: 12px;\n        }\n\n        .blended {\n            mix-blend-mode: multiply;\n        }\n\n        .borderless td, .borderless th, .borderless tr, .borderless thead, .borderless tbody, .borderless table {\n            border: none;\n            border-width: 0;\n        }\n\n        table.borderless {\n            border: none;\n            border-width: 0;\n            margin: 0;\n        }\n\n        img.myChart {\n            margin: 0px;\n            padding: 0px;\n            position: relative;\n            top: 4px;\n        }\n\n        tr.chartInTable {\n            padding: 10px 0px 0px 0px;\n            width: 218px;\n            height: 32px;\n            overflow-x: hidden;\n        }\n\n        table.tableFit {\n            width: auto !important;\n            table-layout: auto !important;\n            font-size: 0.85em;\n            line-height: 1em;\n        }\n\n        h5.perso {\n            font-size: 1.1rem;\n            margin-top: 2rem;\n            margin-bottom: 1rem;\n            margin-left: -2rem;\n        }\n\n        h6.perso {\n            font-size: 1.05rem;\n            margin-top: 1.5rem;\n            margin-bottom: 0.8rem;\n            margin-left: -1.5rem;\n        }\n\n        img.iconAgri {\n            width: 25px;\n            margin: 0px 1px 0px 5px;\n            mix-blend-mode: multiply;\n        }\n\n        img.iconAgri2 {\n            width: 25px;\n            margin: 0px 1px 0px 1px;\n            mix-blend-mode: multiply;\n        }\n\n        img.picto {\n            width: 32px;\n            margin: 0px 1px 0px 1px;\n            mix-blend-mode: multiply;\n        }\n\n        a.short {\n            width: 120px;\n            display: block;\n            white-space: nowrap;\n            text-overflow: ellipsis;\n            overflow: hidden;\n        }\n\n        .noWrap {\n            white-space: nowrap;\n        }\n\n        sup.note-sup {\n            margin-right: 2px;\n        }\n\n        span.cmrLetter {\n            margin-right: 2px;\n            font-weight: bold;\n        }\n\n        div.cursor {\n            line-height: 0px;\n            position: relative;\n            color: rgba(5, 5, 5, 0.9);\n            top: -22px;\n            display: none;\n        }\n\n        div.noaelText {\n            line-height: 0px;\n            position: relative;\n            color: rgba(5, 5, 5, 0.9);\n            top: -27px;\n            text-align: right;\n        }\n\n        div.resultTable {\n            width:810px;\n            background-color:white;\n        }\n\n        table thead th .both {\n            background-image: url(\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq\/QCM1oNiJidwox0355mXnG\/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC\");\n        }\n\n        table thead th .asc {\n            background-image: url(\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS\/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==\");\n        }\n\n        table thead th .desc {\n            background-image: url(\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA\/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= \");\n        }\n\n        table thead th .sortable {\n            cursor: pointer;\n            background-position: right;\n            background-repeat: no-repeat;\n            padding-right: 17px !important\n        }\n        .table-sm td, .table-sm th {\n            padding: 0.25rem;\n        }\n    <\/style>\n\n\n\n<div id=\"page\">\n            <div id=\"app\" class=\"container\">\n                <h5 class=\"perso\" style=\"margin-top: 1.5rem\">S\u00e9lection des pesticides et substances phytosanitaires<\/h5>\n                <div class=\"row\">\n                    <h6 class=\"col-12 perso\" style=\"margin-top: 1.5rem\">Par type de pesticides<\/h6>\n\n                    <div class=\"col-12 col-lg-4\">\n                        <div class=\"myFilters\">\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeInsecticide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeInsecticide\">\n                                <label for=\"typeInsecticide\">Insecticides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeFungicide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeFungicide\">\n                                <label for=\"typeFungicide\">Fongicides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeHerbicide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeHerbicide\">\n                                <label for=\"typeHerbicide\">Herbicides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeAcaricide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeAcaricide\">\n                                <label for=\"typeAcaricide\">Acaricides<\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"col-12 col-lg-4\">\n                        <div class=\"myFilters\">\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeGrowthReg\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeGrowthReg\">\n                                <label for=\"typeGrowthReg\">R\u00e9g. de croissance<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeBactericide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeBactericide\">\n                                <label for=\"typeBactericide\">Bact\u00e9ricides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeElicitor\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeElicitor\">\n                                <label for=\"typeElicitor\">Eliciteurs<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeRepellent\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeRepellent\">\n                                <label for=\"typeRepellent\">R\u00e9pulsifs<\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"col-12 col-lg-4\">\n                        <div class=\"myFilters\">\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeNematicide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeNematicide\">\n                                <label for=\"typeNematicide\">N\u00e9maticides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeAlgaecide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeAlgaecide\">\n                                <label for=\"typeAlgaecide\">Algicides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeMolluscicide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeMolluscicide\">\n                                <label for=\"typeMolluscicide\">Mollusquicides<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"typeRodenticide\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedTypeRodenticide\">\n                                <label for=\"typeRodenticide\">Rodenticides<\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"col-12 col-lg-8\">\n                        <h6 class=\"perso\" style=\"margin-top: 1.5rem\">Par domaine d&rsquo;autorisation<\/h6>\n                        <div class=\"myFilters\">\n                            <div>\n                                <input id=\"agriToutes\" type=\"checkbox\" v-model=\"isCheckedAgriAll\" :disabled=\"!isDataLoaded\">\n                                <label for=\"agriToutes\">Toutes substances autoris\u00e9es en France<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"agriConv\" type=\"checkbox\" v-model=\"isCheckedAgriConv\" :disabled=\"!isDataLoaded\">\n                                <label for=\"agriConv\">Substances autoris\u00e9es en agriculture dite conventionnelle<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"agriHVE\" type=\"checkbox\" v-model=\"isCheckedAgriHVE\" :disabled=\"!isDataLoaded\">\n                                <label for=\"agriHVE\"><img class=\"iconAgri\" :src=\"contentRoot + '\/images\/HVE_exploitation_ocre.png'\">Substances autoris\u00e9es en agriculture HVE<sup data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" class=\"note-sup\" data-original-title=\"Agriculture certifi\u00e9e Haute Valeur Environnementale.\"><a href=\"#note10\">10<\/a><\/sup><\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"agriAB\" type=\"checkbox\" v-model=\"isCheckedAgriAB\" :disabled=\"!isDataLoaded\">\n                                <label for=\"agriAB\"><img class=\"iconAgri\" :src=\"contentRoot + '\/images\/AB.svg'\"> Substances autoris\u00e9es en Agriculture Biologique (AB)<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"nonAgriAB\" type=\"checkbox\" v-model=\"isCheckedNonAgriAB\" :disabled=\"!isDataLoaded\">\n                                <label for=\"nonAgriAB\"><img class=\"iconAgri\" :src=\"contentRoot + '\/images\/NotAB.svg'\"> Substances autoris\u00e9es en France et interdites en AB<\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"col-6 col-lg-4\">\n                        <h6 class=\"perso\" style=\"margin-top: 1.5rem\">Par type de toxicit\u00e9 \u00e0 effets diff\u00e9r\u00e9s (<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Canc%C3%A9rog%C3%A8ne,_mutag%C3%A8ne_et_reprotoxique\" target=\"_blank\" rel=\"noopener\">CMR<\/a>)<\/h6>\n                        <div class=\"myFilters\">\n                            <div>\n                                <input id=\"cmrAll\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedCmrAll\">\n                                <label for=\"cmrAll\">Toutes toxicit\u00e9s<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"cmrCancer\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedCmrCancer\">\n                                <label for=\"cmrCancer\">Substances canc\u00e9rog\u00e8nes<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"cmrMuta\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedCmrMuta\">\n                                <label for=\"cmrMuta\">Substances mutag\u00e8nes<\/label>\n                            <\/div>\n                            <div class=\"packedLines ml-2\">\n                                <input id=\"cmrRepro\" type=\"checkbox\" :disabled=\"!isDataLoaded\" v-model=\"isCheckedCmrRepro\">\n                                <label for=\"cmrRepro\">Substances reprotoxiques<\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <div v-if=\"!isDataLoaded\" class=\"row\">Chargement des donn\u00e9es Agritox&#8230;  <span><img :src=\"contentRoot + '\/images\/throbber120.gif'\" width=\"24\"><\/span><\/div>\n                <h5 class=\"perso\">Substances s\u00e9lectionn\u00e9es en bref<\/h5>\n                <div v-if=\"isDataLoaded\" class=\"row\">\n\n                    <div class=\"col-12 col-lg-6\">\n                        <div><b>{{selected.length}}<\/b> substances s\u00e9lectionn\u00e9es, dont :<\/div>\n                        <ul>\n                            <li> <b>{{cancerCount}}<\/b> canc\u00e9rog\u00e8ne(s)<\/li>\n                            <li> <b>{{mutaCount}}<\/b> mutag\u00e8ne(s)<\/li>\n                            <li> <b>{{reproCount}}<\/b> reprotoxique(s)<\/li>\n                        <\/ul>\n                    <\/div>\n                    <div class=\"col-12 col-lg-6\" id=\"distributionChartDiv\">\n                        <canvas id=\"distributionChart\" width=\"400\" height=\"200\"><\/canvas>\n                        <div v-if=\"lecture != null\" class=\"small\">Exemple de lecture : {{lecture.pourcent}}% des substances s\u00e9lectionn\u00e9es ont une toxicit\u00e9 {{lecture.forteOuFaible}}, c&rsquo;est-\u00e0-dire avec des doses sans effets (NOAEL) {{lecture.supOuInf}} \u00e0 {{lecture.limite}}.<\/div>\n                    <\/div>\n\n                <\/div>\n                <h5 class=\"perso\">Liste des substances s\u00e9lectionn\u00e9es<\/h5>\n                <div v-if=\"isDataLoaded\" class=\"row d-block resultTable\" id=\"resultTable\">\n                    <div v-if=\"selected.length == 0\">(s\u00e9lection vide)<\/div>\n                    <div v-else=\"\">\n                        <div class=\"text-right small\"><a href=\"#\" onclick=\"exportToCsv()\">Exporter au format CSV<\/a><\/div>\n                        <table class=\"table-sm table-striped tableFit\">\n                            <thead>\n                                <tr>\n                                    <th><col-sorter title=\"Nom\" :sort-handler=\"sortNames\"><\/col-sorter><\/th>\n                                    <th class=\"noWrap\">Labels<\/th>\n                                    <th class=\"noWrap\"><col-sorter title=\"CMR\" :sort-handler=\"sortCMR\"><\/col-sorter><\/th>\n                                    <th class=\"text-center\" width=\"218px\"><col-sorter title=\"NOAEL (mg\/kg p.c.\/j)\" :sort-handler=\"sortNoael\"><\/col-sorter><\/th>\n                                    <th><col-sorter title=\"Etiquetage r\u00e9glementaire\" :sort-handler=\"sortPictos\"><\/col-sorter><\/th>\n                                <\/tr>\n                            <\/thead>\n                            <tbody>\n                                <tr v-for=\"substance in selected\" :data-substance.prop=\"{ substance }\">\n                                    <td>\n                                        {{substance.nom}}\n                                        <template v-for=\"note in substance.notes\">\n                                            <sup data-toggle=\"tooltip\" data-placement=\"top\" :title=\"note.text\" class=\"note-sup\"><a :href=\"'#note' + note.index\">{{note.index}}<\/a><\/sup>\n                                        <\/template>\n                                        <template v-if=\"substance.sourceNoael\">\n                                            <sup data-toggle=\"tooltip\" data-placement=\"top\" :title=\"substance.sourceNoael\" class=\"note-sup\"><a :href=\"substance.sourceNoael\" :target=\"workaroundBlank\">r\u00e9f.<\/a><\/sup>\n                                        <\/template>\n                                    <\/td>\n                                    <td class=\"noWrap\">\n                                        <img class=\"iconAgri2\" :src=\"contentRoot + '\/images\/HVE_exploitation_ocre.jpg'\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Certification nationale HVE (Haute Valeur Environnementale)\">\n                                        <img v-if=\"substance.isAgriBio\" class=\"iconAgri2\" :src=\"contentRoot + '\/images\/AB.svg'\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Certification nationale et europ\u00e9enne AB (Agriculture Biologique)\">\n                                    <\/td>\n                                    <td class=\"noWrap\">\n                                        <span class=\"cmrLetter\" v-if=\"substance.isCancerig\u00e8ne\" data-toggle=\"tooltip\" data-placement=\"top\" :title=\"substance.classCanc\u00e9rig\u00e8neHtmlTooltip\" data-html=\"true\">C<\/span>\n                                        <span class=\"cmrLetter\" v-if=\"substance.isMutag\u00e8ne\" data-toggle=\"tooltip\" data-placement=\"top\" :title=\"substance.classMutag\u00e8neHtmlTooltip\" data-html=\"true\">M<\/span>\n                                        <span class=\"cmrLetter\" v-if=\"substance.isReprotoxique\" data-toggle=\"tooltip\" data-placement=\"top\" :title=\"substance.classReprotoxiqueHtmlTooltip\" data-html=\"true\">R<\/span>\n                                    <\/td>\n                                    <td style=\"padding: 0px;\">\n                                        <div v-if=\"substance.noNoael\" class=\"text-center\">NOAEL inconnue.<\/div>\n                                        <div v-else=\"\" class=\"chartInTable\" :data-value=\"substance.noael.valeur\">\n                                            <img :src=\"contentRoot + '\/images\/toxscale4.png'\" width=\"218\" class=\"blended myChart\">\n                                            <div id=\"cursor\" class=\"cursor\">\u25bc<\/div>\n                                            <div id=\"text\" class=\"smallNumber font-weight-bold noaelText\"><\/div>\n                                        <\/div>\n                                    <\/td>\n                                    <td>\n                                        <template v-for=\"pictoData in substance.pictoData\">\n                                            <img class=\"picto\" :src=\"contentRoot + '\/images\/pictos\/SGH0' + pictoData.pictoIndex + '.jpg'\" data-html=\"true\" data-toggle=\"tooltip\" data-placement=\"top\" :title=\"pictoData.tooltipHtml\">\n                                        <\/template>\n                                    <\/td>\n                                <\/tr>\n                            <\/tbody>\n                        <\/table>\n                    <\/div>\n\n                <\/div>\n                <h5 class=\"perso\">Notes<\/h5>\n                <a v-for=\"note in notes\" :name=\"'note' + note.index\">\n                    <div><b>{{note.index}}.<\/b> {{note.text}}<\/div>\n                <\/a>\n            <\/div>\n        <\/div>\n\n\n\n<script>\n        var contentRoot = \"\/wp-content\/pestilens\"\n      \n        $(function () {\n            $('[data-toggle=\"tooltip\"]').tooltip({\n                delay: {\n                    show: 5,\n                    hide: 0\n                }\n            })\n        })\n\n        class Substance {\n            cas;\n            nom;\n            nomUipac;\n            numEC;\n            masseMolaire;\n            formuleBrute;\n            pureteMinimale;\n            impuretesPertinentes;\n            classements;\n            ecotoxicites;\n        }\n\n        \/\/ 'at' for agritox\n        let atIdentit\u00e9s = null\n        let atIdMap = new Map();\n        let atClassements = null\n        let atEcotox = null\n        let atVtr = null\n        let compl\u00e9ments = null;\n        let compl\u00e9mentsBio = null;\n        let jsonDump = null;\n        let pictoMap = null;\n        let casTypes = null\n\n        let constantes = {\n            noaelFood: 1000,\n            noaelUnit\u00e9: \"mg\/kg\/p.c.\/j\",\n            maxX: 1000,\n            minX: 0.1,\n            imgToxicityScaleWidth: 218,\n            imgToxicityScaleWidth_Small: 200\n        }\n\n\n        let headerMap = {};\n        let headerMapVtr = {};\n\n        let pesticideTypeDisplayMap = {\n            \"fungicide\": \"fongicide\",\n            \"molluscicide\": \"mollusquicide\",\n            \"herbicide\": \"herbicide\",\n            \"insecticide\": \"insecticide\",\n            \"plant growth regulator\": \"r\u00e9gulateur de croissance\",\n            \"growth reg.\": \"r\u00e9gulateur de croissance\",\n            \"acaricide\": \"acaricide\",\n            \"bactericide\": \"bact\u00e9ricide\",\n            \"miticide\": \"acaricide\",\n            \"adjuvant\": \"adjuvant\",\n            \"other substance\": \"autre type de substance\",\n            \"safener\": \"autre type de substance\",\n            \"veterinary substance\": \"autre type de substance\",\n            \"repellent\": \"r\u00e9pulsif\",\n            \"rodenticide\": \"rodenticide\",\n            \"fumigant\": \"fumigant\",\n            \"nematicide\": \"n\u00e9maticide\",\n            \"plant activator\": \"\u00e9liciteur\",\n            \"elicitor\": \"\u00e9liciteur\",\n            \"algaecide\": \"algicide\"\n        };\n\n        var PesticideTypeFlags = {\n            Insecticide: 1,\n            Fungicide: 2,\n            Herbicide: 4,\n            Acaricide: 8,\n            GrowthReg: 16,\n            Bactericide: 32,\n            Elicitor: 64,\n            Repellent: 128,\n            Nematicide: 512,\n            Algaecide: 1024,\n            Molluscicide: 2048,\n            Rodenticide: 4096,\n            Other: 8192\n        };\n\n        let pesticideTypeInternalMap = {\n            \"fungicide\": \"Fungicide\",\n            \"molluscicide\": \"Molluscicide\",\n            \"herbicide\": \"Herbicide\",\n            \"insecticide\": \"Insecticide\",\n            \"plant growth regulator\": \"GrowthReg\",\n            \"growth reg.\": \"GrowthReg\",\n            \"acaricide\": \"Acaricide\",\n            \"bactericide\": \"Bactericide\",\n            \"miticide\": \"Acaricide\",\n            \"adjuvant\": \"Other\",\n            \"other substance\": \"Other\",\n            \"safener\": \"Other\",\n            \"veterinary substance\": \"Other\",\n            \"repellent\": \"Repellent\",\n            \"rodenticide\": \"Rodenticide\",\n            \"fumigant\": \"Other\",\n            \"nematicide\": \"Nematicide\",\n            \"plant activator\": \"Elicitor\",\n            \"elicitor\": \"Elicitor\",\n            \"algaecide\": \"Algaecide\"\n        };\n\n        function initHeaderMap() {\n            headerMap[\"N\u00b0 CAS\"] = \"cas\";\n            headerMap[\"cas\"] = \"cas\";\n            headerMap[\"Num\u00e9ro CAS\"] = \"cas\";\n            headerMap[\"NOM SA\"] = \"nom\";\n            headerMap[\"Nom SA\"] = \"nom\";\n            headerMap[\"NOM\"] = \"nom\";\n            headerMap[\"NomAnglais\"] = \"nomAnglais\";\n            headerMap[\"ECHA Link\"] = \"echaLink\";\n            headerMap[\"NOM UIPAC\"] = \"nomUipac\";\n            headerMap[\"N\u00b0 EC\"] = \"numEC\";\n            headerMap[\"MASSE MOLAIRE (g\/mol)\"] = \"masseMolaire\";\n            headerMap[\"FORMULE BRUTE\"] = \"formuleBrute\";\n            headerMap[\"PURET\u00c9 MINIMALE\"] = \"pureteMinimale\";\n            headerMap[\"IMPURET\u00c9(S) PERTINENTE(S)\"] = \"impuretesPertinentes\";\n            headerMap[\"Dans Agritox ?\"] = \"isAgritox\";\n            headerMap[\"Pulv\u00e9 ou semences ?\"] = \"isSprayed\";\n            headerMap[\"Aliment ?\"] = \"isFood\";\n            headerMap[\"NOAEL\"] = \"vtrNoaelExt\";\n            headerMap[\"NOAEL Source\"] = \"vtrNoaelExtSource\";\n            headerMap[\"types\"] = \"typesRaw\";\n            headerMap[\"typeSource\"] = \"typeSource\";\n\n\n            headerMap[\"CLASSEMENT R\u00c9F\u00c9RENCE\"] = \"classReference\";\n            headerMap[\"CLASSEMENT DATE\"] = \"classDate\";\n            headerMap[\"CLASSEMENT CAT\u00c9GORIE DANGER\"] = \"classCategorieDanger\";\n            headerMap[\"CLASSEMENT CODE H\"] = \"classCodeH\";\n            headerMap[\"CLASSEMENT MENTION DANGER\"] = \"classMentionDanger\";\n            headerMap[\"FACTEUR M VALEUR\"] = \"classFacteurMValeur\";\n            headerMap[\"FACTEUR M ORIGINE\"] = \"classFacteurMOrigine\";\n            headerMap[\"FACTEUR M DATE\"] = \"classFacteurMDate\";\n\n            \/\/ La Concentration sans Effet Pr\u00e9visible (PNEC, Predicted Non Effect Concentration en anglais) est\n            \/\/ la valeur toxique de r\u00e9f\u00e9rence utilis\u00e9e pour \u00e9valuer les risques pour les organismes aquatiques.\n            headerMap[\"Valeur PNEC\"] = \"ecotoxPnec\";\n            headerMap[\"Unit\u00e9\"] = \"ecotoxUnite\";\n            headerMap[\"Etude(s)\"] = \"ecotoxEtudes\";\n            headerMap[\"Donn\u00e9e de toxicit\u00e9\"] = \"ecotoxDonnee\";\n            headerMap[\"Valeur donn\u00e9e de toxicit\u00e9\"] = \"ecotoxDonneeValeur\";\n            headerMap[\"Unit\u00e9 donn\u00e9e de toxicit\u00e9\"] = \"ecotoxDonneeUnite\";\n            headerMap[\"Facteur de s\u00e9curit\u00e9\"] = \"ecotoxFacteurSecurite\";\n\n            \/\/ Valeur toxicologiques de r\u00e9f\u00e9rence.\n            headerMapVtr[\"Num\u00e9ro CAS\"] = \"cas\";\n            headerMapVtr[\"Nom SA\"] = \"Nom\";\n            headerMapVtr[\"Source\"] = \"vtrSource\";\n            headerMapVtr[\"Date\"] = \"vtrDate\";\n            headerMapVtr[\"Nom\"] = \"vtrNom\";\n            headerMapVtr[\"valeur\"] = \"vtrValeur\";\n            headerMapVtr[\"Unite\"] = \"vtrUnite\";\n            headerMapVtr[\"Etude(s) pivot(s) 1\"] = \"vtrEtude1\";\n            headerMapVtr[\"NOAEL de l'\u00e9tude pivot 1\"] = \"vtrNoael1\";\n            headerMapVtr[\"Unit\u00e9 NOAEL \u00e9tude pivot 1\"] = \"vtrUniteNoael1\";\n            headerMapVtr[\"Etude(s) pivot(s) 2\"] = \"vtrEtude2\";\n            headerMapVtr[\"Facteur de s\u00e9curit\u00e9\"] = \"vtrFacteur\";\n            headerMapVtr[\"F.correction(abs.orale lim.)\"] = \"vtrFacteurCorrection\";\n            headerMapVtr[\"F.correction (abs. orale lim.)\"] = \"vtrFacteurCorrection\";\n\n        }\n\n        initHeaderMap();\n\n        var notes = {\n            substInAgritox: {\n                index: 1,\n                text: \"Substance pr\u00e9sente dans la base Agritox.\"\n            },\n            substNotInAgritox: {\n                index: 2,\n                text: \"Substance absente de la base Agritox.\"\n            },\n            noaelInAgritox: {\n                index: 3,\n                text: \"NOAEL pr\u00e9sente dans la base Agritox.\"\n            },\n            noaelNotInAgritox: {\n                index: 4,\n                text: \"NOAEL absente de la base Agritox.\"\n            },\n            noaelFoundInScientificPublications: {\n                index: 5,\n                text: \"NOAEL extraite de la litt\u00e9rature scientifique ou r\u00e9glementaire par les auteurs. Cf. r\u00e9f.\"\n            },\n            unknownNoael: {\n                index: 6,\n                text: \"NOAEL inconnue.\"\n            },\n            noaelInferredFromEdibility: {\n                index: 7,\n                text: \"Substance pr\u00e9sente dans l'alimentation humaine; NOAEL arbitrairement assign\u00e9e \u00e0 1000.\"\n            },\n            onlyTrapsNoSpray: {\n                index: 8,\n                text: \"Substance non appliqu\u00e9e sur les plantes (pi\u00e8ges, r\u00e9pulsifs, etc.)\"\n            },\n            substAgriBio: {\n                index: 9,\n                text: \"Substance autoris\u00e9e en agrigulture biologique, list\u00e9e \u00e0 l'annexe I du r\u00e8glement europ\u00e9en C\/2021\/5149.\"\n            },\n            hve: {\n                index: 10,\n                text: \"Agriculture certifi\u00e9e Haute Valeur Environnementale.\"\n            }\n        };\n\n        function decodeHash(data) {\n            var hash = window.location.hash;\n            if (hash) hash = hash.substring(1); \/\/ take string after '#'\n            var urlParams = new URLSearchParams(hash);\n\n            var getHashedBoolParam = (parameter, defaut) => {\n                if (urlParams.has(parameter)) {\n                    return \"true\" === urlParams.get(parameter);\n                }\n                else {\n                    return defaut;\n                }\n            }\n\n            var getHashedIntParam = (parameter, defaut) => {\n                if (urlParams.has(parameter)) {\n                    var val = parseInt(urlParams.get(parameter));\n                    if (isNaN(val)) return defaut;\n                    else return val;\n                }\n            }\n\n            data.isCheckedAgriAll = getHashedBoolParam(\"AgriAll\", data.isCheckedAgriAll);\n            data.isCheckedAgriConv = getHashedBoolParam(\"AgriConv\", data.isCheckedAgriConv);\n            data.isCheckedAgriHVE = getHashedBoolParam(\"AgriHVE\", data.isCheckedAgriHVE);\n            data.isCheckedAgriAB = getHashedBoolParam(\"AgriAB\", data.isCheckedAgriAB);\n            data.isCheckedNonAgriAB = getHashedBoolParam(\"NonAgriAB\", data.isCheckedNonAgriAB);\n\n            data.isCheckedCmrAll = getHashedBoolParam(\"CmrAll\", data.isCheckedCmrAll);\n            data.isCheckedCmrCancer = getHashedBoolParam(\"CmrCancer\", data.isCheckedCmrCancer);\n            data.isCheckedCmrMuta = getHashedBoolParam(\"CmrMuta\", data.isCheckedCmrMuta);\n            data.isCheckedCmrRepro = getHashedBoolParam(\"CmrRepro\", data.isCheckedCmrRepro);\n\n            data.typeFlagFilter = getHashedIntParam(\"Types\", data.typeFlagFilter);\n\n            data.isCheckedTypeInsecticide = (PesticideTypeFlags.Insecticide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeFungicide = (PesticideTypeFlags.Fungicide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeHerbicide = (PesticideTypeFlags.Herbicide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeAcaricide = (PesticideTypeFlags.Acaricide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeGrowthReg = (PesticideTypeFlags.GrowthReg & data.typeFlagFilter) != 0;\n            data.isCheckedTypeBactericide = (PesticideTypeFlags.Bactericide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeElicitor = (PesticideTypeFlags.Elicitor & data.typeFlagFilter) != 0;\n            data.isCheckedTypeRepellent = (PesticideTypeFlags.Repellent & data.typeFlagFilter) != 0;\n            data.isCheckedTypeNematicide = (PesticideTypeFlags.Nematicide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeAlgaecide = (PesticideTypeFlags.Algaecide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeMolluscicide = (PesticideTypeFlags.Molluscicide & data.typeFlagFilter) != 0;\n            data.isCheckedTypeRodenticide = (PesticideTypeFlags.Rodenticide & data.typeFlagFilter) != 0;\n\n        }\n\n        function encodeHash(data) {\n            var hash = \"#\";\n            var appendBoolVal = (key, value) => {\n                \/\/ Only append true values\n                if (value) {\n                    if (hash.length > 1) hash += \"&\";\n                    hash += `${key}=${value}`;\n                }\n            }\n            appendBoolVal('AgriAll', data.isCheckedAgriAll);\n            appendBoolVal('AgriConv', data.isCheckedAgriConv);\n            appendBoolVal('AgriHVE', data.isCheckedAgriHVE);\n            appendBoolVal('AgriAB', data.isCheckedAgriAB);\n            appendBoolVal('NonAgriAB', data.isCheckedNonAgriAB);\n\n            appendBoolVal('CmrAll', data.isCheckedCmrAll);\n            appendBoolVal('CmrCancer', data.isCheckedCmrCancer);\n            appendBoolVal('CmrMuta', data.isCheckedCmrMuta);\n            appendBoolVal('CmrRepro', data.isCheckedCmrRepro);\n\n            hash += '&Types=' + data.typeFlagFilter;\n\n            return hash;\n        }\n\n\n        var vueData = {\n            isDataLoaded: false,\n\n            isCheckedAgriAll: true,\n            isCheckedAgriConv: false,\n            isCheckedAgriHVE: false,\n            isCheckedAgriAB: false,\n            isCheckedNonAgriAB: false,\n\n            isCheckedCmrAll: true,\n            isCheckedCmrCancer: false,\n            isCheckedCmrMuta: false,\n            isCheckedCmrRepro: false,\n\n            isCheckedTypeInsecticide: false,\n            isCheckedTypeFungicide: false,\n            isCheckedTypeHerbicide: false,\n            isCheckedTypeAcaricide: false,\n            isCheckedTypeGrowthReg: false,\n            isCheckedTypeBactericide: false,\n            isCheckedTypeElicitor: false,\n            isCheckedTypeRepellent: false,\n            isCheckedTypeNematicide: false,\n            isCheckedTypeAlgaecide: false,\n            isCheckedTypeMolluscicide: false,\n            isCheckedTypeRodenticide: false,\n\n            typeFlagFilter: 0,\n\n            filtering: false,\n            cancerCount: 0,\n            mutaCount: 0,\n            reproCount: 0,\n            output: null,\n            notes: notes,\n            lecture: null,\n            contentRoot: contentRoot,\n            isSorting: false,\n            workaroundBlank: \"_blank\"\n        };\n\n        decodeHash(vueData);\n\n        var selectedSubstances = [];\n\n        const myChartJsPlugin = {\n            id: 'myChartJsPlugin',\n            beforeDraw(chart, args, options) {\n                const { ctx, chartArea: { left, top, right, bottom }, scales: { x, y } } = chart;\n                ctx.save();\n                ctx.fillStyle = options.myGradient;\n                ctx.fillRect(left, top, right - left, bottom - top);\n                ctx.restore();\n            }\n        }\n\n        var allCharts = [];\n\n        function toParsableNumber(x) {\n            if (!x) return NaN;\n\n            \/\/ Ugly, I know\n            if (typeof x == \"string\") {\n                if (x == \"\") return NaN;\n                return x.replace(\",\", \".\");\n            }\n\n            \/\/ number, return x\n            return x;\n        }\n\n        function setupCharts() {\n            \/\/ first destroy previous ones\n            for (chart of allCharts) {\n                chart.destroy();\n            }\n            allCharts = [];\n            var idx = 0;\n\n            \/\/ use image\n            var imgWidth = constantes.imgToxicityScaleWidth;\n            var r1 = 0.89 \/ (Math.log10(constantes.maxX) - Math.log10(constantes.minX));\n            var c1 = Math.log10(constantes.maxX);\n            imgWidth = constantes.imgToxicityScaleWidth;\n\n\n            $(\".chartInTable\").each((eltIndex, div) => {\n\n                var value = $(div).attr(\"data-value\");\n                if (!value || value === undefined) {\n                    \/\/ No noael, no graph\n                    return;\n                };\n\n                value = toParsableNumber(value);\n\n                if (false) {\n                    var canvas = document.createElement(\"canvas\");\n                    canvas.height = 28;\n                    canvas.width = imgWidth;\n                    div.appendChild(canvas);\n\n                    var ctx = canvas.getContext('2d');\n\n                    var gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n                    gradient.addColorStop(0, 'rgba(0,255,0, 0.7)');\n                    gradient.addColorStop(0.4, 'rgba(247,255,111, 0.7)');\n                    gradient.addColorStop(0.7, 'rgba(250,0,0, 0.7)');\n                    gradient.addColorStop(1, 'rgba(150,0,0, 0.7)');\n\n                    \/\/ Retreive value from canvas data-value attribute\n\n                    var myChart = new Chart(ctx, {\n                        type: 'scatter',\n                        data: {\n                            labels: null,\n                            fillColor: gradient,\n                            datasets: [{\n                                \/\/data: [{ x: value, y: 0 }],\n                                data: [],\n                                pointBackgroundColor: \"rgb(0,0,0,200)\",\n                                pointStyle: \"triangle\",\n                                pointRadius: 7\n                            }]\n                        },\n                        plugins: [myChartJsPlugin],\n                        options: {\n                            locale: \"fr-FR\",\n                            plugins: {\n                                legend: {\n                                    display: false\n                                },\n                                myChartJsPlugin: {\n                                    myGradient: gradient\n                                }\n                            },\n                            scales: {\n                                y: {\n                                    min: 0,\n                                    max: 0,\n                                    beginAtZero: true,\n                                    title: {\n                                        display: false\n                                    },\n                                    grid: {\n                                        display: false,\n                                        drawTicks: false\n                                    },\n                                    ticks: {\n                                        display: false\n                                    }\n                                },\n                                x: {\n                                    min: constantes.minX,\n                                    max: constantes.maxX,\n                                    type: 'logarithmic',\n                                    reverse: true,\n                                    alignToPixels: true,\n                                    title: {\n                                        display: false\n                                    },\n                                    grid: {\n                                        display: true,\n                                        borderColor: \"rgb(24,24,24,0.9)\",\n                                        borderWidth: 1,\n                                        color: \"rgb(12,12,12,0.9)\",\n                                        lineWidth: 1,\n                                        tickLength: 3,\n                                        alignToPixels: true\n                                    },\n                                    ticks: {\n                                        color: \"black\",\n                                        padding: 2,\n                                        font: {\n                                            size: 10\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    });\n\n                    allCharts.push(myChart);\n                }\n                else {\n\n                    var img = $(div).children(\"img\");\n                    var cursorDiv = $(div).children(\"#cursor\");\n                    var textDiv = $(div).children(\"#text\");\n\n                    var valueOnAxis = value;\n                    var valueText = value.replace(\".\", \",\");\n                    if (valueOnAxis > constantes.maxX) {\n                        valueOnAxis = constantes.maxX;\n                        valueText = value + \" (hors axe)\";\n                    }\n                    else if (valueOnAxis < constantes.minX) {\n                        valueOnAxis = constantes.minX;\n                        valueText = \"(hors axe) \" + value;\n                    }\n\n                    \/\/ Hard coded values are relative to image\n                    var ratio = imgWidth * r1;\n                    var start = 7.0 + c1 * ratio;\n\n                    var shift = - Math.log10(valueOnAxis) * ratio;\n                    var x = Math.round(start + shift);\n                    \/\/ var relativeX = 100.0 * x \/ imgWidth;\n                    $(cursorDiv).css({\n                        left: x + \"px\",\n                        display: \"block\"\n                    });\n\n                    \/\/ Setup text\n                    $(textDiv).text(valueText);\n\n                    var txtCss = {\n                        display: \"block\"\n                    };\n\n                    var xText = x + 20;\n                    if (valueOnAxis >= 1) {\n                        xText = x + 18;\n                        txtCss.textAlign = \"left\";\n                        txtCss.left = xText + \"px\";\n                        txtCss.right = \"auto\";\n                    }\n                    else {\n                        xText = imgWidth - x;\n                        txtCss.textAlign = \"right\";\n                        txtCss.right = xText + \"px\";\n                        txtCss.left = \"auto\";\n                    }\n\n                    $(textDiv).css(txtCss);\n\n\n                }\n                idx++;\n\n            })\n        }\n\n        var distribChart;\n\n        Chart.defaults.color = \"#181818\";\n\n        function setupToxicityDistribution() {\n            if (distribChart) distribChart.destroy();\n            var canvas = $('#distributionChart')[0];\n\n            if (!canvas) {\n                console.warn(`Error: Canvas was null, aborting setupToxicityDistribution`);\n                return;\n            }\n\n            var ctx = canvas.getContext('2d');\n\n            \/\/ Data: four slots:  100 or more,  100-10,  10-1,  1 or less\n            var distrib = [0, 0, 0, 0];\n            var count = 0.0;\n            for (substance of selectedSubstances) {\n                if (!isNaN(toParsableNumber(substance.noael.valeur))) {\n                    var v = substance.noael.valeur;\n                    if (v > 100) distrib[0]++\n                    else if (v > 10) distrib[1]++\n                    else if (v > 1) distrib[2]++\n                    else distrib[3]++\n                    count++;\n                }\n            }\n\n            \/\/ Distribution in percentage\n            for (var i = 0; i < distrib.length; i++) {\n                distrib[i] = 100.0 * distrib[i] \/ count;\n            }\n\n            \/\/ Frenglish is conquering this page\n            \/\/ createLecturePhrase(distrib);\n\n            var gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);\n            gradient.addColorStop(0, 'rgba(0,255,0, 0.7)');\n            gradient.addColorStop(0.4, 'rgba(247,255,111, 0.7)');\n            gradient.addColorStop(0.7, 'rgba(250,0,0, 0.7)');\n            gradient.addColorStop(1, 'rgba(150,0,0, 0.7)');\n\n            distribChart = new Chart(ctx, {\n                type: 'bar',\n                data: {\n                    labels: [['100 ou plus', '(peu toxique)'], '100 \u00e0 10', '10 \u00e0 1', ['1 ou moins', '(tr\u00e8s toxique)']],\n                    datasets: [{\n                        data: distrib,\n                        backgroundColor: [\n                            gradient,\n                            gradient,\n                            gradient,\n                            gradient\n                        ],\n                        borderColor: [\n                            'rgba(10, 10, 10, 1)',\n                            'rgba(10, 10, 10, 1)',\n                            'rgba(10, 10, 10, 1)',\n                            'rgba(10, 10, 10, 1)'\n                        ],\n                        color: \"green\",\n                        borderWidth: 1,\n                        categoryPercentage: 0.94\n                    }]\n                },\n                options: {\n                    barPercentage: 1,\n                    scales: {\n                        x: {\n                            title: {\n                                display: true,\n                                text: 'Intervalles de NOAEL en mg de substance par kg de poids corporel et par jour'\n                            }\n                        },\n                        y: {\n                            min: 0,\n                            max: 100,\n                            title: {\n                                display: true,\n                                text: 'Pourcentages'\n                            }\n                        }\n                    },\n                    plugins: {\n                        title: {\n                            display: true,\n                            text: 'R\u00e9partition en % des substances s\u00e9lectionn\u00e9es suivant leur toxicit\u00e9'\n                        },\n                        legend: {\n                            display: false\n                        }\n                    }\n                }\n            });\n        }\n\n        function createLecturePhrase(distrib) {\n            var maxPercent = Math.max(...distrib);\n            var percentAsString = maxPercent.toFixed(1).replace(\".\", \",\")\n            if (maxPercent == distrib[0]) {\n                \/\/ Faible toxicit\u00e9\n                vueData.lecture = {\n                    pourcent: percentAsString,\n                    supOuInf: \"sup\u00e9rieures\",\n                    forteOuFaible: \"faible\",\n                    limite: constantes.maxX \/ 10\n                };\n            }\n            else if (maxPercent == distrib[distrib.length - 1]) {\n                \/\/ Forte toxicit\u00e9\n                vueData.lecture = {\n                    pourcent: percentAsString,\n                    supOuInf: \"inf\u00e9rieures\",\n                    forteOuFaible: \"forte\",\n                    limite: constantes.minX * 10\n                };\n            }\n            else {\n                vueData.lecture = null;\n            }\n        }\n\n        function capitalFirstLetter(string) {\n            return string.charAt(0).toUpperCase() + string.slice(1);\n        }\n\n        function downloadAndParseFile(fileName, delim, headerMapper) {\n            return new Promise((resolve, reject) => {\n                Papa.parse(fileName, {\n                    header: true,\n                    delimiter: delim,\n                    download: true,\n                    encoding: \"UTF-8\",\n                    transformHeader: function (h) {\n                        return headerMapper[h];\n                    },\n                    complete(results, file) {\n                        resolve(results.data)\n                    },\n                    error(err, file) {\n                        reject(err)\n                    }\n                })\n            });\n\n        }\n\n        async function downloadAndParseAgritoxFile(file) {\n            return await downloadAndParseFile(contentRoot + `\/data\/${file}.csv`, ';', headerMap);\n        }\n\n        async function downloadAndParsePesticideTypesFile(file) {\n            return await downloadAndParseFile(contentRoot + `\/data\/${file}.csv`, ';', headerMap);\n        }\n\n        async function downloadAndParseAgritoxVtrFile(file) {\n            return await downloadAndParseFile(contentRoot + `\/data\/${file}.csv`, ';', headerMapVtr);\n        }\n\n\n        async function downloadAndParseExtensionFile(file) {\n            return await downloadAndParseFile(contentRoot + `\/data\/${file}.csv`, ',', headerMap);\n        }\n\n        function splitCasNumberToArray(casNumberString) {\n            var casArray = casNumberString.split(\/[\\s,();:]+\/);\n            \/\/ Only keep things that look like cas numbers\n            casArray = casArray.filter(s => s.split(\"-\").length == 3);\n            return casArray;\n        }\n\n        function postProcessRecords() {\n            \/\/ exclude empty cas numbers\n            atIdentit\u00e9s = atIdentit\u00e9s.filter(s => s.cas);\n            atClassements = atClassements.filter(s => s.cas);\n            atEcotox = atEcotox.filter(s => s.cas);\n            atVtr = atVtr.filter(s => s.cas);\n            compl\u00e9ments = compl\u00e9ments.filter(s => s.cas);\n            compl\u00e9mentsBio = compl\u00e9mentsBio.filter(s => s.cas);\n            casTypes = casTypes.filter(s => s.cas);\n\n            \/\/ Replace multiple cas numbers by array of cas\n            for (const substance of atIdentit\u00e9s) {\n                substance.cas = splitCasNumberToArray(substance.cas);\n                substance.nom = capitalFirstLetter(substance.nom);\n                substance.isAgritox = true;\n                substance.isSprayed = true; \/\/ Will need to find non-sprayed substances...\n            }\n\n            for (const substance of compl\u00e9mentsBio) {\n                substance.cas = splitCasNumberToArray(substance.cas);\n                substance.nom = capitalFirstLetter(substance.nom);\n            }\n\n            for (const substance of atVtr) {\n                substance.cas = splitCasNumberToArray(substance.cas);\n            }\n\n            var casTypeMap = new Map();\n            for (const substance of casTypes) {\n                if (substance.typesRaw != null) {\n                    substance.types = substance.typesRaw.split(',').filter(s => s != null);\n                    substance.types = substance.types.filter(s => s);\n                    casTypeMap.set(substance.cas, substance.types);\n                    if (substance.types.length == 0) {\n                        console.warn(`Error: CAS ${substance.cas} has no type attached! See file substance_types.csv`)\n                    }\n                }\n                else {\n                    console.warn(`Error: CAS ${substance.cas} has no type attached! Check file substance_types.csv`)\n                }\n            }\n\n            \/\/ Fill map of cas\n            for (const substance of atIdentit\u00e9s) {\n                for (const cas of substance.cas) {\n                    if (atIdMap.has(cas)) throw `CAS ${cas} already in map`;\n                    atIdMap.set(cas, substance)\n                }\n            }\n\n            \/\/ merge bio and agritox\n            var bioMerged = 0;\n            var bioCreated = 0;\n            for (const bioSubstance of compl\u00e9mentsBio) {\n                \/\/ If any cas in array of cas is in atEntit\u00e9s, reuse it.\n                var foundSubstance = null;\n                for (const cas of bioSubstance.cas) {\n                    if (atIdMap.has(cas)) {\n                        foundSubstance = atIdMap.get(cas);\n                        foundSubstance.isAgritox = true;\n                        bioMerged++;\n                        break;\n                    }\n                }\n                \/\/ Else, create a substance and add it in map\n                if (foundSubstance == null) {\n                    foundSubstance = {\n                        cas: bioSubstance.cas,\n                        nom: bioSubstance.nom,\n                        isAgritox: false\n                    }\n                    bioCreated++;\n                    atIdentit\u00e9s.push(foundSubstance);\n                    atIdMap.set(foundSubstance.cas, foundSubstance)\n                }\n\n                foundSubstance.isAgriBio = true;\n                foundSubstance.isFood = bioSubstance.isFood == \"Oui\";\n                foundSubstance.isSprayed = bioSubstance.isSprayed == \"Oui\"\n                foundSubstance.bioObject = bioSubstance;\n            }\n\n            \/\/ merge compl\u00e9ments from AGRITOX_IDENTITE_bio_extensions\n            for (const compl\u00e9ment of compl\u00e9ments) {\n                \/\/ Get referenced  substance from agritox.\n                var foundSubstance = atIdMap.get(compl\u00e9ment.cas);\n                \/\/ Agritox substance MUST have been found\n                if (foundSubstance == null) {\n                    throw `Substance ${compl\u00e9ment.cas} ${compl\u00e9ment.nom} not found in agritox`\n                }\n\n                foundSubstance.extensions = compl\u00e9ment;\n                foundSubstance.isSprayed = compl\u00e9ment.isSprayed == \"Oui\";\n            }\n\n            \/\/ merge pesticide categories \n            for (const substance of atIdentit\u00e9s) {\n                var cas = substance.cas[0];\n                if (casTypeMap.has(cas)) {\n                    substance.types = casTypeMap.get(cas);\n                    substance.typeFlags = 0;\n                    for (const type of substance.types) {\n                        substance.typeFlags |= PesticideTypeFlags[pesticideTypeInternalMap[type]];\n                    }\n                }\n                else {\n                    console.warn(`TODO: add a line in substance_types.csv for cas ${cas}, name ${substance.nom}`);\n                }\n\n            }\n\n            console.log(`${compl\u00e9ments.length} compl\u00e9ments substances merged.`);\n\n            \/\/ sort\n            atIdentit\u00e9s.sort((a, b) => (a.nom > b.nom) ? 1 : ((b.nom > a.nom) ? -1 : 0))\n        }\n\n        function findAllCasInString(aString) {\n            var substance = atIdMap.get(aString);\n            var allCas = [];\n            \/\/ May be not found if eg cas field is actually a mix (concatenation) of cas numbers\n            if (!substance) {\n                for (cas of Array.from(atIdMap.keys())) {\n                    if (aString.includes(cas)) {\n                        allCas.push(cas)\n                    }\n                }\n            }\n            else {\n                allCas = allCas.concat(substance.cas)\n            }\n            return allCas;\n        }\n\n        function getVtrNoael(subs) {\n            var noael = {\n                valeur: null,\n                unit\u00e9: null,\n                nonPertinent: false\n            };\n\n            var djas = subs.vtrs.filter(v => v.vtrNom.toLowerCase() == \"dja\");\n            if (djas.length == 1) {\n                noael.valeur = djas[0].vtrNoael1.replace(\",\", \".\");\n                noael.unit\u00e9 = djas[0].vtrUniteNoael1;\n                if (djas[0].vtrValeur == 'non pertinent') {\n                    noael.nonPertinent == true;\n                }\n            }\n            else if (djas.length > 1) {\n                throw `Expecting only 1 DJA for NOAEL but found ${vtr.length}`\n            }\n            return noael;\n        }\n\n        function getVtrNoaelForBio(subs) {\n            var noael = {\n                valeur: null,\n                unit\u00e9: null,\n                nonPertinent: false\n            };\n            if (subs.vtrNoaelExt == null || subs.vtrNoaelExt == '' || isNaN(subs.vtrNoaelExt) || !(parseFloat(subs.vtrNoaelExt) == subs.vtrNoaelExt)) {\n                noael.nonPertinent = true;\n            }\n            else {\n                noael.valeur = subs.vtrNoaelExt;\n                noael.unit\u00e9 = constantes.noaelUnit\u00e9;\n            }\n\n            return noael;\n        }\n\n        function getPictoSrc(pictoIndex) {\n            return contentRoot + '\/images\/pictos\/SGH0' + pictoIndex + '.jpg'\n        }\n\n        function getPictograms(subs) {\n\n            var map = new Map();\n\n            for (const classement of subs.classements) {\n                var pictoIndex = pictoMap[classement.classCodeH];\n                if (pictoIndex != null) {\n                    var pictoData = null;\n                    if (map.has(pictoIndex)) {\n                        pictoData = map.get(pictoIndex);\n                    }\n                    else {\n                        pictoData = {\n                            pictoIndex: pictoIndex,\n                            dangers: []\n                        }\n                        map.set(pictoIndex, pictoData);\n                    }\n\n                    pictoData.dangers.push(\n                        {\n                            hCode: classement.classCodeH,\n                            hPhrase: classement.classMentionDanger\n                        });\n                }\n                else if (classement.classCodeH != \"Sans classement\") {\n                    console.warn(`HCode ${classement.classCodeH} has no associated pictogram`)\n                }\n            }\n\n            for (var pictodata of map.values()) {\n                var text = \"\";\n                for (var danger of pictodata.dangers) {\n                    text += `<div><b>${danger.hCode}<\/b> : ${danger.hPhrase}` + \"<\/div>\";\n                }\n                var text = `<table class=\"borderless\"><tr><td width=\"70px\"><img width=\"60px\" src=\"` + getPictoSrc(pictodata.pictoIndex) + `\"\/><\/td><td>` + text + `<\/td><\/tr><\/table>`;\n                pictodata.tooltipHtml = text;\n            }\n\n            var results = Array.from(map.values());\n            results.sort((a, b) => a.pictoIndex - b.pictoIndex);\n            return results;\n        }\n\n        function buildObjectTree() {\n\n            for (const substance of atIdentit\u00e9s) {\n                substance.classements = new Array();\n                substance.ecotoxicites = new Array();\n                substance.vtrs = new Array();\n                substance.notes = new Array();\n            }\n\n            for (const classement of atClassements) {\n                var allCas = findAllCasInString(classement.cas);\n\n                for (const cas of allCas) {\n                    substance = atIdMap.get(cas);\n                    if (!substance.classements.some(c => c == classement)) {\n                        substance.classements.push(classement);\n                    }\n                }\n            }\n\n            for (const ecotox of atEcotox) {\n                var allCas = findAllCasInString(ecotox.cas);\n\n                for (const cas of allCas) {\n                    substance = atIdMap.get(cas);\n                    if (!substance.ecotoxicites.some(e => e == ecotox)) {\n                        substance.ecotoxicites.push(ecotox);\n                    }\n                }\n            }\n\n            for (const vtr of atVtr) {\n                var allCas = findAllCasInString(vtr.cas);\n\n                for (const cas of allCas) {\n                    substance = atIdMap.get(cas);\n                    if (!substance.vtrs.some(e => e == vtr)) {\n                        substance.vtrs.push(vtr);\n                    }\n                }\n            }\n\n            \/\/ Set toxiciy flags and values\n            for (const substance of atIdentit\u00e9s) {\n                var classMs = substance.classements.filter(c => c.classCodeH.toLowerCase().startsWith('h34'));\n                substance.isMutag\u00e8ne = classMs.length != 0;\n                substance.classMutag\u00e8neHtmlTooltip = substance.isMutag\u00e8ne ? \"<b>M<\/b>utag\u00e8ne\u00a0: \" + classMs.map(c => c.classMentionDanger).join(\"<br\/>\") : null\n\n                var classCs = substance.classements.filter(c => c.classCodeH.toLowerCase().startsWith('h35'));\n                substance.isCancerig\u00e8ne = classCs.length != 0;\n                substance.classCanc\u00e9rig\u00e8neHtmlTooltip = substance.isCancerig\u00e8ne ? \"<b>C<\/b>anc\u00e9rog\u00e9nicit\u00e9\u00a0: \" + classCs.map(c => c.classMentionDanger).join(\"<br\/>\") : null\n\n                var classRs = substance.classements.filter(c => c.classCodeH.toLowerCase().startsWith('h36'));\n                substance.isReprotoxique = classRs.length != 0;\n                substance.classReprotoxiqueHtmlTooltip = substance.isReprotoxique ? \"<b>R<\/b>eprotoxicit\u00e9\u00a0: \" + classRs.map(c => c.classMentionDanger).join(\"<br\/>\") : null\n\n                substance.cmr = \"\";\n                if (substance.isCancerig\u00e8ne) substance.cmr += \"C \";\n                if (substance.isMutag\u00e8ne) substance.cmr += \"M \";\n                if (substance.isReprotoxique) substance.cmr += \"R\";\n\n                \/\/ Noaels and values from VTRs\n                substance.noael = getVtrNoael(substance);\n            }\n\n            \/\/ Set pictograms\n            for (const substance of atIdentit\u00e9s) {\n                substance.pictoData = getPictograms(substance);\n            }\n\n            \/\/ Set notes and possible noael originating from organic products\n            \/\/ and from extensions like AGRITOX_IDENTITE_nonbio_extensions.csv\n            for (const substance of atIdentit\u00e9s) {\n                substance.noNoael = false;\n                if (substance.isAgritox) {\n                    substance.notes.push(notes.substInAgritox);\n\n                    if (substance.noael != null && !isNaN(toParsableNumber(substance.noael.valeur))) {\n                        \/\/ Substance et NOAEL dans Agritox\n                        substance.notes.push(notes.noaelInAgritox);\n                    }\n                    else {\n                        substance.notes.push(notes.noaelNotInAgritox);\n\n                        if (substance.bioObject && substance.bioObject.vtrNoaelExt && !isNaN(toParsableNumber(substance.bioObject.vtrNoaelExt))) {\n                            \/\/ Substance dans Agritox sans NOAEL mais dont la NOAEL est pr\u00e9sente dans la lit\u00e9rature r\u00e9glementaire ou scientifique\n                            substance.noael = getVtrNoaelForBio(substance.bioObject);\n                            substance.sourceNoael = substance.bioObject.vtrNoaelExtSource;\n                            substance.notes.push(notes.noaelFoundInScientificPublications);\n                        }\n                        else if (substance.isFood) {\n                            \/\/ Si utilis\u00e9e dans l'alimentation, la NOAEL 1000 est assign\u00e9e\n                            substance.noael.valeur = constantes.noaelFood;\n                            substance.noael.unit\u00e9 = constantes.noaelUnit\u00e9;\n                            substance.sourceNoael = null;\n                            substance.notes.push(notes.noaelInferredFromEdibility);\n                        }\n                        else {\n                            \/\/ Substance faisant l'objet de compl\u00e9ments issus de AGRITOX_IDENTITE_nonbio_extensions\n                            if (substance.extensions != null && !isNaN(toParsableNumber(substance.extensions.vtrNoaelExt))) {\n                                substance.noael.valeur = substance.extensions.vtrNoaelExt;\n                                substance.noael.unit\u00e9 = constantes.noaelUnit\u00e9;\n                                substance.sourceNoael = substance.extensions.vtrNoaelExtSource;\n                                substance.notes.push(notes.noaelFoundInScientificPublications);\n                            }\n                            else {\n                                \/\/ NOAEL inconnue\n                                substance.sourceNoael = null;\n                                substance.notes.push(notes.unknownNoael);\n                                substance.noNoael = true;\n                            }\n                        }\n                    }\n                }\n                else {\n                    substance.notes.push(notes.substNotInAgritox);\n\n                    if (substance.bioObject && !isNaN(toParsableNumber(substance.bioObject.vtrNoaelExt))) {\n                        substance.noael = getVtrNoaelForBio(substance.bioObject);\n                        substance.notes.push(notes.noaelFoundInScientificPublications);\n                    }\n                    else if (substance.isFood) {\n                        \/\/ Si utilis\u00e9e dans l'alimentation, la NOAEL 1000 est assign\u00e9e\n                        substance.noael.valeur = constantes.noaelFood;\n                        substance.noael.unit\u00e9 = constantes.noaelUnit\u00e9;\n                        substance.sourceNoael = \"Cf. note 7\";\n                        substance.notes.push(notes.noaelInferredFromEdibility);\n                    }\n                    else {\n                        substance.sourceNoael = \"Cf. note 6\";\n                        substance.notes.push(notes.unknownNoael);\n                        substance.noNoael = true;\n                    }\n                }\n\n                if (!substance.isSprayed) {\n                    substance.notes.push(notes.onlyTrapsNoSpray);\n                }\n\n                if (substance.isAgriBio) {\n                    substance.notes.push(notes.substAgriBio);\n                }\n            }\n        }\n\n        async function fetchJson(url) {\n            var response = await fetch(contentRoot + \"\/data\/picto_mapping.json\");\n            return await response.json();\n        }\n\n        async function downloadAllAgritox() {\n            console.log(\"Downloading agritox data\")\n            atIdentit\u00e9s = await downloadAndParseAgritoxFile('AGRITOX_IDENTITE');\n            atClassements = await downloadAndParseAgritoxFile('AGRITOX_CLASSEMENT');\n            atEcotox = await downloadAndParseAgritoxFile('AGRITOX_ECOTOXICITE');\n            atVtr = await downloadAndParseAgritoxVtrFile('AGRITOX_VTR');\n            casTypes = await downloadAndParsePesticideTypesFile('substance_types');\n\n            compl\u00e9ments = await downloadAndParseExtensionFile('AGRITOX_IDENTITE_nonbio_extensions');\n            compl\u00e9mentsBio = await downloadAndParseExtensionFile('AGRITOX_IDENTITE_bio_extensions');\n\n            pictoMap = await fetchJson(contentRoot + \"\/data\/picto_mapping.json\");\n        }\n\n        async function initializeData() {\n            console.log('Start init DB')\n\n            await downloadAllAgritox();\n\n            postProcessRecords();\n            buildObjectTree();\n            jsonDump = JSON.stringify(atIdentit\u00e9s);\n        }\n\n        function exportToCsv() {\n\n            let filename = 'pesticides.csv';\n            let columns = ['Nom', \"CAS\", \"Types\", \"CMR\", \"NOAEL\", \"AB\", \"Etiquetage\"]\n\n            let array = app.selected.map(s => {\n                let obj = {\n                    Nom: s.nom,\n                    CAS: s.cas.join(\", \"),\n                    Types: s.types.join(\", \"),\n                    CMR: s.cmr,\n                    NOAEL: s.noael.valeur,\n                    AB: s.isAgriBio ? \"Oui\" : \"Non\",\n                    Etiquetage: s.classements.map(c => {\n                        return c.classCodeH\n                    }).join(\", \")\n                };\n                return obj;\n            }\n            );\n\n            let csv = Papa.unparse(array, { delimiter: ';' })\n            if (csv == null) return;\n\n            var blob = new Blob([csv]);\n            if (window.navigator.msSaveOrOpenBlob)  \/\/ IE hack; see http:\/\/msdn.microsoft.com\/en-us\/library\/ie\/hh779016.aspx\n                window.navigator.msSaveBlob(blob, args.filename);\n            else {\n                var a = window.document.createElement(\"a\");\n                a.href = window.URL.createObjectURL(blob, { type: \"text\/plain\" });\n                a.download = filename;\n                document.body.appendChild(a);\n                a.click();  \/\/ IE: \"Access is denied\"; see: https:\/\/connect.microsoft.com\/IE\/feedback\/details\/797361\/ie-10-treats-blob-url-as-cross-origin-and-denies-access\n                document.body.removeChild(a);\n            }\n\n        }\n\n        var app = new Vue({\n            el: '#app',\n            data: vueData,\n            watch: {\n                isCheckedAgriAll: function (val) {\n                    if (val == true) {\n                        this.isCheckedAgriConv = false;\n                        this.isCheckedAgriHVE = false;\n                        this.isCheckedAgriAB = false;\n                        this.isCheckedNonAgriAB = false;\n                    }\n                },\n                isCheckedCmrAll: function (val) {\n                    if (val == true) {\n                        this.isCheckedCmrCancer = false;\n                        this.isCheckedCmrMuta = false;\n                        this.isCheckedCmrRepro = false;\n                    }\n                },\n                \/\/ AB et non-AB sont mutuellement exclusives car intersection vide.\n                isCheckedNonAgriAB: function (val) {\n                    if (val == true) {\n                        this.isCheckedAgriAB = false;\n                    }\n                },\n                isCheckedAgriAB: function (val) {\n                    if (val == true) {\n                        this.isCheckedNonAgriAB = false;\n                    }\n                },\n                typeFlagFilter: function (val) {\n                }\n\n            },\n            updated: function () {\n                console.log(\"updated\");\n                if (this.isCheckedAgriConv || this.isCheckedAgriHVE || this.isCheckedAgriAB || this.isCheckedNonAgriAB) this.isCheckedAgriAll = false;\n                if (!(this.isCheckedAgriConv || this.isCheckedAgriHVE || this.isCheckedAgriAB || this.isCheckedNonAgriAB)) this.isCheckedAgriAll = true;\n\n                if (this.isCheckedCmrCancer || this.isCheckedCmrRepro || this.isCheckedCmrMuta) this.isCheckedCmrAll = false;\n                if (!(this.isCheckedCmrCancer || this.isCheckedCmrRepro || this.isCheckedCmrMuta)) this.isCheckedCmrAll = true;\n\n                var areTypesFiltered = this.isCheckedTypeInsecticide || this.isCheckedTypeFungicide || this.isCheckedTypeHerbicide || this.isCheckedTypeAcaricide ||\n                    this.isCheckedTypeGrowthReg || this.isCheckedTypeBactericide || this.isCheckedTypeElicitor || this.isCheckedTypeRepellent ||\n                    this.isCheckedTypeNematicide || this.isCheckedTypeAlgaecide || this.isCheckedTypeMolluscicide || this.isCheckedTypeRodenticide;\n\n                var typeFilter = 0;\n                if (areTypesFiltered) {\n                    typeFilter |= this.isCheckedTypeInsecticide ? PesticideTypeFlags.Insecticide : 0;\n                    typeFilter |= this.isCheckedTypeFungicide ? PesticideTypeFlags.Fungicide : 0;\n                    typeFilter |= this.isCheckedTypeHerbicide ? PesticideTypeFlags.Herbicide : 0;\n                    typeFilter |= this.isCheckedTypeAcaricide ? PesticideTypeFlags.Acaricide : 0;\n                    typeFilter |= this.isCheckedTypeGrowthReg ? PesticideTypeFlags.GrowthReg : 0;\n                    typeFilter |= this.isCheckedTypeBactericide ? PesticideTypeFlags.Bactericide : 0;\n                    typeFilter |= this.isCheckedTypeElicitor ? PesticideTypeFlags.Elicitor : 0;\n                    typeFilter |= this.isCheckedTypeRepellent ? PesticideTypeFlags.Repellent : 0;\n                    typeFilter |= this.isCheckedTypeNematicide ? PesticideTypeFlags.Nematicide : 0;\n                    typeFilter |= this.isCheckedTypeAlgaecide ? PesticideTypeFlags.Algaecide : 0;\n                    typeFilter |= this.isCheckedTypeMolluscicide ? PesticideTypeFlags.Molluscicide : 0;\n                    typeFilter |= this.isCheckedTypeRodenticide ? PesticideTypeFlags.Rodenticide : 0;\n                }\n                this.typeFlagFilter = typeFilter\n\n                window.location.hash = encodeHash(this);\n            },\n            created: async function () {\n                await initializeData();\n                this.isDataLoaded = true;\n                this.unWatched = {\n                    sortFunction: null\n                }\n            },\n            computed:\n            {\n                selected: function () {\n                    console.log(\"selected called\");\n                    var sorting = this.isSorting;\n                    this.isSorting = false;\n\n                    if (!sorting) {\n                        this.isDataLoaded = false;\n                        $(\"#resultTable\").hide();\n                    }\n\n                    selectedSubstances = this.getFilterSubstances();\n                    selectedSubstances = this.sortSubstances(selectedSubstances);\n\n                    var component = this;\n                    \n                    Vue.nextTick(function () {\n                        if (!sorting) {\n                            component.isDataLoaded = true;\n                            $(\"#resultTable\").show();\n                        }\n\n                        Vue.nextTick(function () {\n                            if (!sorting) {\n                                setupToxicityDistribution();\n                            }\n\n                            setupCharts();\n                            $('[data-toggle=\"tooltip\"]').tooltip({\n                                boundary: \"window\",\n                                delay: {\n                                    show: 5,\n                                    hide: 0\n                                }\n                            });\n\n                            Vue.nextTick(function () {\n                                \n                            });\n                        });\n                        \n                    });\n                    \n                    return selectedSubstances\n                }\n            },\n            methods: {\n                getSubstance(s) {\n                    return s;\n                },\n                getFilterSubstances: function () {\n                    console.log(\"filtering\");\n                    this.filtering = true;\n\n                    var tmpSelection = atIdentit\u00e9s;\n\n                    \/\/ CMR filter\n                    if (!this.isCheckedCmrAll) {\n                        if (this.isCheckedCmrCancer)\n                            tmpSelection = tmpSelection.filter(s => s.isCancerig\u00e8ne == true);\n                        if (this.isCheckedCmrRepro)\n                            tmpSelection = tmpSelection.filter(s => s.isReprotoxique == true);\n                        if (this.isCheckedCmrMuta)\n                            tmpSelection = tmpSelection.filter(s => s.isMutag\u00e8ne == true);\n                    }\n\n                    \/\/ Agri filter\n                    if (!this.isCheckedAgriAll) {\n                        if (this.isCheckedAgriConv)\n                            tmpSelection = tmpSelection; \/\/ nothing to filter\n                        if (this.isCheckedAgriHVE)\n                            tmpSelection = tmpSelection; \/\/ nothing to filter\n                        if (this.isCheckedAgriAB)\n                            tmpSelection = tmpSelection.filter(s => s.isAgriBio == true);\n                        if (this.isCheckedNonAgriAB)\n                            tmpSelection = tmpSelection.filter(s => s.isAgriBio != true);\n                    }\n\n                    if (this.typeFlagFilter != 0) {\n                        tmpSelection = tmpSelection.filter(s => (s.typeFlags & this.typeFlagFilter) != 0);\n                    }\n\n                    this.cancerCount = tmpSelection.filter(s => s.isCancerig\u00e8ne == true).length;\n                    this.mutaCount = tmpSelection.filter(s => s.isMutag\u00e8ne == true).length;\n                    this.reproCount = tmpSelection.filter(s => s.isReprotoxique == true).length;\n\n                    this.filtering = false;\n                    return tmpSelection;\n                },\n                sortPictos: function (zeroOrOne) {\n                    this.isSorting = true;\n                    this.unWatched.sortFunction = (substances) => pictoSorter(substances, zeroOrOne);\n                },\n                sortNoael: function (zeroOrOne) {\n                    this.isSorting = true;\n                    this.unWatched.sortFunction = (substances) => noaelSorter(substances, zeroOrOne);\n                },\n                sortCMR: function (zeroOrOne) {\n                    this.isSorting = true;\n                    this.unWatched.sortFunction = (substances) => cmrSorter(substances, zeroOrOne);\n                },\n                sortNames: function (zeroOrOne) {\n                    this.isSorting = true;\n                    this.unWatched.sortFunction = (substances) => nameSorter(substances, zeroOrOne);\n                },\n                sortSubstances: function (substances) {\n                    if (this.unWatched.sortFunction != null) {\n                        return this.unWatched.sortFunction(substances);\n                    }\n                    else {\n                        return substances;\n                    }\n                }\n            }\n        })\n\n        var pictoSorter = function (substances, order) {\n            var sign = order * 2 - 1;\n            substances.sort((a, b) => (a.pictoData.length > b.pictoData.length) ? sign : ((b.pictoData.length > a.pictoData.length) ? -sign : 0));\n            return substances;\n        }\n\n        var cmrSorter = function (substances, order) {\n            var sign = order * 2 - 1;\n            substances.sort((a, b) => {\n                let sumA = sumChars(a.cmr);\n                let sumB = sumChars(b.cmr);\n                return sumA > sumB ? sign : (sumA < sumB ? -sign : 0);\n            });\n            return substances;\n        }\n\n        var sumChars = function (str) {\n            let sum = 0;\n            for (let char of str) {\n                sum += char.codePointAt(0);\n            }\n            return sum;\n        }\n\n        var nameSorter = function (substances, order) {\n            var sign = order * 2 - 1;\n            substances.sort((a, b) => (a.nom > b.nom) ? sign : ((b.nom > a.nom) ? -sign : 0));\n            return substances;\n        }\n\n        var noaelSorter = function (substances, order) {\n            var sign = order * 2 - 1;\n            substances.sort((a, b) => {\n                var na = toParsableNumber(a.noael.valeur); if (isNaN(na)) na = 0.0; na = parseFloat(na);\n                var nb = toParsableNumber(b.noael.valeur); if (isNaN(nb)) nb = 0.0; nb = parseFloat(nb);\n                var result = (na > nb) ? 1 : (nb > na ? -1 : 0);\n                return result * sign;\n            });\n\n            return substances;\n        }\n\n    <\/script>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bienvenue sur PestiLens, l&rsquo;outil de visualisation de la toxicit\u00e9 des pesticides. Une description de PestiLens, ses objectifs, sources de donn\u00e9es et m\u00e9thode est disponible ici. S\u00e9lection des pesticides et substances phytosanitaires Par type de pesticides Insecticides Fongicides Herbicides Acaricides R\u00e9g. de croissance Bact\u00e9ricides Eliciteurs R\u00e9pulsifs N\u00e9maticides Algicides Mollusquicides Rodenticides Par domaine d&rsquo;autorisation Toutes substances autoris\u00e9es &hellip; <a href=\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;PestiLens, les phytosanitaires \u00e0 la loupe&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PestiLens, les phytosanitaires \u00e0 la loupe - Terranautes<\/title>\n<meta name=\"description\" content=\"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.\" \/>\n<meta property=\"og:description\" content=\"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/\" \/>\n<meta property=\"og:site_name\" content=\"Terranautes\" \/>\n<meta property=\"article:modified_time\" content=\"2022-06-06T14:53:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.terranautes.org\/wp-content\/uploads\/2022\/01\/pestilens_general_view.png\" \/>\n\t<meta property=\"og:image:width\" content=\"875\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.terranautes.org\/wp-content\/uploads\/2022\/01\/pestilens_general_view.png\" \/>\n<meta name=\"twitter:site\" content=\"@ethalises\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/\",\"url\":\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/\",\"name\":\"PestiLens, les phytosanitaires \u00e0 la loupe - Terranautes\",\"isPartOf\":{\"@id\":\"https:\/\/www.terranautes.org\/#website\"},\"datePublished\":\"2022-01-02T16:04:48+00:00\",\"dateModified\":\"2022-06-06T14:53:27+00:00\",\"description\":\"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.terranautes.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PestiLens, les phytosanitaires \u00e0 la loupe\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.terranautes.org\/#website\",\"url\":\"https:\/\/www.terranautes.org\/\",\"name\":\"Terranautes\",\"description\":\"Notre navire : la biosph\u00e8re\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.terranautes.org\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PestiLens, les phytosanitaires \u00e0 la loupe - Terranautes","description":"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/","og_locale":"fr_FR","og_type":"article","og_title":"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.","og_description":"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.","og_url":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/","og_site_name":"Terranautes","article_modified_time":"2022-06-06T14:53:27+00:00","og_image":[{"width":875,"height":640,"url":"https:\/\/www.terranautes.org\/wp-content\/uploads\/2022\/01\/pestilens_general_view.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_title":"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.","twitter_image":"https:\/\/www.terranautes.org\/wp-content\/uploads\/2022\/01\/pestilens_general_view.png","twitter_site":"@ethalises","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/","url":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/","name":"PestiLens, les phytosanitaires \u00e0 la loupe - Terranautes","isPartOf":{"@id":"https:\/\/www.terranautes.org\/#website"},"datePublished":"2022-01-02T16:04:48+00:00","dateModified":"2022-06-06T14:53:27+00:00","description":"PestiLens, outil interactif de visualisation de la toxicit\u00e9 des pesticides utilis\u00e9s en agriculture.","breadcrumb":{"@id":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.terranautes.org\/index.php\/pestilens-pesticides-loupe\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.terranautes.org\/"},{"@type":"ListItem","position":2,"name":"PestiLens, les phytosanitaires \u00e0 la loupe"}]},{"@type":"WebSite","@id":"https:\/\/www.terranautes.org\/#website","url":"https:\/\/www.terranautes.org\/","name":"Terranautes","description":"Notre navire : la biosph\u00e8re","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.terranautes.org\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"}]}},"_links":{"self":[{"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/pages\/240"}],"collection":[{"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/comments?post=240"}],"version-history":[{"count":50,"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/pages\/240\/revisions"}],"predecessor-version":[{"id":374,"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/pages\/240\/revisions\/374"}],"wp:attachment":[{"href":"https:\/\/www.terranautes.org\/index.php\/wp-json\/wp\/v2\/media?parent=240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}