{"version":3,"file":"js/app.4ec73d0a.js","mappings":"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","sources":["webpack://landowner-tool/./src/App.vue","webpack://landowner-tool/./src/analyticsInstance.js","webpack://landowner-tool/./src/App.vue?7ccd","webpack://landowner-tool/./src/store.js","webpack://landowner-tool/./src/components/util.js","webpack://landowner-tool/./src/components/ConcernPicker.vue","webpack://landowner-tool/./src/components/ConcernPicker.vue?a047","webpack://landowner-tool/./src/components/ConservationPracticeExplorer.vue","webpack://landowner-tool/./src/graphql/mutations.js","webpack://landowner-tool/./src/components/ConservationPracticeExplorer.vue?94e6","webpack://landowner-tool/./src/main.js","webpack://landowner-tool/webpack/bootstrap","webpack://landowner-tool/webpack/runtime/chunk loaded","webpack://landowner-tool/webpack/runtime/compat get default export","webpack://landowner-tool/webpack/runtime/create fake namespace object","webpack://landowner-tool/webpack/runtime/define property getters","webpack://landowner-tool/webpack/runtime/ensure chunk","webpack://landowner-tool/webpack/runtime/get javascript chunk filename","webpack://landowner-tool/webpack/runtime/get mini-css chunk filename","webpack://landowner-tool/webpack/runtime/global","webpack://landowner-tool/webpack/runtime/hasOwnProperty shorthand","webpack://landowner-tool/webpack/runtime/load script","webpack://landowner-tool/webpack/runtime/make namespace object","webpack://landowner-tool/webpack/runtime/publicPath","webpack://landowner-tool/webpack/runtime/jsonp chunk loading","webpack://landowner-tool/webpack/startup"],"sourcesContent":["<template>\n <router-view :concernsByCategory=\"concernsByCategory\" :practiceConcernPairs=\"practiceConcernPairs\"\n :practiceDescriptions=\"practiceDescriptions\"></router-view>\n</template>\n\n<script>\nimport Papa from 'papaparse';\nimport analyticsInstance from './analyticsInstance.js'\n\n// Creates a dictionary from the CSV associating concerns and category\n//\n// Format of input object:\n// {category: \"Soil & Land\", concern: \"Wind Erosion\"}, \n// {category: \"Soil & Land\", concern: \"Classic Gully Erosion\"} \n//\n// Return value:\n// {\"Soil & Land\": [\"Wind Erosion\", \"Classic Gully Erosion\"]}\nfunction concernsByCategoryFromCsvObj(jsonObj) {\n const concernsByCategory = {};\n for (const line of jsonObj) {\n if (concernsByCategory[line.category]) {\n concernsByCategory[line.category].push(strip(line.concern));\n } else {\n concernsByCategory[line.category] = [strip(line.concern)];\n }\n }\n return concernsByCategory;\n}\n\nfunction strip(str) {\n return str.replace(/[\"]+/g, '').trim();\n}\n\nasync function loadCsvWithHeader(filePath) {\n let csvLines;\n await fetch(filePath)\n .then(res => res.text())\n .then(csv => {\n Papa.parse(csv, {\n header: true,\n complete: function (results) {\n csvLines = results.data;\n }\n });\n });\n return csvLines;\n}\n\nexport default {\n name: 'App',\n data() {\n return {\n /**\n * How effective a certain conservation practice is for a certain resource \n * concern. In long format, so every line contains a practice, a concern, and\n * the effectiveness value. Zero values are omitted.\n */\n practiceConcernPairs: [],\n concernsByCategory: [],\n practiceDescriptions: [],\n dataLoaded: false,\n }\n },\n computed: {\n concernsWithPractices() {\n return [];\n }\n },\n methods: {\n async loadDescriptions() {\n let practiceDescriptions = {};\n let descriptionLines = await loadCsvWithHeader('data/conservation_practice_descriptions.csv');\n // TODO: may not need this line once data is cleaned up\n for (const line of descriptionLines) {\n practiceDescriptions[line['Conservation Practice']] = line['Description'];\n }\n this.practiceDescriptions = practiceDescriptions;\n },\n async loadPractices() {\n this.practiceConcernPairs = await loadCsvWithHeader('data/conservation_practices_long.csv');\n },\n async loadConcerns() {\n let concernsByCategoryLines = await loadCsvWithHeader('data/concerns_by_category.csv');\n this.concernsByCategory = concernsByCategoryFromCsvObj(concernsByCategoryLines);\n }\n },\n mounted() {\n // Loading the data at the app-level to avoid extra loading if the user goes back\n // and forth between the concern picker and explorer, which is an expected use.\n this.loadDescriptions();\n this.loadPractices();\n this.loadConcerns();\n\n // Track a page view\n analyticsInstance.page();\n },\n}\n</script>\n\n<style>\n#app {\n margin-top: 20px;\n margin-bottom: 20px;\n}\n</style>\n","// Analytics store component to track events and share a global events tracker\nimport Analytics from 'analytics';\nimport googleAnalytics from '@analytics/google-analytics';\n\nconst analyticsInstance = Analytics({\n app: 'landowner-tool',\n plugins: [\n googleAnalytics({\n measurementIds: ['G-FZFFBB18CL']\n // ,debug: true\n })\n ]\n})\n\nexport default analyticsInstance","import { render } from \"./App.vue?vue&type=template&id=9588c77a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=9588c77a&lang=css\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { reactive } from 'vue'\n\nexport const store = reactive({\n checkedConcerns: [],\n name: '',\n state: '',\n county: '',\n organization: '',\n role: ''\n})","export function intersection(listA, listB) {\n if (!listA || !listB) return [];\n const result = [];\n for (const elem of listA) {\n if (listB.includes(elem)) {\n result.push(elem)\n }\n }\n return result;\n}\n\n//https://observablehq.com/@slowkow/vertical-color-legend","<template>\n <div class=\"container\">\n <h1 class=\"text-center\">Tell us about your conservation interests</h1>\n </div>\n <div class=\"container\">\n <form>\n <div class=\"container-md\">\n <div class=\"mb-3\">\n <label for=\"name\" class=\"form-label\">Name</label>\n <input v-model=\"store.name\" class=\"form-control\" id=\"name\">\n </div>\n <div class=\"mb-3\">\n <label for=\"state\" class=\"form-label\">State</label>\n <span class=\"required-indicator\"> *</span>\n <select\n v-model=\"store.state\"\n @blur=\"validateField('state')\"\n @change=\"validateField('state')\"\n :class=\"{'is-invalid': errors.state, 'is-valid': !errors.state && store.state}\"\n class=\"form-select\"\n id=\"state\"\n required\n aria-required=\"true\"\n >\n <option selected disabled>Select your state</option>\n <option value=\"AL\">Alabama</option>\n <option value=\"AK\">Alaska</option>\n <option value=\"AZ\">Arizona</option>\n <option value=\"AR\">Arkansas</option>\n <option value=\"CA\">California</option>\n <option value=\"CO\">Colorado</option>\n <option value=\"CT\">Connecticut</option>\n <option value=\"DE\">Delaware</option>\n <option value=\"DC\">District Of Columbia</option>\n <option value=\"FL\">Florida</option>\n <option value=\"GA\">Georgia</option>\n <option value=\"HI\">Hawaii</option>\n <option value=\"ID\">Idaho</option>\n <option value=\"IL\">Illinois</option>\n <option value=\"IN\">Indiana</option>\n <option value=\"IA\">Iowa</option>\n <option value=\"KS\">Kansas</option>\n <option value=\"KY\">Kentucky</option>\n <option value=\"LA\">Louisiana</option>\n <option value=\"ME\">Maine</option>\n <option value=\"MD\">Maryland</option>\n <option value=\"MA\">Massachusetts</option>\n <option value=\"MI\">Michigan</option>\n <option value=\"MN\">Minnesota</option>\n <option value=\"MS\">Mississippi</option>\n <option value=\"MO\">Missouri</option>\n <option value=\"MT\">Montana</option>\n <option value=\"NE\">Nebraska</option>\n <option value=\"NV\">Nevada</option>\n <option value=\"NH\">New Hampshire</option>\n <option value=\"NJ\">New Jersey</option>\n <option value=\"NM\">New Mexico</option>\n <option value=\"NY\">New York</option>\n <option value=\"NC\">North Carolina</option>\n <option value=\"ND\">North Dakota</option>\n <option value=\"OH\">Ohio</option>\n <option value=\"OK\">Oklahoma</option>\n <option value=\"OR\">Oregon</option>\n <option value=\"PA\">Pennsylvania</option>\n <option value=\"RI\">Rhode Island</option>\n <option value=\"SC\">South Carolina</option>\n <option value=\"SD\">South Dakota</option>\n <option value=\"TN\">Tennessee</option>\n <option value=\"TX\">Texas</option>\n <option value=\"UT\">Utah</option>\n <option value=\"VT\">Vermont</option>\n <option value=\"VA\">Virginia</option>\n <option value=\"WA\">Washington</option>\n <option value=\"WV\">West Virginia</option>\n <option value=\"WI\">Wisconsin</option>\n <option value=\"WY\">Wyoming</option>\n <option value=\"NONE\">None</option>\n </select>\n <div v-if=\"errors.state\" class=\"invalid-feedback\">State is required.</div>\n </div>\n <div class=\"mb-3\">\n <label for=\"county\" class=\"form-label\">County</label>\n <span class=\"required-indicator\"> *</span>\n <input\n v-model=\"store.county\"\n @blur=\"validateField('county')\"\n @input=\"validateField('county')\"\n :class=\"{'is-invalid': errors.county, 'is-valid': !errors.county && store.county}\"\n class=\"form-control\"\n id=\"county\"\n required\n aria-required=\"true\"\n >\n <div v-if=\"errors.county\" class=\"invalid-feedback\">County is required.</div>\n </div>\n <div class=\"mb-3\">\n <label for=\"organization\" class=\"form-label\">Organization</label>\n <span class=\"required-indicator\"> *</span>\n <input\n v-model=\"store.organization\"\n @blur=\"validateField('organization')\"\n @input=\"validateField('organization')\"\n :class=\"{'is-invalid': errors.organization, 'is-valid': !errors.organization && store.organization}\"\n class=\"form-control\"\n id=\"organization\"\n required\n aria-required=\"true\"\n >\n <div v-if=\"errors.organization\" class=\"invalid-feedback\">Organization is required.</div>\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label\">Role</label>\n <select v-model=\"store.role\" class=\"form-select\" aria-label=\"role\">\n <option selected disabled>Select your role</option>\n <option value=\"landowner\">Landowner</option>\n <option value=\"biologist\">Biologist</option>\n <option value=\"other\">Other</option>\n </select>\n </div>\n </div>\n <masonry :cols=\"{ default: 3, 700: 2, 400: 1 }\">\n <div v-for=\"(value, key) in concernsByCategory\" :key=\"key\">\n <div class=\"card\">\n <div class=\"card-body\">\n <div class=\"form-check\">\n <input type=\"checkbox\" :id=\"key + '-checkbox'\" class=\"form-check-input\" @click=\"toggleAll(key)\">\n <label class=\"card-title\">\n <h5>{{ key }}</h5>\n </label>\n </div>\n <div v-for=\"concern in value\" :key=\"concern\" class=\"form-check\">\n <input type=\"checkbox\" class=\"form-check-input\" :id=\"concern\" :value=\"concern\" v-model=\"checkedConcerns\">\n <label class=\"form-check-label\" :for=\"concern\" :title=\"concernDescriptions[concern] || ''\">{{ concern }}</label>\n </div>\n </div>\n </div>\n </div>\n </masonry>\n <RouterLink\n class=\"btn btn-primary\"\n :class=\"{ 'disabled': !isValid, 'btn-secondary': !isValid }\"\n :to=\"isValid\n ? `/explore?name=${encodeURIComponent(store.name)}&state=${encodeURIComponent(store.state)}&county=${encodeURIComponent(store.county)}&organization=${encodeURIComponent(store.organization)}&role=${encodeURIComponent(store.role)}&concerns=${getConcernString()}`\n : '#'\"\n >\n Explore conservation practices\n </RouterLink>\n <!-- Error Message when the form is invalid -->\n <div v-if=\"!isValid\" class=\"text-muted mt-2\">\n <small>Please fill in all required fields to continue.</small>\n </div>\n </form>\n </div>\n</template>\n\n<script>\nexport const ALL_CHECKED = 'all-checked';\nexport const SOME_CHECKED = 'some-checked';\nexport const NONE_CHECKED = 'none-checked';\n\n// eslint-disable-next-line\nimport * as bootstrap from 'bootstrap'\nimport { intersection } from './util.js';\nimport analyticsInstance from '../analyticsInstance.js';\nimport concernDescriptions from '../../public/data/concern_descriptions_map.json'\n\nexport default {\n name: 'ConcernPicker',\n props: ['concernsByCategory'],\n // Prevents all properties from being passed through router-view, only those named above \n inheritAttrs: false,\n data() {\n return {\n checkedConcerns: store.checkedConcerns,\n // The toggle state of categories that include concerns the user\n // has interacted with so far\n categoryToggleStates: {},\n name: store.name,\n state: store.state,\n county: store.county,\n organization: store.organization,\n role: store.role,\n concernDescriptions,\n errors: {}\n }\n },\n computed: {\n isValid() {\n return store.state && store.county && store.organization;\n },\n exploreLink() {\n return `/explore?name=${encodeURIComponent(this.name)}&state=${encodeURIComponent(this.state)}&county=${encodeURIComponent(this.county)}&organization=${encodeURIComponent(this.organization)}&role=${encodeURIComponent(this.role)}&concerns=${this.getConcernString()}`\n }\n },\n mounted() {\n // Update from store when navigating backwards to this page\n // Wait 100ms before updating top level checkmarks to avoid race condition\n setTimeout(this.updateTopLevelCheckmarks, 100)\n\n analyticsInstance.track('ConcernPickerDidLoad');\n\n // Unfortunately the elements are within a vue-next-masonry component\n // which does not emit a layout-complete event, and requires us to\n // repeat initializing the tooltips regularly. This code is WIP\n // window.bootstrap = bootstrap\n // const tooltipList = document.querySelectorAll('[data-bs-title]');\n // tooltipList.forEach(el => {\n // if (el.getAttribute('data-bs-title')) {\n // // console.log(el)\n // new bootstrap.Tooltip(el);\n // }\n // });\n\n },\n watch: {\n // Indeterminate checkbox state cannot be set via HTML. For consistency, \n // setting all checkbox state here.\n checkedConcerns() {\n this.updateTopLevelCheckmarks();\n },\n },\n methods: {\n validateField(field) {\n if (!store[field]) {\n this.errors[field] = true;\n } else {\n this.errors[field] = false;\n }\n },\n getConcernString() {\n store.checkedConcerns = this.checkedConcerns;\n const concernURLString = this.checkedConcerns.join(':');\n return encodeURIComponent(concernURLString);\n },\n updateTopLevelCheckmarks() {\n for (const category in this.concernsByCategory) {\n const concernsIntersection = intersection(this.checkedConcerns, this.concernsByCategory[category]);\n const checkboxElement = document.getElementById(category + '-checkbox');\n if (concernsIntersection.length == 0) {\n this.categoryToggleStates[category] = NONE_CHECKED;\n checkboxElement.checked = false;\n checkboxElement.indeterminate = false;\n } else if (concernsIntersection.length == this.concernsByCategory[category].length) {\n this.categoryToggleStates[category] = ALL_CHECKED;\n checkboxElement.checked = true;\n checkboxElement.indeterminate = false;\n } else {\n this.categoryToggleStates[category] = SOME_CHECKED;\n checkboxElement.indeterminate = true;\n checkboxElement.checked = false;\n }\n }\n },\n toggleAll(categoryName) {\n if (!this.categoryToggleStates[categoryName]) {\n this.categoryToggleStates[categoryName] = ALL_CHECKED;\n for (const concern of this.concernsByCategory[categoryName]) {\n if (!this.checkedConcerns.includes(concern)) {\n this.checkedConcerns.push(concern);\n }\n }\n return;\n }\n switch (this.categoryToggleStates[categoryName]) {\n case ALL_CHECKED:\n this.categoryToggleStates[categoryName] = NONE_CHECKED;\n for (const concern of this.concernsByCategory[categoryName]) {\n this.checkedConcerns = this.checkedConcerns.filter(val => val != concern);\n }\n break;\n case NONE_CHECKED:\n case SOME_CHECKED:\n this.categoryToggleStates[categoryName] = ALL_CHECKED;\n for (const concern of this.concernsByCategory[categoryName]) {\n if (!this.checkedConcerns.includes(concern)) {\n this.checkedConcerns.push(concern);\n }\n }\n break;\n }\n }\n }\n}\n</script>\n<script setup>\nimport { store } from '../store.js'\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style scoped>\n.card {\n margin: 15px;\n}\n\n.required-indicator {\n color :red;\n}\n</style>\n","import script from \"./ConcernPicker.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ConcernPicker.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./ConcernPicker.vue?vue&type=style&index=0&id=9d7891b2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-9d7891b2\"]])\n\nexport default __exports__","<template>\n <div class=\"container\">\n <router-link\n :to=\"{ path: '/'}\"\n class=\"btn btn-light\"\n >\n <i class=\"bi bi-arrow-left me-2\"></i>\n Start Over\n </router-link>\n </div>\n <div class=\"container\">\n <h2 class=\"text-center\">NRCS Conservation Practices that Address Your Resource Concerns</h2>\n <p><b>How to Interpret This Graph:</b> This graph visualizes overlap and patterns in the effectiveness of certain\n conservation practices. The vertical left-hand column lists out conservation practices used by NRCS EQIP program and the top\n horizontal row lists resource concerns you selected on the previous page. The numbers in the graph indicate the\n severity of the impact as shown in the effect score key above the graph. This data comes from USDA’s Conservation\n Practice Physical Effects (CPPE) scores.</p>\n </div>\n <div class=\"container\">\n <p><a href=\"https://www.landscapepartnership.org/networks/working-lands-for-wildlife/landscapes-wildlife/landscapes/aquatics/maps-and-data/aquatic-framework-products/aquacorridors-conservation-encyclopedia\" class=\"btn btn-primary\" target=\"_blank\">Learn about these conservation practices and concerns in the AquaCorridors Handbook</a></p>\n </div>\n <div class=\"container\">\n <div id=\"heatmap-legend\"></div>\n <div id=\"heatmap-sidebar\"></div>\n <div id=\"heatmap\"></div>\n <div class=\"download-container\">\n <button class=\"btn btn-primary mt-3\" @click=\"downloadCSV\"><i class=\"bi bi-cloud-arrow-down-fill\"></i> Download (CSV)</button>\n </div>\n </div>\n</template>\n\n<script>\nimport * as d3 from 'd3';\nimport Papa from 'papaparse';\nimport jsPDF from 'jspdf';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\nimport analyticsInstance from '../analyticsInstance.js';\nimport * as API from \"aws-amplify/api\";\nimport { createData } from \"../graphql/mutations\";\n\nconst client = API.generateClient();\n\n// Space for the top labels (concern names)\nlet TOP_LABEL_OFFSET = 110;\n// Space for the side labels (conservation names)\nlet SIDE_LABEL_OFFSET = 330;\nlet HEATMAP_COLUMN_WIDTH = 110;\nlet HEATMAP_ROW_HEIGHT = 30;\n\nfunction findRelevantConservationPractices(practiceConcernPairs, chosenConcerns) {\n const relevantConservationPractices = new Set();\n for (const pair of practiceConcernPairs) {\n if (chosenConcerns.includes(pair['concern']) && pair['value'] != 0) {\n relevantConservationPractices.add(pair['conservation_practice']);\n }\n }\n return relevantConservationPractices;\n}\n\nfunction filterPracticesByChosenConcerns(practiceConcernPairs, chosenConcerns, relevantConservationPractices) {\n return practiceConcernPairs.filter((pair) =>\n (chosenConcerns.includes(pair['concern']) &&\n relevantConservationPractices.has(pair['conservation_practice'])));\n}\n\n\n\nfunction sortByConservationPracticeEffectScores(practiceConcernPairs) {\n let conservationPracticeCumulativeEffectScores = {};\n for (const pair of practiceConcernPairs) {\n if (!(pair['conservation_practice'] in conservationPracticeCumulativeEffectScores)) {\n conservationPracticeCumulativeEffectScores[pair['conservation_practice']] = 0;\n }\n conservationPracticeCumulativeEffectScores[pair['conservation_practice']] += Number(pair['value']);\n }\n // console.log(conservationPracticeCumulativeEffectScores);\n\n // Pairs with conservation practices with a higher cumulative value first\n practiceConcernPairs.sort(practiceConcernPairCompareFn);\n\n function practiceConcernPairCompareFn(a, b) {\n return conservationPracticeCumulativeEffectScores[b['conservation_practice']]\n - conservationPracticeCumulativeEffectScores[a['conservation_practice']]\n }\n}\n\nexport default {\n Name: 'ConservationPracticeExplorer',\n props: ['practiceConcernPairs', 'practiceDescriptions'],\n // Prevents all properties from being passed through router-view, only those named above \n inheritAttrs: false,\n data() {\n return {\n relevantPracticeConcernPairs: [],\n }\n },\n mounted() {\n analyticsInstance.track('conservationPracticeExplorerDidLoad')\n },\n watch: {\n practiceConcernPairs: {\n handler(practiceConcernPairs) {\n // If the data is loaded\n // TODO: handle when no concerns are selected\n if (practiceConcernPairs.length > 0) {\n // Wait until concerns are available from the router\n this.$router.isReady().then(async () => {\n const sanitizedQueryConcerns = sanitizeUrl(this.$route.query.concerns);\n const chosenConcerns = sanitizedQueryConcerns.split(':'); // use for conservation practices graph\n const concernsToStore = sanitizedQueryConcerns.replace(/:/g, ';'); // use for dynamoDB\n \n // Log data to GA4\n // Should rewrite to log the same object to DynamoDB\n analyticsInstance.track('conservationPracticesDisplayed', {\n name: this.$route.query.name,\n state: this.$route.query.state,\n county: this.$route.query.county,\n organization: this.$route.query.organization,\n role: this.$route.query.role,\n concerns: chosenConcerns\n });\n try {\n await client.graphql({\n query: createData,\n variables: {\n input: {\n name: this.$route.query.name,\n state: this.$route.query.state,\n county: this.$route.query.county,\n organization: this.$route.query.organization,\n role: this.$route.query.role,\n concerns: concernsToStore\n }\n },\n authMode: \"apiKey\"\n });\n } catch(error) {\n console.log(error);\n }\n this.loadPage(chosenConcerns);\n });\n }\n },\n // Run on initialization, the component can be initializaed with defined practicesByConcern\n immediate: true,\n },\n },\n methods: {\n loadPage(chosenConcerns) {\n // All conservation practices related to the chosen concerns\n const relevantConservationPractices = findRelevantConservationPractices(this.practiceConcernPairs, chosenConcerns);\n // Paired to the concerns they're related to\n this.relevantPracticeConcernPairs = filterPracticesByChosenConcerns(this.practiceConcernPairs, chosenConcerns, relevantConservationPractices);\n\n let heatmapWidth = HEATMAP_COLUMN_WIDTH * chosenConcerns.length;\n // Increase width to a minimum if there are a very small number of columns\n if (heatmapWidth < 300) {\n heatmapWidth = 350;\n }\n const heatmapHeight = HEATMAP_ROW_HEIGHT * relevantConservationPractices.size;\n this.createHeatmap(heatmapWidth, heatmapHeight);\n },\n downloadCSV() {\n\n // Retructure practice concern pairs from a list of objects to a list of lists\n // This process prepares it for export in CSV format\n // Before: [{conservation_practice: \"\", concern: \"\", value: \"2\"}, ...]\n // After: [[concerns header], [practice and scores row], [practice and scores row], ...]\n function restructurePracticeConcernPairs(data) {\n // Extract unique column names from the data\n const columns = [...new Set(data.map(item => item.concern))];\n \n // Initialize the table with the first row as column headers\n const table = [['Conservation Practice', ...columns]];\n\n // Group data by conservation practice\n const groupedData = data.reduce((acc, item) => {\n if (!acc[item.conservation_practice]) {\n acc[item.conservation_practice] = {};\n }\n acc[item.conservation_practice][item.concern] = item.value;\n return acc;\n }, {});\n\n // Populate the table rows\n for (const [practice, concerns] of Object.entries(groupedData)) {\n const row = [practice];\n for (const column of columns) {\n row.push(concerns[column] || \"\"); // Fill with empty string if no value exists\n }\n table.push(row);\n }\n return table;\n }\n\n // Restructure concern\n const concernsData = restructurePracticeConcernPairs(this.relevantPracticeConcernPairs);\n const csv = Papa.unparse(concernsData, {header: true});\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'concerns.csv';\n link.click()\n URL.revokeObjectURL(url)\n },\n createHeatmap(heatmapWidth, heatmapHeight) {\n let svg = this.initializeHeatmapSVG(heatmapWidth, heatmapHeight);\n // Apparently the best way to sort the y axis is to sort the source data\n sortByConservationPracticeEffectScores(this.relevantPracticeConcernPairs);\n let conservationPractices = d3.map(this.relevantPracticeConcernPairs, function (d) { return d.conservation_practice; })\n let concerns = d3.map(this.relevantPracticeConcernPairs, function (d) { return d.concern; })\n\n // Add x axis\n let x = d3.scaleBand()\n .range([SIDE_LABEL_OFFSET, heatmapWidth + SIDE_LABEL_OFFSET])\n .domain(concerns)\n .padding(0.05);\n let xAxis = d3.axisTop(x).tickSize(0).scale(x);\n let xAxisObj = svg.append('g')\n .attr('class', 'x axis')\n .attr('transform', 'translate(0,' + TOP_LABEL_OFFSET + ')')\n .style('font-size', 15)\n .call(xAxis);\n xAxisObj.select('.domain').remove();\n xAxisObj.selectAll('.tick text')\n .call(wrapText, x.bandwidth());\n\n // Add y axis \n let y = d3.scaleBand()\n .range([0, heatmapHeight])\n .domain(conservationPractices)\n .padding(0.05);\n // The sidebar is inserted into a different div so that it can remain stationary while \n // the rest of the chart scrolls\n let sidebarSvg = d3.select('#heatmap-sidebar')\n .append('svg')\n .attr('width', SIDE_LABEL_OFFSET)\n .attr('height', heatmapHeight + TOP_LABEL_OFFSET)\n let yAxisObj = sidebarSvg.append('g')\n .style('font-size', 15)\n .attr('transform', 'translate(' + SIDE_LABEL_OFFSET + ',' + TOP_LABEL_OFFSET + ')')\n .call(d3.axisLeft(y).tickSize(0));\n yAxisObj.select('.domain').remove();\n\n // Strip trailing (IRA) from some rows\n yAxisObj.selectAll('.tick text').text(function(t){\n // Using regex selector, find the string \"(IRA)\"\n // Replace that with an empty string\n // Trim remaining trailing whitespace\n return t.replace(/\\(IRA\\)$/, '').trim();\n })\n\n // TODO: Add hoverover descriptions\n //console.log(yAxisObj.selectAll('.tick text'));\n //.forEach(function (d) {\n //let test = d3.select(d).data();//get the data asociated with y axis\n //console.log(test);\n // d3.select(d).on(\"mouseover\", () => { console.log(\"mouseover tick\") })\n // .on(\"mouseleave\", () => { console.log(\"mouseleave tick\") });\n //})\n\n var colorScale = d3.scaleLinear()\n .domain([-2, 1, 0, 1, 2, 3, 4, 5])\n .range(['#ad1313', '#d65151', '#f2efee', '#cde3ee', '#8fc2dc', '#4b94c4', '#2265a3', '#053061'])\n this.addValues(svg, x, y, colorScale);\n this.addLegend(colorScale);\n },\n initializeHeatmapSVG(heatmapWidth, heatmapHeight) {\n let svg = d3.select('#heatmap')\n .append('svg')\n .attr('width', heatmapWidth + SIDE_LABEL_OFFSET)\n .attr('height', heatmapHeight + TOP_LABEL_OFFSET)\n .append('g')\n return svg;\n },\n addValues(svg, x, y, colorScale) {\n let squares = svg.selectAll()\n .data(this.relevantPracticeConcernPairs, function (d) { return d.concern + ':' + d.conservation_practice; })\n .enter();\n\n squares.append('rect')\n .attr('x', function (d) { return x(d.concern) })\n .attr('y', function (d) { return y(d.conservation_practice) + TOP_LABEL_OFFSET })\n .attr('rx', 4)\n .attr('ry', 4)\n .attr('width', x.bandwidth())\n .attr('height', y.bandwidth())\n .style('fill', function (d) { return colorScale(d.value || 0) })\n .style('stroke-width', 4)\n .style('stroke', 'none')\n .style('opacity', 0.8)\n\n squares.insert('text')\n .attr('x', function (d) { return x(d.concern) + x.bandwidth() / 2 })\n .attr('y', function (d) { return y(d.conservation_practice) + TOP_LABEL_OFFSET + y.bandwidth() / 2 })\n // Text looks slightly out of alignment, better when adjusted down by 1 px\n .attr('dy', 1)\n .attr('text-anchor', 'middle')\n .style('alignment-baseline', 'middle')\n .attr('fill', d => valueToTextColor(d.value))\n .attr('font-family', 'sans-serif')\n .text((d) => d.value);\n \n },\n addLegend(colorScale) {\n // All the values that a conservation practice can have aon a concern\n let keys = [-2, -1, 0, 1, 2, 3, 4, 5];\n\n let legendBoxWidth = 40;\n let legendBoxHeight = 25;\n let legendVerticalOffset = 20;\n let legendHorizontalOffset = 190;\n let legendWidth = 400;\n let legendHeight = 65;\n\n let svg = d3.select('#heatmap-legend')\n .append('svg')\n .attr('width', legendWidth + keys.length * (legendBoxWidth + 5))\n .attr('height', legendHeight)\n .attr('transform', 'translate(' + legendHorizontalOffset + ', 0)')\n .append('g')\n\n svg.selectAll('legend-boxes')\n .data(keys)\n .enter()\n .append('rect')\n .attr('x', function (d, i) { return legendHorizontalOffset + i * (legendBoxWidth + 5) })\n .attr('y', legendVerticalOffset)\n .attr('width', legendBoxWidth)\n .attr('height', legendBoxHeight)\n .style('fill', function (d) { return colorScale(d) })\n\n svg.selectAll('legend-numbers')\n .data(keys)\n .enter()\n .append('text')\n .attr('x', function (d, i) { return + legendHorizontalOffset + i * (legendBoxWidth + 5) + legendBoxWidth / 2 })\n .attr('y', legendVerticalOffset + legendBoxHeight / 2)\n .attr('dy', 1)\n .attr('fill', d => valueToTextColor(d))\n // make into function\n .text(function (d) { return d })\n .attr('text-anchor', 'middle')\n .style('alignment-baseline', 'middle')\n\n svg.append('text')\n .attr('x', legendHorizontalOffset - 8)\n .attr('y', legendVerticalOffset + legendBoxHeight / 2 - 10)\n .text('Conservation practice')\n .attr('text-anchor', 'end')\n .style('alignment-baseline', 'middle')\n\n svg.append('text')\n .attr('x', legendHorizontalOffset - 8)\n .attr('y', legendVerticalOffset + legendBoxHeight / 2 + 10)\n .text('has detrimental effect')\n .attr('text-anchor', 'end')\n .style('alignment-baseline', 'middle')\n\n svg.append('text')\n .attr('x', legendHorizontalOffset + 8 * (legendBoxWidth + 5))\n .attr('y', legendVerticalOffset + legendBoxHeight / 2 - 10)\n .text('Conservation practice')\n .attr('text-anchor', 'start')\n .style('alignment-baseline', 'middle')\n\n svg.append('text')\n .attr('x', legendHorizontalOffset + 8 * (legendBoxWidth + 5))\n .attr('y', legendVerticalOffset + legendBoxHeight / 2 + 10)\n .text('has protective effect')\n .attr('text-anchor', 'start')\n .style('alignment-baseline', 'middle')\n },\n exportToPdf() {\n const doc = new jsPDF();\n\n doc.fromHTML(document.body);\n doc.save(\"test.pdf\");\n }\n }\n}\n\n// Choosing a text color that gives good contrast with the color associated\n// with that value\nfunction valueToTextColor(value) {\n return (value == 1 || value == 0) ? 'black' : 'white'\n}\n\n// Copyright 2019–2020 Observable, Inc.\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n// \n// THE SOFTWARE IS PROVIDED 'AS IS' AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n//\n// Adapted from https://gist.github.com/mbostock/7555321\nfunction wrapText(text, width) {\n text.each(function () {\n var text = d3.select(this),\n words = text.text().split(/\\s+/).reverse(),\n word,\n line = [],\n lineNumber = 0,\n lineHeight = 1.1, // ems\n y = text.attr('y'),\n dy = parseFloat(text.attr('dy')),\n tspan = text.text(null).append('tspan').attr('x', 0).attr('y', y).attr('dy', dy + 'em');\n word = words.pop();\n while (word) {\n line.push(word);\n tspan.text(line.join(' '));\n if (tspan.node().getComputedTextLength() > width) {\n line.pop();\n tspan.text(line.join(' '));\n line = [word];\n tspan = text.append('tspan').attr('x', 0).attr('y', y).attr('dy', ++lineNumber * lineHeight + dy + 'em').text(word);\n }\n word = words.pop();\n }\n let tspans = text.selectAll('tspan');\n // lineHeightEms\n let h = 1.05;\n tspans.each(function (d, i) {\n // Calculate the y offset (dy) for each tspan so that the vertical centre\n // of the tspans roughly aligns with the text element's y position.\n let dy = i * h;\n dy -= ((tspans.size() - 1) * h);\n d3.select(this)\n .attr('y', y)\n .attr('dy', dy + 'em');\n });\n });\n}\n\n</script>\n\n<!-- Add 'scoped' attribute to limit CSS to this component only -->\n<style scoped>\n#heatmap {\n overflow-x: scroll;\n padding-left: 10px;\n}\n\n#heatmap-sidebar {\n position: absolute;\n background: white;\n padding-right: 10px;\n}\n\n#heatmap-legend {\n display: absolute;\n margin-left: auto;\n margin-right: auto;\n}\n</style>\n","/* eslint-disable */\n// this is an auto generated file. This will be overwritten\n\nexport const createData = /* GraphQL */ `\n mutation CreateData(\n $input: CreateDataInput!\n $condition: ModelDataConditionInput\n ) {\n createData(input: $input, condition: $condition) {\n id\n name\n state\n county\n organization\n role\n concerns\n createdAt\n updatedAt\n __typename\n }\n }\n`;\nexport const updateData = /* GraphQL */ `\n mutation UpdateData(\n $input: UpdateDataInput!\n $condition: ModelDataConditionInput\n ) {\n updateData(input: $input, condition: $condition) {\n id\n name\n state\n county\n organization\n role\n concerns\n createdAt\n updatedAt\n __typename\n }\n }\n`;\nexport const deleteData = /* GraphQL */ `\n mutation DeleteData(\n $input: DeleteDataInput!\n $condition: ModelDataConditionInput\n ) {\n deleteData(input: $input, condition: $condition) {\n id\n name\n state\n county\n organization\n role\n concerns\n createdAt\n updatedAt\n __typename\n }\n }\n`;\n","import { render } from \"./ConservationPracticeExplorer.vue?vue&type=template&id=668e2030&scoped=true\"\nimport script from \"./ConservationPracticeExplorer.vue?vue&type=script&lang=js\"\nexport * from \"./ConservationPracticeExplorer.vue?vue&type=script&lang=js\"\n\nimport \"./ConservationPracticeExplorer.vue?vue&type=style&index=0&id=668e2030&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-668e2030\"]])\n\nexport default __exports__","import { Amplify } from 'aws-amplify';\nimport amplifyconfig from './amplifyconfiguration.json';\nAmplify.configure(amplifyconfig);\nimport { createApp } from 'vue'\nimport App from './App.vue'\nimport 'bootstrap/dist/css/bootstrap.min.css'\nimport 'bootstrap-icons/font/bootstrap-icons.css'\nimport 'bootstrap/dist/js/bootstrap.bundle.min.js'\n\nimport { createRouter, createWebHistory } from 'vue-router'\n\nimport masonry from 'vue-next-masonry'\n\nimport ConcernPicker from './components/ConcernPicker.vue'\nimport ConservationPracticeExplorer from './components/ConservationPracticeExplorer.vue'\n\nconst routes = [\n { path: '/', component: ConcernPicker, props: true },\n { path: '/explore', component: ConservationPracticeExplorer, props: true },\n]\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n})\n\ncreateApp(App).use(masonry).use(router).mount('#app')\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"125\":\"d7654c05\",\"179\":\"37e04ef5\",\"427\":\"916448d0\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"landowner-tool:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunklandowner_tool\"] = self[\"webpackChunklandowner_tool\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(1394); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_createBlock","_component_router_view","concernsByCategory","$data","practiceConcernPairs","practiceDescriptions","analyticsInstance","Analytics","app","plugins","googleAnalytics","measurementIds","concernsByCategoryFromCsvObj","jsonObj","line","category","push","strip","concern","str","replace","trim","async","loadCsvWithHeader","filePath","csvLines","fetch","then","res","text","csv","Papa","header","complete","results","data","name","dataLoaded","computed","concernsWithPractices","methods","loadDescriptions","descriptionLines","this","loadPractices","loadConcerns","concernsByCategoryLines","mounted","page","__exports__","render","store","reactive","checkedConcerns","state","county","organization","role","intersection","listA","listB","result","elem","includes","ALL_CHECKED","SOME_CHECKED","NONE_CHECKED","__default__","props","inheritAttrs","categoryToggleStates","concernDescriptions","errors","isValid","exploreLink","encodeURIComponent","getConcernString","setTimeout","updateTopLevelCheckmarks","track","watch","validateField","field","concernURLString","join","concernsIntersection","checkboxElement","document","getElementById","length","checked","indeterminate","toggleAll","categoryName","filter","val","class","_createElementVNode","_createTextVNode","href","target","id","_createElementBlock","_Fragment","_hoisted_1","_createVNode","_component_router_link","to","path","default","_withCtx","_hoisted_2","_","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","onClick","_cache","args","$options","downloadCSV","_hoisted_10","createData","client","API","TOP_LABEL_OFFSET","SIDE_LABEL_OFFSET","HEATMAP_COLUMN_WIDTH","HEATMAP_ROW_HEIGHT","findRelevantConservationPractices","chosenConcerns","relevantConservationPractices","Set","pair","add","filterPracticesByChosenConcerns","has","sortByConservationPracticeEffectScores","conservationPracticeCumulativeEffectScores","Number","practiceConcernPairCompareFn","a","b","sort","Name","relevantPracticeConcernPairs","handler","$router","isReady","sanitizedQueryConcerns","sanitizeUrl","$route","query","concerns","split","concernsToStore","graphql","variables","input","authMode","error","console","log","loadPage","immediate","heatmapWidth","heatmapHeight","size","createHeatmap","restructurePracticeConcernPairs","columns","map","item","table","groupedData","reduce","acc","conservation_practice","value","practice","Object","entries","row","column","concernsData","blob","Blob","type","url","URL","createObjectURL","link","createElement","download","click","revokeObjectURL","svg","initializeHeatmapSVG","conservationPractices","d3","d","x","range","domain","padding","xAxis","tickSize","scale","xAxisObj","append","attr","style","call","select","remove","selectAll","wrapText","bandwidth","y","sidebarSvg","yAxisObj","t","colorScale","addValues","addLegend","squares","enter","insert","valueToTextColor","keys","legendBoxWidth","legendBoxHeight","legendVerticalOffset","legendHorizontalOffset","legendWidth","legendHeight","i","exportToPdf","doc","jsPDF","fromHTML","body","save","width","each","word","words","reverse","lineNumber","lineHeight","dy","parseFloat","tspan","pop","node","getComputedTextLength","tspans","h","Amplify","configure","amplifyconfig","routes","component","ConcernPicker","ConservationPracticeExplorer","router","createRouter","history","createWebHistory","createApp","App","use","masonry","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","key","splice","r","n","getter","__esModule","leafPrototypes","getProto","getPrototypeOf","obj","__proto__","mode","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","promise","resolve","reject","Error","loadingEnded","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}