diff --git a/.env b/.env new file mode 100644 index 00000000..f143c46d --- /dev/null +++ b/.env @@ -0,0 +1,6 @@ +GOOGLE_CLOUD_PROJECT=cities-429602 +GOOGLE_CLOUD_BUCKET=minneapolis-basis +SCHEMA=minneapolis +HOST=34.123.100.76 +DATABASE=cities +USERNAME=postgres diff --git a/.gitignore b/.gitignore index 89fa2675..bbeb945f 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,16 @@ tests/.coverage .vscode/launch.json data/sql/counties_database.db data/sql/msa_database.db +.Rproj.user +**/*.RData +**/*.Rhistory + +# data +data/minneapolis/processed/values_long.csv +data/minneapolis/processed/values_with_parking.csv +data/minneapolis/sourced/demographic/** +data/minneapolis/preds/** +data/minneapolis/sourced/parcel_to_census_tract_mappings/** +data/minneapolis/sourced/parcel_to_parking_info_mappings/** + +data/minneapolis/.pgpass diff --git a/README.md b/README.md index 2a5b125c..4dfa19a9 100644 --- a/README.md +++ b/README.md @@ -3,19 +3,52 @@
-## Evaluating Policy Transfer via Similarity Analysis and Causal Inference +# Evaluating Policy Transfer via Similarity Analysis and Causal Inference + + +## Getting started + + +Welcome to the repository for [polis](http://polis.basis.ai/), developed by [Basis Research Institute](https://www.basis.ai/) for [The Opportunity Project (TOP)](https://opportunity.census.gov/) 2023 in collaboration with the U.S. Department of Commerce. The primary goal of this project is to enhance access to data for local policymakers, facilitating more informed decision-making. + +This is the backend repository for more advanced users. For a more pleasant frontend experience and more information, please use the [app](http://polis.basis.ai/). + + +Installation +------------ + +**Basic Setup:** + +```sh + + git clone git@github.com:BasisResearch/cities.git + cd cities + git checkout main + pip install . ``` -python -m venv venv -source venv/bin/activate -pip install -r requirements.txt -pip install -e . -cd tests && python -m pytest + +The above will install the minimal version that's ported to [polis.basis.ai](http://polis.basis.ai) + +**Dev Setup:** + +To install dev dependencies, needed to run models, train models and run all the tests, run the following command: + +```sh +pip install -e .[dev] ``` +Details of which packages are available in which see `setup.py`. -Welcome to the repository for [polis](http://polis.basis.ai/), developed by the [Basis Research Institute](https://www.basis.ai/) for [The Opportunity Project (TOP)](https://opportunity.census.gov/) 2023 in collaboration with the U.S. Department of Commerce. The primary goal of this project is to enhance access to data for local policymakers, facilitating more informed decision-making. -This is the backend repository for more advanced users. For a more pleasant frontend experience and more information, please use the [app](http://polis.basis.ai/). +** Contributing: ** + +Before submitting a pull request, please autoformat code and ensure that unit tests pass locally + +```sh +make lint # linting +make format # runs black and isort, including on notebooks in the docs/ folder +make tests # linting, unit and notebook tests +``` ### The repository is structured as follows: @@ -36,11 +69,24 @@ This is the backend repository for more advanced users. For a more pleasant fron └── tests ``` +**WARNING: during the beta testing, the most recent version lives on the `staging-county-data` git branch, and so do the most recent versions of the notebooks. Please switch to this branch before inspecting the notebooks. If you're interested in downloading the data or exploring advanced features beyond the frontend, check out the `guides` folder in the `docs` directory. There, you'll find: - `data_sources.ipynb` for information on data sources, +- `similarity-conceptual.ipynb` for a conceptual account of how similarity comparison works. +- `counterfactual-explained.ipynb` contains a rough explanation of how our causal model works. - `similarity_demo.ipynb` demonstrating the use of the `DataGrabber` class for easy data acces, and of our `FipsQuery` class, which is the key tool in the similarity-focused part of the project, - `causal_insights_demo.ipynb` for an overview of how the `CausalInsight` class can be used to explore the influence of a range of intervention variables thanks to causal inference tools we employed. [WIP] -Feel free to dive into these resources to gain deeper insights into the capabilities of the Polis project, or to reach out if you have any comments or suggestions. +## Interested? We'd love to hear from you. + +[polis](http://polis.basis.ai/) is a research tool under very active development, and we are eager to hear feedback from users in the policymaking and public administration spaces to accelerate its benefit. + +If you have feature requests, recommendations for new data sources, tips for how to resolve missing data issues, find bugs in the tool (they certainly exist!), or anything else, please do not hesitate to contact us at polis@basis.ai. + +To stay up to date on our latest features, you can subscribe to our [mailing list](https://dashboard.mailerlite.com/forms/102625/110535550672308121/share). In the near-term, we will send out a notice about our upcoming batch of improvements (including performance speedups, support for mobile, and more comprehensive tutorials), as well as an interest form for users who would like to work closely with us on case studies to make the tool most useful in their work. + +Lastly, we emphasize that this website is still in beta testing, and hence all predictions should be taken with a grain of salt. + +Acknowledgments: polis was built by Basis, a non-profit AI research organization dedicated to creating automated reasoning technology that helps solve society's most intractable problems. To learn more about us, visit https://basis.ai. diff --git a/cities/modeling/model_interactions.py b/cities/modeling/model_interactions.py index 8232410f..2446d6d5 100644 --- a/cities/modeling/model_interactions.py +++ b/cities/modeling/model_interactions.py @@ -3,10 +3,10 @@ from typing import Optional import dill +import pyro import pyro.distributions as dist import torch -import pyro from cities.modeling.modeling_utils import ( prep_wide_data_for_inference, train_interactions_model, diff --git a/cities/modeling/modeling_utils.py b/cities/modeling/modeling_utils.py index 966a0ba5..55aaccc6 100644 --- a/cities/modeling/modeling_utils.py +++ b/cities/modeling/modeling_utils.py @@ -2,13 +2,13 @@ import matplotlib.pyplot as plt import pandas as pd +import pyro import torch from pyro.infer import SVI, Trace_ELBO from pyro.infer.autoguide import AutoNormal from pyro.optim import Adam # type: ignore from scipy.stats import spearmanr -import pyro from cities.utils.data_grabber import ( DataGrabber, list_available_features, diff --git a/cities/queries/causal_insight.py b/cities/queries/causal_insight.py index 187855ea..7a7a7e98 100644 --- a/cities/queries/causal_insight.py +++ b/cities/queries/causal_insight.py @@ -5,10 +5,10 @@ import numpy as np import pandas as pd import plotly.graph_objects as go +import pyro import torch from sklearn.preprocessing import StandardScaler -import pyro from cities.modeling.model_interactions import model_cities_interaction from cities.modeling.modeling_utils import prep_wide_data_for_inference from cities.utils.cleaning_utils import ( @@ -576,7 +576,8 @@ def estimate_ATE(self): label=f"mean = {tau_samples.mean():.3f}", ) plt.title( - f"ATE for {self.intervention_dataset} and {self.outcome_dataset} with forward shift = {self.forward_shift}" + f"ATE for {self.intervention_dataset} and {self.outcome_dataset} " + f"with forward shift = {self.forward_shift}" ) plt.ylabel("counts") plt.xlabel("ATE") diff --git a/dbt/.gitignore b/dbt/.gitignore new file mode 100644 index 00000000..23e952a5 --- /dev/null +++ b/dbt/.gitignore @@ -0,0 +1,3 @@ +target/ +dbt_packages/ +logs/ \ No newline at end of file diff --git a/dbt/README.md b/dbt/README.md new file mode 100644 index 00000000..7874ac84 --- /dev/null +++ b/dbt/README.md @@ -0,0 +1,15 @@ +Welcome to your new dbt project! + +### Using the starter project + +Try running the following commands: +- dbt run +- dbt test + + +### Resources: +- Learn more about dbt [in the docs](https://docs.getdbt.com/docs/introduction) +- Check out [Discourse](https://discourse.getdbt.com/) for commonly asked questions and answers +- Join the [chat](https://community.getdbt.com/) on Slack for live discussions and support +- Find [dbt events](https://events.getdbt.com) near you +- Check out [the blog](https://blog.getdbt.com/) for the latest news on dbt's development and best practices diff --git a/dbt/analyses/.gitkeep b/dbt/analyses/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/dbt/dbt_project.yml b/dbt/dbt_project.yml new file mode 100644 index 00000000..34355ccf --- /dev/null +++ b/dbt/dbt_project.yml @@ -0,0 +1,29 @@ + +# Name your project! Project names should contain only lowercase characters +# and underscores. A good package name should reflect your organization's +# name or the intended use of these models +name: 'cities' +version: '1.0.0' + +# This setting configures which "profile" dbt uses for this project. +profile: 'cities' + +# These configurations specify where dbt should look for different types of files. +# The `model-paths` config, for example, states that models in this project can be +# found in the "models/" directory. You probably won't need to change these! +model-paths: ["models"] +analysis-paths: ["analyses"] +test-paths: ["tests"] +seed-paths: ["seeds"] +macro-paths: ["macros"] +snapshot-paths: ["snapshots"] + +clean-targets: # directories to be removed by `dbt clean` + - "target" + - "dbt_packages" + + +vars: + srid: 26915 # use UTM zone 15N for all geometric data. note, this must have meters as the unit of measure + # years for which we have census tract/block group data + census_years: [2010, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023] diff --git a/dbt/macros/.gitkeep b/dbt/macros/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/dbt/macros/median.sql b/dbt/macros/median.sql new file mode 100644 index 00000000..131339f9 --- /dev/null +++ b/dbt/macros/median.sql @@ -0,0 +1,3 @@ +{% macro median(attr) %} +(percentile_cont(0.5) within group (order by {{ attr }})) +{% endmacro %} diff --git a/dbt/macros/safe_divide.sql b/dbt/macros/safe_divide.sql new file mode 100644 index 00000000..7d1d5723 --- /dev/null +++ b/dbt/macros/safe_divide.sql @@ -0,0 +1,3 @@ +{% macro safe_divide(num, dem) %} + (case when {{ dem }} = 0 then 0 else {{ num }} / {{ dem }} end) +{% endmacro %} diff --git a/dbt/macros/standardize.sql b/dbt/macros/standardize.sql new file mode 100644 index 00000000..742e971f --- /dev/null +++ b/dbt/macros/standardize.sql @@ -0,0 +1,13 @@ +{% macro standardize_cont(columns) %} + {% for c in columns %} + {{ c }} as {{ c }}_original, (({{ c }} - (avg({{ c }}) over ())) / (stddev_samp({{ c }}) over ()))::double precision as {{ c }} + {% if not loop.last %},{% endif %} + {% endfor %} +{% endmacro %} + +{% macro standardize_cat(columns) %} + {% for c in columns %} + {{ c }} as {{ c }}_original, (dense_rank() over (order by {{ c }})) - 1 as {{ c }} + {% if not loop.last %},{% endif %} + {% endfor %} +{% endmacro %} diff --git a/dbt/macros/tag_regions.sql b/dbt/macros/tag_regions.sql new file mode 100644 index 00000000..ae76c040 --- /dev/null +++ b/dbt/macros/tag_regions.sql @@ -0,0 +1,69 @@ +-- Tag regions with their containing/most intersecting/closest parent regions. +-- child_table: table with the child regions +-- parent_table: table with the parent regions +-- max_distance: maximum distance to consider a region as a parent (meters) +{% macro tag_regions(child_table, parent_table, max_distance=100) %} +( +-- the not materialized keyword allows us to use indexes on the child and parent +-- tables +with child as not materialized ( + select * from {{child_table}} +) +, parent as not materialized ( + select * from {{parent_table}} +) +, within as ( + select child.id as child_id + , parent.id as parent_id + , child.valid * parent.valid as valid + from + child + inner join parent + on ST_Within (child.geom, parent.geom) + and child.valid && parent.valid +) +, not_within as ( + select * from child + where not exists (select child_id from within where child_id = id) +) +, largest_overlap as ( + select distinct on (child.id) + child.id as child_id + , parent.id as parent_id + , child.valid * parent.valid as valid + from + not_within as child + inner join parent + on ST_Intersects (child.geom, parent.geom) + and child.valid && parent.valid + order by + child_id, + ST_Area (ST_Intersection (child.geom, parent.geom)) desc +) +, no_overlap as ( + select * from not_within + where not exists ( + select child_id from largest_overlap where child_id = id + ) +) +, closest as ( + select distinct on (child.id) + child.id as child_id + , parent.id as parent_id + , child.valid * parent.valid as valid + from + no_overlap as child + inner join parent + on child.valid && parent.valid + and ST_DWithin (child.geom, parent.geom, {{max_distance}}) + order by + child_id, + ST_Distance (child.geom, parent.geom) +) +select *, 'within' as type_ from within +union all +select *, 'most_overlap' as type_ from largest_overlap +union all +select *, 'closest' as type_ from closest +) +{% endmacro %} diff --git a/dbt/models/acs_block_group.sql b/dbt/models/acs_block_group.sql new file mode 100644 index 00000000..ea77a2b4 --- /dev/null +++ b/dbt/models/acs_block_group.sql @@ -0,0 +1,15 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['census_block_group', 'year_', 'name_'], 'unique': true}, + ] + ) +}} + +select + year::smallint as year_, + code as name_, + statefp || countyfp || tractce || blkgrpce as census_block_group, + case when "value" < 0 then null else "value" end as value_ +from {{ source('minneapolis', 'acs_bg_raw') }} diff --git a/dbt/models/acs_tract.sql b/dbt/models/acs_tract.sql new file mode 100644 index 00000000..3a4d1b74 --- /dev/null +++ b/dbt/models/acs_tract.sql @@ -0,0 +1,15 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['census_tract', 'year_', 'name_'], 'unique': true}, + ] + ) +}} + +select + year::smallint as year_, + code as name_, + statefp || countyfp || tractce as census_tract, + case when "value" < 0 then null else "value" end as value_ +from {{ source('minneapolis', 'acs_tract_raw') }} diff --git a/dbt/models/api/api__census_tracts.sql b/dbt/models/api/api__census_tracts.sql new file mode 100644 index 00000000..5208ae44 --- /dev/null +++ b/dbt/models/api/api__census_tracts.sql @@ -0,0 +1,16 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['year_']} + ] + ) +}} + +with census_tracts as (select * from {{ ref('census_tracts_in_city_boundary') }}) +select + census_tract + , year_ + , st_transform(geom, 4269) as geom +from + census_tracts diff --git a/dbt/models/api/api__demographics.sql b/dbt/models/api/api__demographics.sql new file mode 100644 index 00000000..ca9104bd --- /dev/null +++ b/dbt/models/api/api__demographics.sql @@ -0,0 +1,34 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['description']} + ] + ) +}} + +-- This is used by the web app. It has a row for each tract, demographic +-- variable pair and a column for each year. +with +demographics as (select * from {{ ref('demographics') }}), +census_tracts as (select * from {{ ref('census_tracts_in_city_boundary') }}), +demographics_filtered as ( + select demographics.* + from demographics + inner join census_tracts using (census_tract, year_) +), +final_ as ( + select + description, + census_tract as tract_id, + {{ dbt_utils.pivot('year_', + dbt_utils.get_column_values(ref('demographics'), + 'year_', + order_by='year_'), + then_value='value_', + else_value='null', + agg='max') }} + from demographics_filtered + group by 1, 2 +) +select * from final_ diff --git a/dbt/models/api/api__high_frequency_transit_lines.sql b/dbt/models/api/api__high_frequency_transit_lines.sql new file mode 100644 index 00000000..3e445e5b --- /dev/null +++ b/dbt/models/api/api__high_frequency_transit_lines.sql @@ -0,0 +1,17 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['valid']} + ] + ) +}} + +select + high_frequency_transit_line_id, + valid, + st_transform(geom, 4269) as geom, + st_transform(blue_zone_geom, 4269) as blue_zone_geom, + st_transform(yellow_zone_geom, 4269) as yellow_zone_geom +from + {{ ref('high_frequency_transit_lines') }} diff --git a/dbt/models/census_block_groups.sql b/dbt/models/census_block_groups.sql new file mode 100644 index 00000000..b33a6aea --- /dev/null +++ b/dbt/models/census_block_groups.sql @@ -0,0 +1,57 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['census_block_group_id'], 'unique': true}, + {'columns': ['geom'], 'type': 'gist'}, + {'columns': ['valid', 'geom'], 'type': 'gist'} + ] + ) +}} + +with +census_tracts as (select * from {{ ref("census_tracts") }}), +census_block_groups as ( + {% for year_ in var('census_years') %} + select + {% if year_ == 2010 %} + state as statefp + , county countyfp + , tract as tractce + , blkgrp as blkgrpce + , geo_id as geoidfq + , '[,2013-01-01)'::daterange as valid -- use 2010 data for all years before 2013 + {% else %} + statefp + , countyfp + , tractce + , blkgrpce + , {{ 'geoidfq' if year_ >= 2023 else 'affgeoid' }} as geoidfq + , '[{{ year_ }}-01-01,{{ year_ + 1 }}-01-01)'::daterange as valid + {% endif %} + , {{ year_ }} as year_ + , st_transform(geom, {{ var("srid") }}) as geom + from + {{ source('minneapolis', 'census_cb_' ~ year_ ~ '_27_bg_500k') }} + {% if not loop.last %}union all{% endif %} + {% endfor %} +), +census_block_groups_with_tracts as ( + select + census_block_groups.statefp + , census_block_groups.countyfp + , census_block_groups.tractce + , census_block_groups.blkgrpce + , census_block_groups.geoidfq + , census_tracts.census_tract_id + , (census_block_groups.valid * census_tracts.valid) as valid + , census_block_groups.geom + from census_block_groups + inner join census_tracts using (statefp, countyfp, tractce) + where + census_tracts.valid && census_block_groups.valid +) +select + {{ dbt_utils.generate_surrogate_key(['geoidfq', 'valid']) }} as census_block_group_id, + * +from census_block_groups_with_tracts diff --git a/dbt/models/census_tracts.sql b/dbt/models/census_tracts.sql new file mode 100644 index 00000000..50462489 --- /dev/null +++ b/dbt/models/census_tracts.sql @@ -0,0 +1,71 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['census_tract_id'], 'unique': true}, + {'columns': ['valid', 'geom'], 'type': 'gist'}, + {'columns': ['year_']} + ] + ) +}} + +with census_tracts_union as ( + {% for year_ in var('census_years') %} +select + {% if year_ == 2010 %} + state as statefp + , county as countyfp + , tract as tractce + , geo_id as geoidfq + {% else %} + statefp + , countyfp + , tractce + , {{ 'geoidfq' if year_ >= 2023 else 'affgeoid' }} as geoidfq + {% endif %} + , '[{{year_}}-01-01,{{ year_ + 1 }}-01-01)'::daterange as valid + , {{ year_ }} as year_ + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'census_cb_' ~ year_ ~ '_27_tract_500k') }} +{% if not loop.last %}union all{% endif %} +{% endfor %} +), +years_2011_2012 as ( + select + statefp + , countyfp + , tractce + , geoidfq + , '[2011-01-01,2012-01-01)'::daterange as valid + , 2011 as year_ + , geom + from census_tracts_union + where year_ = 2010 + union all + select + statefp + , countyfp + , tractce + , geoidfq + , '[2012-01-01,2013-01-01)'::daterange as valid + , 2012 as year_ + , geom + from census_tracts_union + where year_ = 2010 +), +add_2011_2012 as ( + select * + from census_tracts_union + union all + select * + from years_2011_2012 +), +with_census_tract as ( + select *, statefp || countyfp || tractce as census_tract + from add_2011_2012 +) +select + {{ dbt_utils.generate_surrogate_key(['geoidfq', 'year_']) }} as census_tract_id, * +from + with_census_tract diff --git a/dbt/models/census_tracts_in_city_boundary.sql b/dbt/models/census_tracts_in_city_boundary.sql new file mode 100644 index 00000000..5a2955fc --- /dev/null +++ b/dbt/models/census_tracts_in_city_boundary.sql @@ -0,0 +1,17 @@ +with census_tracts as ( + select * from {{ ref('census_tracts') }} +) +, city_boundary as ( + select * from {{ ref('city_boundary') }} +) +select + census_tracts.census_tract_id + , census_tracts.valid + , census_tracts.census_tract + , census_tracts.year_ + , census_tracts.geom +from + census_tracts + , city_boundary +where st_intersects(census_tracts.geom, city_boundary.geom) + and st_area(st_intersection(census_tracts.geom, city_boundary.geom)) / st_area(census_tracts.geom) > 0.9 diff --git a/dbt/models/city_boundary.sql b/dbt/models/city_boundary.sql new file mode 100644 index 00000000..d9bfa060 --- /dev/null +++ b/dbt/models/city_boundary.sql @@ -0,0 +1,5 @@ +select + ogc_fid as city_boundary_id + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'city_boundary_minneapolis') }} diff --git a/dbt/models/commercial_permits.sql b/dbt/models/commercial_permits.sql new file mode 100644 index 00000000..755de463 --- /dev/null +++ b/dbt/models/commercial_permits.sql @@ -0,0 +1,29 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['commercial_permit_id'], 'unique': true}, + {'columns': ['geom'], 'type': 'gist'} + ] + ) +}} + +with +stg_commercial_permits as (select * from {{ ref('stg_commercial_permits') }}), +stg_commercial_permits_to_parcels as (select * from {{ ref('stg_commercial_permits_to_parcels') }}), +permits_to_first_parcel as ( + select commercial_permit_id, min(parcel_id) as parcel_id + from stg_commercial_permits_to_parcels group by 1 +), + +parcels as (select * from {{ ref('parcels') }}) +select + stg_commercial_permits.*, + permits_to_first_parcel.parcel_id, + parcels.census_block_group_id, + parcels.census_tract_id, + parcels.zcta_id +from + stg_commercial_permits + left join permits_to_first_parcel using (commercial_permit_id) + left join parcels using (parcel_id) diff --git a/dbt/models/demographics.sql b/dbt/models/demographics.sql new file mode 100644 index 00000000..3720dac5 --- /dev/null +++ b/dbt/models/demographics.sql @@ -0,0 +1,45 @@ +-- Demographic data +-- Contains data from the ACS and the computed segregation indexes. +with +acs_tract as (select * from {{ ref('acs_tract') }}), +acs_variables as (select * from {{ ref('acs_variables') }}), +acs_tract_with_description as ( + select + acs_tract.census_tract, + acs_tract.year_, + acs_tract.name_, + acs_variables.description, + acs_tract.value_ + from acs_tract + inner join acs_variables on acs_tract.name_ = acs_variables.variable +), +segregation_indexes as ( + select + census_tract, + year_, + null as name_, + 'segregation_index_' || distribution as description, + segregation_index as value_ + from {{ ref('segregation_indexes') }} +), +demographics as ( + select * from acs_tract_with_description + union all + select * from segregation_indexes +) +-- Fill in data for 2011, 2012 using closest available year. Replace 2020 data +-- with 2019 data to avoid pandemic effects. +, demographics_replace_years as ( + select * from demographics where year_ != 2020 + union all + select census_tract, 2020 as year_, name_, description, value_ + from demographics where year_ = 2019 + union all + select census_tract, 2011 as year_, name_, description, value_ + from demographics where year_ = 2013 + union all + select census_tract, 2012 as year_, name_, description, value_ + from demographics where year_ = 2013 +) +select * +from demographics_replace_years diff --git a/dbt/models/docs.md b/dbt/models/docs.md new file mode 100644 index 00000000..fd74fa38 --- /dev/null +++ b/dbt/models/docs.md @@ -0,0 +1,184 @@ +{% docs commercial_permits %} + +Contains commercial building permit applications. + +Notes: + - Permits are filtered to only include those in Minneapolis. + - `square_feet` is treated as missing if it is 0. + - When mapping permits to parcels, if more than one parcel contains the permit + location, a parcel will be chosen arbitrarily. This can happen because the + same parcel spatial extent can appear multiple times with different PINs, to + represent e.g. units in a condominium. + +{% enddocs %} + +{% docs residential_permits %} + +Contains residential building permit applications. + +Notes: + - Permits are filtered to only include those in Minneapolis. + - `square_feet` is treated as missing if it is 0. + - `permit_value` is treated as missing if it is 0. + - If more than one parcel contains the permit location, a parcel is selected + arbitrarily. See `commercial_permits`. + +{% enddocs %} + +{% docs parking %} + +Notes: + - If more than one parcel contains the permit location, a parcel is selected + arbitrarily. See `commercial_permits`. + +{% enddocs %} + +{% docs zctas %} + +Contains the geometry and metadata for all zip code tabulation areas (ZCTAs) in +the United States. + +These are not the same as zip codes. Zip codes are created by the postal service, and they change regularly. ZCTAs are created by the census bureau alongside the census. Not every zip code has a corresponding ZCTA (unpopulated zip codes are not represented, for example), and some ZCTAs cover multiple zip codes. + +Use the mapping table `zip_codes_to_zctas` to translate from zip codes to ZCTAs. + +{% enddocs %} + +{% docs parcels %} + +Contains the geometry and metadata for all parcels in the city of Minneapolis. + +Notes: +- Parcels data is released yearly. Parcels are considered valid for the year they were released. +- Parcels are filtered to only include those in Minneapolis. +- `emv_total`, `emv_bldg`, `emv_land`, `year_built`, and `sale_value` are treated as missing if they are 0. +- `sale_date` is treated as missing if it is equal to `1899-12-30`. +- `pin` is the county-assigned parcel identification number. The county prefix '053-' is removed. +- Duplicate rows are removed. Note that this is based on the entire row, not just the `pin`. There may still be duplicate `pin, year_` pairs. + +{% enddocs %} + +{% docs census_tracts %} + +Contains geometry and metadata for census tracts. Currently only includes census +tracts for Minnesota. + +{% enddocs %} + +{% docs census_block_groups %} + +Contains geometry and metadata for census block groups. Currently only includes +census block groups for Minnesota. + +{% enddocs %} + +{% docs acs_block_group %} + +Contains American Community Survey (ACS) demographic data at a census block +group granularity. + +The `name_` column contains the name of the demographic variable (e.g. +`B03002_003E`). See `acs_variables` for a mapping of these codes to +human-readable names. + +{% enddocs %} + +{% docs acs_tract %} + +Contains American Community Survey (ACS) demographic data at a census tract +granularity. + +The `name_` column contains the name of the demographic variable (e.g. +`B03002_003E`). See `acs_variables` for a mapping of these codes to +human-readable names. + +{% enddocs %} + +{% docs fair_market_rents %} + +Contains fair market rent data for different numbers of bedrooms by zip code. + +{% enddocs %} + +{% docs high_frequency_transit_lines %} + +Contains the geometry and metadata for high frequency transit lines in the city of Minneapolis. + +Notes: +- `blue_zone_geom` is a 350 foot buffer around both lines and stops. +- `yellow_zone_geom` is a quarter mile buffer around lines and a half mile buffer around stops. + +{% enddocs %} + +{% docs segregation_indexes %} + +Segregation index for each tract for each year, computed for each reference +distribution. + +The segregation index is the KL-divergence between the distribution of +population in a tract and a reference distribution. For example, a tract that +has many more white people than the average for the city will have a high +segregation index for the 'average_city' distribution. + +Available distributions: +- `uniform`: Uniform distribution. +- `annual_city`: Citywide distribution for the current year. +- `average_city`: Citywide distribution averaged over all available years. + +{% enddocs %} + +{% docs usps_migration %} + +Contains USPS migration data sourced from change of address forms. Migrations +are broken down by month and year, zip_code, flow direction, and flow type. Flow +directions are either `from` (out of) the zip code or `to` (in to) the zip code. + +Flow types are one of `business`, `family`, `individual`, `perm` (permanent), +`temp` (temporary), or `total`. + +We associate zip codes to ZCTAs and provide aggregate flows for ZCTAs. Note that +some zip codes do not find a match in our zip to ZCTA mapping table, so there is +some missingness in this data. + +{% enddocs %} + +{% docs demographics %} + +Contains demographic data at census tract granularity. +Combines ACS data and segregation indexes in one table. + +Notes: +- Fills in missing demographic data from 2011 and 2012 with data from 2013. +- Replaces pandemic-affected data from 2020 with data from 2019. + +{% enddocs %} + +{% docs neighborhoods %} + +Neighborhood boundaries in the city of Minneapolis. + +{% enddocs %} + +{% docs wards %} + +Ward boundaries in the city of Minneapolis. + +{% enddocs %} + +{% docs university %} + +Boundary of the University of Minnesota. + +{% enddocs %} + +{% docs downtown %} + +Boundary of the downtown of Minneapolis. + +{% enddocs %} + +{% docs city_boundary %} + +Boundary of the city of Minneapolis. + +{% enddocs %} diff --git a/dbt/models/downtown.sql b/dbt/models/downtown.sql new file mode 100644 index 00000000..dc3e09cd --- /dev/null +++ b/dbt/models/downtown.sql @@ -0,0 +1,5 @@ +select + ogc_fid as downtown_id + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'downtown') }} diff --git a/dbt/models/fair_market_rents.sql b/dbt/models/fair_market_rents.sql new file mode 100644 index 00000000..620c0457 --- /dev/null +++ b/dbt/models/fair_market_rents.sql @@ -0,0 +1,18 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['zcta_id', 'year_', 'num_bedrooms']} + ] + ) +}} + +with +fair_market_rents as (select * from {{ ref('stg_fair_market_rents_add_zcta') }}) +select + zcta_id, + year_::smallint, + num_bedrooms::smallint, + avg(rent) as rent +from fair_market_rents +group by 1,2,3 diff --git a/dbt/models/high_frequency_transit_lines.sql b/dbt/models/high_frequency_transit_lines.sql new file mode 100644 index 00000000..c27885ca --- /dev/null +++ b/dbt/models/high_frequency_transit_lines.sql @@ -0,0 +1,30 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['high_frequency_transit_line_id'], 'unique': true}, + {'columns': ['valid', 'geom'], 'type': 'gist'}, + ] + ) +}} + +with lines as (select * from {{ ref('stg_high_frequency_transit_lines_union') }}) +, stops as (select * from {{ ref('high_frequency_transit_stops') }}) +, lines_and_stops as ( + select + lines.valid * stops.valid as valid + , lines.geom as line_geom + , stops.geom as stop_geom + from + lines + inner join stops on lines.valid && stops.valid +) +select + {{ dbt_utils.generate_surrogate_key(['valid']) }} as high_frequency_transit_line_id + , valid + , line_geom as geom + -- note units are in meters + , st_buffer(line_geom, 106.7) as blue_zone_geom -- 350 feet + , st_union(st_buffer(line_geom, 402.3), st_buffer(stop_geom, 804.7)) as yellow_zone_geom -- quarter mile around lines and half mile around stops +from + lines_and_stops diff --git a/dbt/models/high_frequency_transit_stops.sql b/dbt/models/high_frequency_transit_stops.sql new file mode 100644 index 00000000..38f40aa0 --- /dev/null +++ b/dbt/models/high_frequency_transit_stops.sql @@ -0,0 +1,10 @@ +with stops_2015 as ( + select + st_union(st_transform(geom, {{ var("srid") }})) as geom + from {{ source('minneapolis', 'high_frequency_transit_2015_freq_rail_stops') }} +) +select + 0 as high_frequency_transit_stop_id + , '[,]'::daterange as valid + , geom +from stops_2015 diff --git a/dbt/models/neighborhoods.sql b/dbt/models/neighborhoods.sql new file mode 100644 index 00000000..bd3da714 --- /dev/null +++ b/dbt/models/neighborhoods.sql @@ -0,0 +1,6 @@ +select + bdnum as neighborhood_id + , bdname as name_ + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'neighborhoods_minneapolis') }} diff --git a/dbt/models/parcels.sql b/dbt/models/parcels.sql new file mode 100644 index 00000000..3cc0f915 --- /dev/null +++ b/dbt/models/parcels.sql @@ -0,0 +1,25 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['parcel_id'], 'unique': true}, + {'columns': ['valid', 'geom'], 'type': 'gist'} + ] + ) +}} + +with +parcels as (select * from {{ ref('stg_parcels') }}), +to_zctas as (select * from {{ref('stg_parcels_to_zctas')}}), +to_census_bgs as (select * from {{ref('stg_parcels_to_census_block_groups')}}), +census_bgs as (select * from {{ref('census_block_groups')}}) +select + parcels.* + , to_zctas.zcta_id + , to_census_bgs.census_block_group_id + , census_bgs.census_tract_id +from + parcels + left join to_zctas using (parcel_id) + left join to_census_bgs using (parcel_id) + left join census_bgs using (census_block_group_id) diff --git a/dbt/models/parking.sql b/dbt/models/parking.sql new file mode 100644 index 00000000..717db5a2 --- /dev/null +++ b/dbt/models/parking.sql @@ -0,0 +1,28 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['parking_id'], 'unique': true}, + {'columns': ['geom'], 'type': 'gist'} + ] + ) +}} + +with + stg_parking as (select * from {{ ref('stg_parking') }}), + stg_parking_to_parcels as (select * from {{ ref('stg_parking_to_parcels') }}), + stg_parking_to_first_parcel as ( + select parking_id, min(parcel_id) as parcel_id + from stg_parking_to_parcels group by 1 + ), + parcels as (select * from {{ ref('parcels') }}) +select + stg_parking.*, + stg_parking_to_first_parcel.parcel_id, + parcels.census_block_group_id, + parcels.census_tract_id, + parcels.zcta_id +from + stg_parking + left join stg_parking_to_first_parcel using (parking_id) + left join parcels using (parcel_id) diff --git a/dbt/models/residential_permits.sql b/dbt/models/residential_permits.sql new file mode 100644 index 00000000..6613e374 --- /dev/null +++ b/dbt/models/residential_permits.sql @@ -0,0 +1,28 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['residential_permit_id'], 'unique': true}, + {'columns': ['geom'], 'type': 'gist'} + ] + ) +}} + +with +stg_residential_permits as (select * from {{ ref('stg_residential_permits') }}), +stg_residential_permits_to_parcels as (select * from {{ ref('stg_residential_permits_to_parcels') }}), +permits_to_first_parcel as ( + select residential_permit_id, min(parcel_id) as parcel_id + from stg_residential_permits_to_parcels group by 1 +), +parcels as (select * from {{ ref('parcels') }}) +select + stg_residential_permits.*, + permits_to_first_parcel.parcel_id, + parcels.census_block_group_id, + parcels.census_tract_id, + parcels.zcta_id +from + stg_residential_permits + left join permits_to_first_parcel using (residential_permit_id) + left join parcels using (parcel_id) diff --git a/dbt/models/schema.yml b/dbt/models/schema.yml new file mode 100644 index 00000000..e3948f2d --- /dev/null +++ b/dbt/models/schema.yml @@ -0,0 +1,240 @@ +sources: + - name: minneapolis + database: cities + schema: minneapolis + tables: + - name: acs_bg_raw + - name: acs_tract_raw + - name: residential_permits_residentialpermits + - name: commercial_permits_nonresidentialconstruction + - name: high_frequency_transit_2015_freq_350_ft_buffer + - name: high_frequency_transit_2015_freq_lines + - name: high_frequency_transit_2015_freq_quarter_and_half_mile_buffer + - name: high_frequency_transit_2015_freq_rail_stops + - name: high_frequency_transit_2016_freq_350_ft_buffer + - name: high_frequency_transit_2016_freq_lines + - name: high_frequency_transit_2016_freq_quarter_and_half_mile_buffer + - name: fair_market_rents_2012 + - name: fair_market_rents_2013 + - name: fair_market_rents_2014 + - name: fair_market_rents_2015 + - name: fair_market_rents_2016 + - name: fair_market_rents_2017 + - name: fair_market_rents_2018 + - name: fair_market_rents_2019 + - name: fair_market_rents_2020 + - name: fair_market_rents_2021 + - name: fair_market_rents_2022 + - name: fair_market_rents_2023 + - name: fair_market_rents_2024 + - name: downtown + - name: university + - name: usps_y2018 + - name: usps_y2019 + - name: usps_y2020 + - name: usps_y2021 + - name: usps_y2022 + - name: usps_y2023 + - name: zip_codes_tl_2020_us_zcta510 + - name: zip_codes_tl_2020_us_zcta520 + - name: zip_codes_zcta_xref + - name: census_cb_2010_27_bg_500k + - name: census_cb_2010_27_tract_500k + - name: census_cb_2013_27_bg_500k + - name: census_cb_2013_27_tract_500k + - name: census_cb_2014_27_bg_500k + - name: census_cb_2014_27_tract_500k + - name: census_cb_2015_27_bg_500k + - name: census_cb_2015_27_tract_500k + - name: census_cb_2016_27_bg_500k + - name: census_cb_2016_27_tract_500k + - name: census_cb_2017_27_bg_500k + - name: census_cb_2017_27_tract_500k + - name: census_cb_2018_27_bg_500k + - name: census_cb_2018_27_tract_500k + - name: census_cb_2019_27_bg_500k + - name: census_cb_2019_27_tract_500k + - name: census_cb_2020_27_bg_500k + - name: census_cb_2020_27_tract_500k + - name: census_cb_2021_27_bg_500k + - name: census_cb_2021_27_tract_500k + - name: census_cb_2022_27_bg_500k + - name: census_cb_2022_27_tract_500k + - name: census_cb_2023_27_bg_500k + - name: census_cb_2023_27_tract_500k + - name: city_boundary_minneapolis + - name: neighborhoods_minneapolis + - name: wards_minneapolis + - name: parcels_shp_plan_regonal_2002_parcels2002hennepin + - name: parcels_shp_plan_regonal_2003_parcels2003hennepin + - name: parcels_shp_plan_regonal_2004_parcels2004hennepin + - name: parcels_shp_plan_regonal_2005_parcels2005hennepin + - name: parcels_shp_plan_regonal_2006_parcels2006hennepin + - name: parcels_shp_plan_regonal_2007_parcels2007hennepin + - name: parcels_shp_plan_regonal_2008_parcels2008hennepin + - name: parcels_shp_plan_regonal_2009_parcels2009hennepin + - name: parcels_shp_plan_regonal_2010_parcels2010hennepin + - name: parcels_shp_plan_regonal_2011_parcels2011hennepin + - name: parcels_shp_plan_regonal_2012_parcels2012hennepin + - name: parcels_shp_plan_regonal_2013_parcels2013hennepin + - name: parcels_shp_plan_regonal_2014_parcels2014hennepin + - name: parcels_shp_plan_regonal_2015_parcels2015hennepin + - name: parcels_shp_plan_regonal_2016_parcels2016hennepin + - name: parcels_shp_plan_regonal_2017_parcels2017hennepin + - name: parcels_shp_plan_regonal_2018_parcels2018hennepin + - name: parcels_shp_plan_regonal_2019_parcels2019hennepin + - name: parcels_shp_plan_regonal_2020_parcels2020hennepin + - name: parcels_shp_plan_regonal_2021_parcels2021hennepin + - name: parcels_shp_plan_regonal_2022_parcels2022hennepin + - name: parcels_shp_plan_regonal_2023_parcels2023hennepin + - name: parking_parcels + +models: + - name: census_tracts + description: '{{ doc("census_tracts") }}' + columns: + - name: census_tract_id + data_tests: + - unique + - not_null + + - name: census_block_groups + description: '{{ doc("census_block_groups") }}' + columns: + - name: census_block_group_id + data_tests: + - unique + - not_null + - name: census_tract_id + data_tests: + - relationships: + to: ref('census_tracts') + field: census_tract_id + + - name: acs_block_group + description: '{{ doc("acs_block_group") }}' + + - name: acs_tract + description: '{{ doc("acs_tract") }}' + + - name: fair_market_rents + description: '{{ doc("fair_market_rents") }}' + + - name: high_frequency_transit_lines + description: '{{ doc("high_frequency_transit_lines") }}' + + - name: demographics + description: '{{ doc("demographics") }}' + + - name: university + description: '{{ doc("university") }}' + + - name: downtown + description: '{{ doc("downtown") }}' + + - name: city_boundary + description: '{{ doc("city_boundary") }}' + + - name: parking + description: '{{ doc("parking") }}' + + - name: segregation_indexes + description: '{{ doc("segregation_indexes") }}' + data_tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - census_tract + - year_ + - distribution + columns: + - name: census_tract + data_tests: + - relationships: + to: ref('census_tracts') + field: census_tract + + - name: parcels + description: '{{ doc("parcels") }}' + columns: + - name: parcel_id + data_tests: + - unique + - not_null + - name: zcta_id + data_tests: + - not_null + - relationships: + to: ref('zctas') + field: zcta_id + - name: census_block_group_id + data_tests: + - relationships: + to: ref('census_block_groups') + field: census_block_group_id + + - name: zctas + description: '{{ doc("zctas") }}' + columns: + - name: zcta_id + data_tests: + - not_null + - unique + + - name: usps_migration + description: '{{ doc("usps_migration") }}' + data_tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - date_ + - zcta_id + - flow_direction + - flow_type + columns: + - name: zcta_id + data_tests: + - relationships: + to: ref('zctas') + field: zcta_id + + - name: commercial_permits + description: '{{ doc("commercial_permits") }}' + columns: + - name: commercial_permit_id + data_tests: + - not_null + - unique + + - name: residential_permits + description: '{{ doc("residential_permits") }}' + columns: + - name: residential_permit_id + data_tests: + - not_null + - unique + + - name: neighborhoods + description: '{{ doc("neighborhoods") }}' + columns: + - name: neighborhood_id + data_tests: + - not_null + - unique + + - name: wards + description: '{{ doc("wards") }}' + columns: + - name: ward_id + data_tests: + - not_null + - unique + +seeds: + - name: population_categories + columns: + - name: category + data_tests: + - unique + - not_null + - relationships: + to: ref('acs_variables') + field: description diff --git a/dbt/models/segregation_indexes.sql b/dbt/models/segregation_indexes.sql new file mode 100644 index 00000000..cdadbc67 --- /dev/null +++ b/dbt/models/segregation_indexes.sql @@ -0,0 +1,108 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['census_tract', 'year_', 'distribution'], 'unique': true}, + ] + ) +}} + +with + categories as (select * from {{ ref("population_categories") }}) + , acs_tract_all as (select * from {{ ref("acs_tract") }}) + , acs_variables as ( + select + variable as name_, + description + from {{ ref("acs_variables") }} + ) + , census_tracts_in_city_boundary as (select * from {{ ref('census_tracts_in_city_boundary') }}) + , acs_tract as ( + select * from acs_tract_all inner join census_tracts_in_city_boundary using (census_tract, year_) + ) + , pop_tyc as + ( -- Population by tract, year, and category + select acs_tract.census_tract, acs_tract.year_, categories.category, acs_tract.value_ + from acs_tract + inner join acs_variables using (name_) + inner join categories on categories.category = acs_variables.description + ), + pop_ty as + ( + select census_tract, year_, sum(value_) as value_ + from pop_tyc + group by 1, 2 + ), + pop_yc as + ( -- Population by year and category + select year_, category, sum(value_) as value_ + from pop_tyc + group by 1, 2 + ), + pop_y as + ( -- Population by year + select year_, sum(value_) as value_ + from pop_tyc + group by 1 + ), + dist_yc as + ( -- Distribution of population by year and category + select + pop_yc.year_, + pop_yc.category, + ({{ safe_divide('pop_yc.value_', 'pop_y.value_') }})::double precision as value_ + from pop_yc inner join pop_y using (year_) + ), + dist_tyc as + ( -- Distribution of population by tract, year, and category + select + pop_tyc.census_tract, + pop_tyc.year_, + pop_tyc.category, + ({{ safe_divide('pop_tyc.value_', 'pop_ty.value_') }})::double precision as value_ + from pop_tyc inner join pop_ty using (year_, census_tract) + ), + uniform_dist as + ( -- Uniform distribution across categories + with n_cat as (select count(*) as n_cat from categories) + select category, (1.0 / n_cat)::double precision as value_ + from categories, n_cat + ), + average_dist as + ( -- Average of the annual citywide distributions + select category, avg(value_)::double precision as value_ + from dist_yc + group by 1 + ) +select + census_tract, + year_, + dist as distribution, + sum(case when p = 0 or q = 0 then 0 else p * ln(p / q) end) as segregation_index +from + ( + select + dist_tyc.census_tract, + dist_tyc.year_, + dist_tyc.value_ as p, + uniform_dist.value_ as q, + 'uniform' as dist + from dist_tyc inner join uniform_dist using (category) + union all + select + dist_tyc.census_tract, + dist_tyc.year_, + dist_tyc.value_ as p, + dist_yc.value_ as q, + 'annual_city' as dist + from dist_tyc inner join dist_yc using (year_, category) + union all + select + dist_tyc.census_tract, + dist_tyc.year_, + dist_tyc.value_ as p, + average_dist.value_ as q, + 'average_city' as dist + from dist_tyc inner join average_dist using (category) + ) +group by 1, 2, 3 diff --git a/dbt/models/staging/schema.yml b/dbt/models/staging/schema.yml new file mode 100644 index 00000000..dccd58b5 --- /dev/null +++ b/dbt/models/staging/schema.yml @@ -0,0 +1,14 @@ +models: + - name: stg_zctas_2010 + columns: + - name: zcta + data_tests: + - not_null + - unique + + - name: stg_zctas_2020 + columns: + - name: zcta + data_tests: + - not_null + - unique diff --git a/dbt/models/staging/stg_commercial_permits.sql b/dbt/models/staging/stg_commercial_permits.sql new file mode 100644 index 00000000..af5aec34 --- /dev/null +++ b/dbt/models/staging/stg_commercial_permits.sql @@ -0,0 +1,18 @@ +select + sde_id as commercial_permit_id + , year::smallint as year_ + , nonres_gro::text as group_ + , nonres_sub::text as subgroup + , nonres_typ::text as type_category + , bldg_name::text as building_name + , bldg_desc::text as building_description + , permit_typ::text as permit_type + , permit_val::int as permit_value + , nullif(sqf, 0)::int as square_feet + , address::text + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'commercial_permits_nonresidentialconstruction') }} + where + co_code = '053' + and lower(ctu_name) = 'minneapolis' diff --git a/dbt/models/staging/stg_commercial_permits_to_parcels.sql b/dbt/models/staging/stg_commercial_permits_to_parcels.sql new file mode 100644 index 00000000..bbc44326 --- /dev/null +++ b/dbt/models/staging/stg_commercial_permits_to_parcels.sql @@ -0,0 +1,21 @@ +with +commercial_permits as ( + select + commercial_permit_id as id + , daterange(to_date(year_::text, 'YYYY'), to_date(year_::text, 'YYYY'), '[]') as valid + , geom + from {{ ref('stg_commercial_permits') }} +) +, parcels as ( + select + parcel_id as id + , valid + , geom + from {{ ref("parcels") }} +) +select + child_id as commercial_permit_id + , parent_id as parcel_id + , valid + , type_ +from {{ tag_regions("commercial_permits", "parcels") }} diff --git a/dbt/models/staging/stg_fair_market_rents_add_zcta.sql b/dbt/models/staging/stg_fair_market_rents_add_zcta.sql new file mode 100644 index 00000000..de2fdcba --- /dev/null +++ b/dbt/models/staging/stg_fair_market_rents_add_zcta.sql @@ -0,0 +1,18 @@ +with +stg_fair_market_rents_unpivot as ( + select * from {{ ref('stg_fair_market_rents_dedup') }} +), +zip_codes_to_zctas as (select * from {{ ref('zip_codes_to_zctas') }}), +zctas as (select * from {{ ref('zctas') }}) +select + stg_fair_market_rents_unpivot.zip_code, + stg_fair_market_rents_unpivot.year_::smallint, + stg_fair_market_rents_unpivot.num_bedrooms::smallint, + stg_fair_market_rents_unpivot.rent::smallint, + zctas.zcta_id +from + stg_fair_market_rents_unpivot + left join zip_codes_to_zctas using (zip_code) + left join zctas + on zip_codes_to_zctas.zcta = zctas.zcta + and (stg_fair_market_rents_unpivot.year_ || '-01-01')::date <@ zctas.valid diff --git a/dbt/models/staging/stg_fair_market_rents_dedup.sql b/dbt/models/staging/stg_fair_market_rents_dedup.sql new file mode 100644 index 00000000..fec86c06 --- /dev/null +++ b/dbt/models/staging/stg_fair_market_rents_dedup.sql @@ -0,0 +1 @@ +select distinct * from {{ ref('stg_fair_market_rents_unpivot') }} diff --git a/dbt/models/staging/stg_fair_market_rents_union.sql b/dbt/models/staging/stg_fair_market_rents_union.sql new file mode 100644 index 00000000..5bf52020 --- /dev/null +++ b/dbt/models/staging/stg_fair_market_rents_union.sql @@ -0,0 +1,15 @@ +{% set years = range(2012, 2025) %} + +{% for year_ in years %} +select + zip_code + , replace(rent_br0, '.00', '') as rent_br0 + , replace(rent_br1, '.00', '') as rent_br1 + , replace(rent_br2, '.00', '') as rent_br2 + , replace(rent_br3, '.00', '') as rent_br3 + , replace(rent_br4, '.00', '') as rent_br4 + , year as year_ +from + {{ source('minneapolis', 'fair_market_rents_' ~ year_) }} +{% if not loop.last %} union all {% endif %} +{% endfor %} diff --git a/dbt/models/staging/stg_fair_market_rents_unpivot.sql b/dbt/models/staging/stg_fair_market_rents_unpivot.sql new file mode 100644 index 00000000..92e64612 --- /dev/null +++ b/dbt/models/staging/stg_fair_market_rents_unpivot.sql @@ -0,0 +1,16 @@ +with +stg_fair_market_rents_dedup as (select * from {{ ref('stg_fair_market_rents_union') }}) +select + stg_fair_market_rents_dedup.zip_code, + stg_fair_market_rents_dedup.year_, + x.num_bedrooms, + x.rent +from + stg_fair_market_rents_dedup + cross join lateral ( + values (0, rent_br0), + (1, rent_br1), + (2, rent_br2), + (3, rent_br3), + (4, rent_br4) + ) as x(num_bedrooms, rent) diff --git a/dbt/models/staging/stg_high_frequency_transit_lines_union.sql b/dbt/models/staging/stg_high_frequency_transit_lines_union.sql new file mode 100644 index 00000000..4de6bbdb --- /dev/null +++ b/dbt/models/staging/stg_high_frequency_transit_lines_union.sql @@ -0,0 +1,24 @@ +with +lines_2015 as ( + select + st_union(st_transform(geom, {{ var("srid") }})) as geom + from + {{ source('minneapolis', 'high_frequency_transit_2015_freq_lines') }} + where st_geometrytype(geom) = 'ST_MultiLineString' +), +lines_2016 as ( + select + st_union(st_transform(geom, {{ var("srid") }})) as geom + from + {{ source('minneapolis', 'high_frequency_transit_2016_freq_lines') }} + where st_geometrytype(geom) = 'ST_MultiLineString' +) +select + '(,2016-01-01)'::daterange as valid, + geom +from lines_2015 +union all +select + '[2016-01-01,)'::daterange as valid, + geom +from lines_2016 diff --git a/dbt/models/staging/stg_parcels.sql b/dbt/models/staging/stg_parcels.sql new file mode 100644 index 00000000..83b9c77a --- /dev/null +++ b/dbt/models/staging/stg_parcels.sql @@ -0,0 +1,55 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['parcel_id'], 'unique': true}, + {'columns': ['valid', 'geom'], 'type': 'gist'} + ] + ) +}} + +{% set years = range(2002, 2024) %} +{% set city = 'MINNEAPOLIS' %} +{% set county_id = '053' %} + +with +-- This is a union of all the parcels from the years 2002 to 2023 +parcels_union as ( + {% for year_ in years %} + select + ogc_fid, + replace(pin, '{{ county_id }}-', '') as pin, + + -- parcels are a year-end snapshot, named after the year they cover + '[{{ year_ }}-01-01,{{ year_ + 1 }}-01-01)'::daterange as valid, + nullif(emv_land, 0)::int as emv_land, + nullif(emv_bldg, 0)::int as emv_bldg, + nullif(emv_total, 0)::int as emv_total, + nullif(year_built, 0)::smallint as year_built, + nullif(sale_date, '1899-12-30'::date) as sale_date, + nullif(sale_value, 0)::int as sale_value, + st_transform(geom, {{ var("srid") }}) as geom + from {{ source('minneapolis', 'parcels_shp_plan_regonal_' ~ year_ ~ '_parcels' ~ year_ ~ 'hennepin') }} + where upper({{ "city" if year_ < 2018 else "ctu_name" }}) = '{{ city }}' + {% if not loop.last %}union all{% endif %} + {% endfor %} +), + +-- Some of the parcel datasets contain exact duplicates that we remove. Note +-- that duplicate pin/year pairs may remain. +parcels_distinct as ( + select distinct on (pin, valid, emv_land, emv_bldg, emv_total, year_built, sale_date, sale_value, geom) * + from parcels_union +) +select + {{ dbt_utils.generate_surrogate_key(['ogc_fid', 'valid']) }} as parcel_id, + pin, + valid, + emv_land, + emv_bldg, + emv_total, + year_built, + sale_date, + sale_value, + geom +from parcels_distinct diff --git a/dbt/models/staging/stg_parcels_to_census_block_groups.sql b/dbt/models/staging/stg_parcels_to_census_block_groups.sql new file mode 100644 index 00000000..d65f230f --- /dev/null +++ b/dbt/models/staging/stg_parcels_to_census_block_groups.sql @@ -0,0 +1,21 @@ +with +parcels as ( + select + parcel_id as id + , valid + , geom + from {{ ref('stg_parcels') }} +), +census_block_groups as ( + select + census_block_group_id as id + , valid + , geom + from {{ ref('census_block_groups') }} +) +select + child_id as parcel_id + , parent_id as census_block_group_id + , valid + , type_ +from {{ tag_regions("parcels", "census_block_groups") }} diff --git a/dbt/models/staging/stg_parcels_to_zctas.sql b/dbt/models/staging/stg_parcels_to_zctas.sql new file mode 100644 index 00000000..680e304e --- /dev/null +++ b/dbt/models/staging/stg_parcels_to_zctas.sql @@ -0,0 +1,21 @@ +with +parcels as ( + select + parcel_id as id + , valid + , geom + from {{ ref("stg_parcels") }} +), +zctas as ( + select + zcta_id as id + , valid + , geom + from {{ ref("zctas") }} +) +select + child_id as parcel_id + , parent_id as zcta_id + , valid + , type_ +from {{ tag_regions("parcels", "zctas") }} diff --git a/dbt/models/staging/stg_parking.sql b/dbt/models/staging/stg_parking.sql new file mode 100644 index 00000000..61667cb0 --- /dev/null +++ b/dbt/models/staging/stg_parking.sql @@ -0,0 +1,15 @@ +with +parking_raw as (select * from {{ source('minneapolis', 'parking_parcels') }}) +select + ogc_fid as parking_id + , to_date("year" || '-' || "date", 'YYYY-DD-Mon') as date_ + , "project na"::text as project_name + , address::text + , neighborho::text as neighborhood + , ward::smallint + , "downtown y" = 'Y' as is_downtown + , "housing un"::smallint as num_housing_units + , "car parkin"::smallint as num_car_parking_spaces + , replace("bike parki", ',', '')::smallint as num_bike_parking_spaces + , st_transform(geom, {{ var("srid") }}) as geom +from parking_raw diff --git a/dbt/models/staging/stg_parking_to_parcels.sql b/dbt/models/staging/stg_parking_to_parcels.sql new file mode 100644 index 00000000..6e708e17 --- /dev/null +++ b/dbt/models/staging/stg_parking_to_parcels.sql @@ -0,0 +1,21 @@ +with + parking as ( + select + parking_id as id + , daterange(date_, date_, '[]') as valid + , geom + from {{ ref('stg_parking') }} + ) + , parcels as ( + select + parcel_id as id + , valid + , geom + from {{ ref('parcels') }} + ) +select + child_id as parking_id + , parent_id as parcel_id + , valid + , type_ +from {{ tag_regions("parking", "parcels") }} diff --git a/dbt/models/staging/stg_residential_permits.sql b/dbt/models/staging/stg_residential_permits.sql new file mode 100644 index 00000000..c6788cc4 --- /dev/null +++ b/dbt/models/staging/stg_residential_permits.sql @@ -0,0 +1,25 @@ +select + sde_id::int as residential_permit_id + , year::smallint as year_ + , tenure::text + , housing_ty::text as housing_type + , res_permit::text as permit_type + , address::text + , name::text as name_ + , buildings::smallint as num_buildings + , units::smallint as num_units + , age_restri::smallint as num_age_restricted_units + , memory_car::smallint as num_memory_care_units + , assisted::smallint as num_assisted_living_units + , com_off_re = 'Y' as is_commercial_and_residential + , nullif(sqf, 0)::int as square_feet + , public_fun = 'Y' as is_public_funded + , nullif(permit_val, 0)::int as permit_value + , community_::text as community_designation + , notes::text + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'residential_permits_residentialpermits') }} +where + co_code = '053' + and lower(ctu_name) = 'minneapolis' diff --git a/dbt/models/staging/stg_residential_permits_to_parcels.sql b/dbt/models/staging/stg_residential_permits_to_parcels.sql new file mode 100644 index 00000000..d3b5ae37 --- /dev/null +++ b/dbt/models/staging/stg_residential_permits_to_parcels.sql @@ -0,0 +1,21 @@ +with +residential_permits as ( + select + residential_permit_id as id + , daterange(to_date(year_::text, 'YYYY'), to_date(year_::text, 'YYYY'), '[]') as valid + , geom + from {{ ref('stg_residential_permits') }} +) +, parcels as ( + select + parcel_id as id + , valid + , geom + from {{ ref("parcels") }} +) +select + child_id as residential_permit_id + , parent_id as parcel_id + , valid + , type_ +from {{ tag_regions("residential_permits", "parcels") }} diff --git a/dbt/models/staging/stg_usps_migration_add_zcta.sql b/dbt/models/staging/stg_usps_migration_add_zcta.sql new file mode 100644 index 00000000..2b45f38e --- /dev/null +++ b/dbt/models/staging/stg_usps_migration_add_zcta.sql @@ -0,0 +1,19 @@ +{{ + config( + materialized='table' + ) +}} + +with +usps_migration as (select * from {{ ref('stg_usps_migration_unpivot') }}), +zctas as (select * from {{ ref('zctas') }}), +zip_codes_to_zctas as (select * from {{ ref('zip_codes_to_zctas') }}) +select + usps_migration.*, + zctas.zcta_id +from + usps_migration + left join zip_codes_to_zctas using (zip_code) + left join zctas + on zip_codes_to_zctas.zcta = zctas.zcta + and usps_migration.date_ <@ zctas.valid diff --git a/dbt/models/staging/stg_usps_migration_union.sql b/dbt/models/staging/stg_usps_migration_union.sql new file mode 100644 index 00000000..4ab16fb4 --- /dev/null +++ b/dbt/models/staging/stg_usps_migration_union.sql @@ -0,0 +1,23 @@ +{% set years = range(2018, 2024) %} + +{% for year_ in years %} + select + to_date("YYYYMM", 'YYYYMM') as date_, + replace("ZIPCODE", '=', '') as zip_code, + "CITY" as city, + "STATE" as state_, + "TOTAL_FROM_ZIP" as total_from_zip, + "TOTAL_BUSINESS" as total_from_zip_business, + "TOTAL_FAMILY" as total_from_zip_family, + "TOTAL_INDIVIDUAL" as total_from_zip_individual, + "TOTAL_PERM" as total_from_zip_perm, + "TOTAL_TEMP" as total_from_zip_temp, + "TOTAL_TO_ZIP" as total_to_zip, + "TOTAL_BUSINESS_dup" as total_to_zip_business, + "TOTAL_FAMILY_dup" as total_to_zip_family, + "TOTAL_INDIVIDUAL_dup" as total_to_zip_individual, + "TOTAL_PERM_dup" as total_to_zip_perm, + "TOTAL_TEMP_dup" as total_to_zip_temp + from {{ source('minneapolis', 'usps_y' ~ year_) }} +{% if not loop.last %} union all {% endif %} +{% endfor %} diff --git a/dbt/models/staging/stg_usps_migration_unpivot.sql b/dbt/models/staging/stg_usps_migration_unpivot.sql new file mode 100644 index 00000000..5f358c4b --- /dev/null +++ b/dbt/models/staging/stg_usps_migration_unpivot.sql @@ -0,0 +1,32 @@ +{{ + config( + materialized='table' + ) +}} + +{% set usps_migration_flow_types = ['business', 'family', 'individual', 'perm', 'temp'] %} +{% set usps_migration_flow_directions = ['from', 'to'] %} + +with +usps_migration as (select * from {{ ref('stg_usps_migration_union') }}) +{% for flow_direction in usps_migration_flow_directions %} + select + date_ + , zip_code + , '{{ flow_direction }}' as flow_direction + , 'total' as flow_type + , total_{{ flow_direction }}_zip::int as flow_value + from usps_migration + union all + {% for flow_type in usps_migration_flow_types %} + select + date_ + , zip_code + , '{{ flow_direction }}' as flow_direction + , '{{ flow_type }}' as flow_type + , total_{{ flow_direction }}_zip_{{ flow_type }}::int as flow_value + from usps_migration + {% if not loop.last %} union all {% endif %} + {% endfor %} +{% if not loop.last %} union all {% endif %} +{% endfor %} diff --git a/dbt/models/staging/stg_zctas_2010.sql b/dbt/models/staging/stg_zctas_2010.sql new file mode 100644 index 00000000..51921be6 --- /dev/null +++ b/dbt/models/staging/stg_zctas_2010.sql @@ -0,0 +1,4 @@ +select + zcta5ce10 as zcta, + st_transform(geom, {{ var("srid") }}) as geom +from {{ source('minneapolis', 'zip_codes_tl_2020_us_zcta510') }} diff --git a/dbt/models/staging/stg_zctas_2020.sql b/dbt/models/staging/stg_zctas_2020.sql new file mode 100644 index 00000000..21c131d1 --- /dev/null +++ b/dbt/models/staging/stg_zctas_2020.sql @@ -0,0 +1,4 @@ +select + zcta5ce20 as zcta, + st_transform(geom, {{ var("srid") }}) as geom +from {{ source('minneapolis', 'zip_codes_tl_2020_us_zcta520') }} diff --git a/dbt/models/tracts_model/docs.md b/dbt/models/tracts_model/docs.md new file mode 100644 index 00000000..a4a3371e --- /dev/null +++ b/dbt/models/tracts_model/docs.md @@ -0,0 +1,92 @@ +{% docs tracts_model_int__census_tracts_filtered %} + +Intermediate table that selects census tracts of interest. Considers only tracts +in the city boundary (tracts must intersect boundary and have at least 90% of +area overlapping) and only for years 2011 to 2020. + +Notes: +- Census tracts for 2020 are replaced with tracts for 2019. This requires + retagging parcels and other spatial entities, because the `census_tract_id` + changes with the replacement. + +{% enddocs %} + +{% docs tracts_model_int__parcels_filtered %} + +Retag parcels to account for tract replacement. This also has the effect of +filtering parcels to the considered tracts. + +{% enddocs %} + +{% docs census_tracts_distance_to_transit %} + +Aggregate `parcels_distance_to_transit` by tract. + +{% enddocs %} + +{% docs census_tracts_housing_units %} + +Aggregate number of units built by tract. Unit data is drawn from +`residential_permits`. + +{% enddocs %} + +{% docs census_tracts_parcel_area %} + +Aggregate parcel area by tract. Area is computed from the parcel geometry, not +from the area included in the parcel dataset. + +{% enddocs %} + +{% docs census_tracts_parking_limits %} + +Parking limits aggregated by tract. + +{% enddocs %} + +{% docs parcels_distance_to_transit %} + +Distance from a parcel to the nearest transit (line or stop). This is the +smallest distance from the parcel geometry to the line geometry, not from the +parcel centroid. + +{% enddocs %} + +{% docs parcels_parking_limits %} + +Parking limits by parcel. The parking limit is a function of the distance from +the parcel to the nearest transit line/transit stop. + +Notes: +- Parcels in all years that intersect (any level of intersection) the downtown + area have the limit eliminated. +- Parcels before 2015 have the full limit. +- Parcels after 2015 and in the blue zone have the limit eliminated. +- Parcels after 2015 and in the yellow zone have the limit reduced. + +{% enddocs %} + +{% docs census_tracts_property_values %} + +Total and median property value aggregated by tract. Uses total estimated market +value from the parcel dataset. + +{% enddocs %} + +{% docs tracts_model__census_tracts %} + +Wide table that joins various census tract level aggregates. + +Notes: +- Continuous columns are standardized by default. Categorical columns are + remapped to [0, |D|), where D is the domain. The original value of a column + `c` is called `c_original`. +- Demographic variables are drawn from ACS tract level data. + +{% enddocs %} + +{% docs tracts_model__parcels %} + +Parcels filtered by the considered census tracts, with additional data. + +{% enddocs %} diff --git a/dbt/models/tracts_model/intermediate/census_tracts_distance_to_transit.sql b/dbt/models/tracts_model/intermediate/census_tracts_distance_to_transit.sql new file mode 100644 index 00000000..a25c6005 --- /dev/null +++ b/dbt/models/tracts_model/intermediate/census_tracts_distance_to_transit.sql @@ -0,0 +1,11 @@ +with +parcels_distance_to_transit as (select * from {{ ref('parcels_distance_to_transit') }}), +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}) +select + census_tracts.census_tract_id, + avg(parcels_distance_to_transit.distance) as mean_distance_to_transit, + {{ median('parcels_distance_to_transit.distance') }} as median_distance_to_transit +from + census_tracts + left join parcels_distance_to_transit using (census_tract_id) +group by 1 diff --git a/dbt/models/tracts_model/intermediate/census_tracts_housing_units.sql b/dbt/models/tracts_model/intermediate/census_tracts_housing_units.sql new file mode 100644 index 00000000..42033743 --- /dev/null +++ b/dbt/models/tracts_model/intermediate/census_tracts_housing_units.sql @@ -0,0 +1,30 @@ +with +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}), +residential_permits as (select * from {{ ref('residential_permits') }}), +residential_permits_to_census_tracts as ( + with + residential_permits_tag as ( + select + residential_permit_id as id + , daterange(to_date(year_::text, 'YYYY'), to_date(year_::text, 'YYYY'), '[]') as valid + , geom + from residential_permits + ), + census_tracts_tag as ( + select census_tract_id as id, valid, geom from census_tracts + ) + select + child_id as residential_permit_id, + parent_id as census_tract_id, + valid, + type_ + from {{ tag_regions("residential_permits_tag", "census_tracts_tag") }} +) +select + census_tracts.census_tract_id, + sum(residential_permits.num_units)::int as num_units +from + census_tracts + left join residential_permits_to_census_tracts using (census_tract_id) + left join residential_permits using (residential_permit_id) +group by 1 diff --git a/dbt/models/tracts_model/intermediate/census_tracts_parcel_area.sql b/dbt/models/tracts_model/intermediate/census_tracts_parcel_area.sql new file mode 100644 index 00000000..1f4216e7 --- /dev/null +++ b/dbt/models/tracts_model/intermediate/census_tracts_parcel_area.sql @@ -0,0 +1,11 @@ +with +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}), +parcels as (select * from {{ ref('tracts_model_int__parcels_filtered') }}) +select + census_tract_id, + sum(st_area(parcels.geom)) as parcel_sqm, + avg(st_area(parcels.geom)) as parcel_mean_sqm, + {{ median('st_area(parcels.geom)') }} as parcel_median_sqm +from + census_tracts left join parcels using (census_tract_id) +group by 1 diff --git a/dbt/models/tracts_model/intermediate/census_tracts_parking_limits.sql b/dbt/models/tracts_model/intermediate/census_tracts_parking_limits.sql new file mode 100644 index 00000000..cf99bf05 --- /dev/null +++ b/dbt/models/tracts_model/intermediate/census_tracts_parking_limits.sql @@ -0,0 +1,8 @@ +with +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}), +parcels_parking_limits as (select * from {{ ref('parcels_parking_limits') }}) +select + census_tract_id, + avg(limit_numeric) as mean_limit +from census_tracts left join parcels_parking_limits using (census_tract_id) +group by census_tract_id diff --git a/dbt/models/tracts_model/intermediate/census_tracts_property_values.sql b/dbt/models/tracts_model/intermediate/census_tracts_property_values.sql new file mode 100644 index 00000000..71f8b74a --- /dev/null +++ b/dbt/models/tracts_model/intermediate/census_tracts_property_values.sql @@ -0,0 +1,11 @@ +-- Median and total parcel property values aggregated by census tract. +with +parcels as (select * from {{ ref('tracts_model_int__parcels_filtered') }}), +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}) +select + census_tracts.census_tract_id, + sum(parcels.emv_total) as total_value, + {{ median('parcels.emv_total') }} as median_value +from + census_tracts left join parcels using (census_tract_id) +group by 1 diff --git a/dbt/models/tracts_model/intermediate/parcels_distance_to_transit.sql b/dbt/models/tracts_model/intermediate/parcels_distance_to_transit.sql new file mode 100644 index 00000000..18cdbf48 --- /dev/null +++ b/dbt/models/tracts_model/intermediate/parcels_distance_to_transit.sql @@ -0,0 +1,20 @@ +-- This model calculates the distance from each parcel to the nearest high +-- frequency transit line or stop +with + parcels as (select * from {{ ref('tracts_model_int__parcels_filtered') }}) + , lines as (select * from {{ ref('high_frequency_transit_lines') }}) + , stops as (select * from {{ ref('high_frequency_transit_stops') }}) + , lines_and_stops as materialized ( + select + lines.valid * stops.valid as valid + , st_union(lines.geom, stops.geom) as geom + from + lines inner join stops on lines.valid && stops.valid +) +select + parcels.parcel_id, + parcels.census_tract_id, + st_distance(parcels.geom, lines_and_stops.geom) as distance +from + parcels + inner join lines_and_stops on parcels.valid && lines_and_stops.valid diff --git a/dbt/models/tracts_model/intermediate/parcels_parking_limits.sql b/dbt/models/tracts_model/intermediate/parcels_parking_limits.sql new file mode 100644 index 00000000..aebd7b00 --- /dev/null +++ b/dbt/models/tracts_model/intermediate/parcels_parking_limits.sql @@ -0,0 +1,46 @@ +with +parcels as (select * from {{ ref('tracts_model_int__parcels_filtered') }}), +transit as (select * from {{ ref('high_frequency_transit_lines') }}), +downtown as (select * from {{ ref('downtown') }}), +with_is_downtown as ( + select + parcels.parcel_id, + parcels.census_tract_id, + parcels.valid, + parcels.geom, + st_intersects(parcels.geom, downtown.geom) as is_downtown + from downtown, parcels +), +with_limit as ( + select + parcels.parcel_id, + parcels.census_tract_id, + parcels.is_downtown, + case + when parcels.is_downtown then 'eliminated' + when parcels.valid << '[2015-01-01,)'::daterange then 'full' + else + case + when st_intersects(parcels.geom, transit.blue_zone_geom) then 'eliminated' + when st_intersects(parcels.geom, transit.yellow_zone_geom) then 'reduced' + else 'full' + end + end as limit_ + from + with_is_downtown as parcels + join transit on parcels.valid && transit.valid +), +with_limit_numeric as ( + select + parcels.parcel_id, + parcels.census_tract_id, + parcels.is_downtown, + parcels.limit_, + case limit_ + when 'full' then 1 + when 'reduced' then 0.5 + when 'eliminated' then 0 + end as limit_numeric + from with_limit as parcels +) +select * from with_limit_numeric diff --git a/dbt/models/tracts_model/intermediate/tracts_model_int__census_tracts_filtered.sql b/dbt/models/tracts_model/intermediate/tracts_model_int__census_tracts_filtered.sql new file mode 100644 index 00000000..eeb99fcd --- /dev/null +++ b/dbt/models/tracts_model/intermediate/tracts_model_int__census_tracts_filtered.sql @@ -0,0 +1,33 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['valid', 'geom'], 'type': 'gist'} + ] + ) +}} + +-- Consider only tracts in the city boundary, replace 2020 tracts with 2019 +-- tracts, and regenerate the surrogate key. +with census_tracts_in_city_boundary as ( + select * + from {{ ref('census_tracts_in_city_boundary') }} + where 2010 < year_ and year_ < 2020 +), +census_tracts_union as ( +select census_tract, year_, valid, geom from census_tracts_in_city_boundary +union all +select + census_tract, + 2020 as year_, + '[2020-01-01,2021-01-01)'::daterange as valid, + geom +from census_tracts_in_city_boundary where year_ = 2019 +) +select + {{ dbt_utils.generate_surrogate_key(['census_tract', 'year_']) }} as census_tract_id, + census_tract, + year_, + valid, + geom +from census_tracts_union diff --git a/dbt/models/tracts_model/intermediate/tracts_model_int__parcels_filtered.sql b/dbt/models/tracts_model/intermediate/tracts_model_int__parcels_filtered.sql new file mode 100644 index 00000000..42b97bef --- /dev/null +++ b/dbt/models/tracts_model/intermediate/tracts_model_int__parcels_filtered.sql @@ -0,0 +1,31 @@ +{{ + config( + materialized='table' + ) +}} + +-- Retag parcels with census tracts (because we replaced the 2020 tracts with the 2019 tracts) +with +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}), +parcels as (select * from {{ ref('parcels') }}), +parcels_tag as (select parcel_id as id, valid, geom from parcels), +census_tracts_tag as (select census_tract_id as id, valid, geom from census_tracts), +parcels_to_census_tracts as ( + select + child_id as parcel_id, + parent_id as census_tract_id + from {{ tag_regions("parcels_tag", "census_tracts_tag") }} +) +select + parcels.parcel_id, + parcels.pin, + parcels.valid, + parcels.emv_land, + parcels.emv_bldg, + parcels.emv_total, + parcels.year_built, + parcels.sale_date, + parcels.sale_value, + parcels.geom, + parcels_to_census_tracts.census_tract_id +from parcels join parcels_to_census_tracts using (parcel_id) diff --git a/dbt/models/tracts_model/schema.yml b/dbt/models/tracts_model/schema.yml new file mode 100644 index 00000000..250d415e --- /dev/null +++ b/dbt/models/tracts_model/schema.yml @@ -0,0 +1,51 @@ +models: + - name: tracts_model_int__census_tracts_filtered + description: '{{ doc("tracts_model_int__census_tracts_filtered") }}' + + - name: tracts_model_int__parcels_filtered + description: '{{ doc("tracts_model_int__parcels_filtered") }}' + + - name: tracts_model__census_tracts + description: '{{ doc("tracts_model__census_tracts") }}' + columns: + - name: segregation + description: Segregation with respect to the annual city distribution. + - name: white + description: The proportion of white people in the tract, not the absolute number. + - name: income + description: Median household income in the tract. + - name: median_distance + description: Median parcel distance to transit in meters. + - name: mean_distance + description: Mean parcel distance to transit in meters. + + - name: tracts_model__parcels + description: '{{ doc("tracts_model__parcels") }}' + columns: + - name: distance_to_transit + description: Minimum distance to transit (lines or stops) in meters. + - name: limit_con + description: Numeric representation of parking limit (1 for full, 0 for eliminated, 0.5 for reduced). + - name: downtown_yn + description: Whether the parcel intersects the downtown area. + + - name: census_tracts_distance_to_transit + description: '{{ doc("census_tracts_distance_to_transit") }}' + + - name: census_tracts_housing_units + description: '{{ doc("census_tracts_housing_units") }}' + + - name: census_tracts_parcel_area + description: '{{ doc("census_tracts_parcel_area") }}' + + - name: census_tracts_parking_limits + description: '{{ doc("census_tracts_parking_limits") }}' + + - name: parcels_distance_to_transit + description: '{{ doc("parcels_distance_to_transit") }}' + + - name: parcels_parking_limits + description: '{{ doc("parcels_parking_limits") }}' + + - name: census_tracts_property_values + description: '{{ doc("census_tracts_property_values") }}' diff --git a/dbt/models/tracts_model/tracts_model__census_tracts.sql b/dbt/models/tracts_model/tracts_model__census_tracts.sql new file mode 100644 index 00000000..0e7e1ea4 --- /dev/null +++ b/dbt/models/tracts_model/tracts_model__census_tracts.sql @@ -0,0 +1,76 @@ +{{ + config( + materialized='table', + ) +}} + +with +housing_units as (select * from {{ ref('census_tracts_housing_units') }}) +, property_values as (select * from {{ ref('census_tracts_property_values') }}) +, distance_to_transit as (select * from {{ ref('census_tracts_distance_to_transit') }}) +, parcel_area as (select * from {{ ref('census_tracts_parcel_area') }}) +, parking_limits as (select * from {{ ref('census_tracts_parking_limits') }}) +, demographics as (select * from {{ ref('demographics') }}) +, census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}) + +-- Demographic data +, white as ( + select * from demographics + where name_ = 'B03002_003E' -- white non-hispanic population +) +, population as ( + select * from demographics + where name_ = 'B01003_001E' -- total population +) +, white_frac as ( + select white.census_tract, white.year_, {{ safe_divide('white.value_', 'population.value_') }} as value_ + from white inner join population using (census_tract, year_) +) +, income as ( + select * from demographics + where name_ = 'B19013_001E' -- median household income +) +, segregation as ( + select * from demographics + where description = 'segregation_index_annual_city' +) + +, raw_data as ( +select + census_tracts.census_tract::bigint + , census_tracts.year_::smallint as "year" + , coalesce(housing_units.num_units, 0) as housing_units + , property_values.total_value + , property_values.median_value + , distance_to_transit.median_distance_to_transit as median_distance + , distance_to_transit.mean_distance_to_transit as mean_distance + , parcel_area.parcel_sqm::double precision + , parcel_area.parcel_mean_sqm::double precision + , parcel_area.parcel_median_sqm::double precision + , parking_limits.mean_limit::double precision + , white_frac.value_ as white + , income.value_ as income + , segregation.value_ as segregation +from + census_tracts + inner join housing_units using (census_tract_id) + inner join property_values using (census_tract_id) + inner join distance_to_transit using (census_tract_id) + inner join parcel_area using (census_tract_id) + inner join parking_limits using (census_tract_id) + left join segregation using (census_tract, year_) + left join white_frac using (census_tract, year_) + left join income using (census_tract, year_) +) +, with_std as ( +select + census_tract + , {{ standardize_cat(['year']) }} + , {{ standardize_cont(['housing_units', 'total_value', 'median_value', + 'median_distance', 'mean_distance', 'parcel_sqm', + 'parcel_mean_sqm', 'parcel_median_sqm', 'white', + 'income', 'mean_limit', 'segregation' ]) }} +from + raw_data +) +select * from with_std diff --git a/dbt/models/tracts_model/tracts_model__parcels.sql b/dbt/models/tracts_model/tracts_model__parcels.sql new file mode 100644 index 00000000..d11f4605 --- /dev/null +++ b/dbt/models/tracts_model/tracts_model__parcels.sql @@ -0,0 +1,23 @@ +{{ + config( + materialized='table', + ) +}} + +with +parcels_parking_limits as (select * from {{ ref('parcels_parking_limits') }}), +parcels_distance_to_transit as (select * from {{ ref('parcels_distance_to_transit') }}), +parcels as (select * from {{ ref('tracts_model_int__parcels_filtered') }}), +census_tracts as (select * from {{ ref('tracts_model_int__census_tracts_filtered') }}) +select + parcels.*, + census_tracts.census_tract, + census_tracts.year_, + parcels_distance_to_transit.distance as distance_to_transit, + parcels_parking_limits.limit_numeric as limit_con, + parcels_parking_limits.is_downtown as downtown_yn +from + parcels + join census_tracts using (census_tract_id) + join parcels_parking_limits using (parcel_id) + join parcels_distance_to_transit using (parcel_id) diff --git a/dbt/models/university.sql b/dbt/models/university.sql new file mode 100644 index 00000000..7c6b4309 --- /dev/null +++ b/dbt/models/university.sql @@ -0,0 +1,5 @@ +select + ogc_fid as university_id + , st_transform(geom, {{ var("srid") }}) as geom +from + {{ source('minneapolis', 'university') }} diff --git a/dbt/models/usps_migration.sql b/dbt/models/usps_migration.sql new file mode 100644 index 00000000..d7b1fc73 --- /dev/null +++ b/dbt/models/usps_migration.sql @@ -0,0 +1,19 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['date_', 'zcta_id', 'flow_direction', 'flow_type'], 'unique': true}, + ] + ) +}} + +with +usps_migration as (select * from {{ ref('stg_usps_migration_add_zcta') }}) +select + date_, + flow_direction, + flow_type, + zcta_id, + sum(flow_value) as flow_value +from usps_migration +group by 1,2,3,4 diff --git a/dbt/models/wards.sql b/dbt/models/wards.sql new file mode 100644 index 00000000..d809d3ad --- /dev/null +++ b/dbt/models/wards.sql @@ -0,0 +1,5 @@ +select + bdnum as ward_id + , geom +from + {{ source('minneapolis', 'wards_minneapolis') }} diff --git a/dbt/models/zctas.sql b/dbt/models/zctas.sql new file mode 100644 index 00000000..62212a9b --- /dev/null +++ b/dbt/models/zctas.sql @@ -0,0 +1,28 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['zcta_id'], 'unique': true}, + {'columns': ['valid', 'geom'], 'type': 'gist'} + ] + ) +}} + +with +zctas as ( +select + zcta, + '[2020-01-01,)'::daterange as valid, + geom +from {{ ref('stg_zctas_2020') }} +union all +select + zcta, + '[,2020-01-01)'::daterange as valid, + geom +from {{ ref('stg_zctas_2010') }} +) +select + {{ dbt_utils.generate_surrogate_key(['zcta', 'valid']) }} as zcta_id, + zctas.* +from zctas diff --git a/dbt/models/zip_codes_to_zctas.sql b/dbt/models/zip_codes_to_zctas.sql new file mode 100644 index 00000000..9ac3a70f --- /dev/null +++ b/dbt/models/zip_codes_to_zctas.sql @@ -0,0 +1,12 @@ +{{ + config( + materialized='table', + indexes = [ + {'columns': ['zip_code']}, + {'columns': ['zcta']} + ] + ) +}} + +select zip_code, zcta +from {{ source('minneapolis', 'zip_codes_zcta_xref') }} diff --git a/dbt/package-lock.yml b/dbt/package-lock.yml new file mode 100644 index 00000000..5231cc02 --- /dev/null +++ b/dbt/package-lock.yml @@ -0,0 +1,6 @@ +packages: + - package: dbt-labs/dbt_utils + version: 1.2.0 + - package: dbt-labs/codegen + version: 0.12.1 +sha1_hash: 37aba29ba147b9afff74716d974b60c54b7f1a1d diff --git a/dbt/packages.yml b/dbt/packages.yml new file mode 100644 index 00000000..27ef0473 --- /dev/null +++ b/dbt/packages.yml @@ -0,0 +1,5 @@ +packages: + - package: dbt-labs/dbt_utils + version: 1.2.0 + - package: dbt-labs/codegen + version: 0.12.1 diff --git a/dbt/seeds/.gitkeep b/dbt/seeds/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/dbt/seeds/acs_variables.csv b/dbt/seeds/acs_variables.csv new file mode 100644 index 00000000..5520ef20 --- /dev/null +++ b/dbt/seeds/acs_variables.csv @@ -0,0 +1,90 @@ +variable,description +B03002_003E,population_white_non_hispanic +B03002_004E,population_black_non_hispanic +B03002_005E,population_asian_non_hispanic +B03002_006E,population_native_hawaiian_or_pacific_islander_non_hispanic +B03002_007E,population_american_indian_or_alaska_native_non_hispanic +B03002_008E,population_other_non_hispanic +B03002_009E,population_multiple_races_non_hispanic +B03002_010E,population_multiple_races_and_other_non_hispanic +B07204_001E,geographic_mobility_total_responses +B07204_002E,geographic_mobility_same_house_1_year_ago +B07204_004E,geographic_mobility_different_house_1_year_ago_same_city +B07204_005E,geographic_mobility_different_house_1_year_ago_same_county +B07204_006E,geographic_mobility_different_house_1_year_ago_same_state +B07204_007E,geographic_mobility_different_house_1_year_ago_same_country +B07204_016E,geographic_mobility_different_house_1_year_ago_abroad +B01003_001E,population +B02001_002E,white +B02001_003E,black +B02001_004E,american_indian_or_alaska_native +B02001_005E,asian +B02001_006E,native_hawaiian_or_pacific_islander +B03001_003E,hispanic_or_latino +B02001_007E,other_race +B02001_008E,multiple_races +B02001_009E,multiple_races_and_other_race +B02001_010E,two_or_more_races_excluding_other +B02015_002E,east_asian_chinese +B02015_003E,east_asian_hmong +B02015_004E,east_asian_japanese +B02015_005E,east_asian_korean +B02015_006E,east_asian_mongolian +B02015_007E,east_asian_okinawan +B02015_008E,east_asian_taiwanese +B02015_009E,east_asian_other +B02015_010E,southeast_asian_burmese +B02015_011E,southeast_asian_cambodian +B02015_012E,southeast_asian_filipino +B02015_013E,southeast_asian_indonesian +B02015_014E,southeast_asian_laotian +B02015_015E,southeast_asian_malaysian +B02015_016E,southeast_asian_mien +B02015_017E,southeast_asian_singaporean +B02015_018E,southeast_asian_thai +B02015_019E,southeast_asian_viet +B02015_020E,southeast_asian_other +B02015_021E,south_asian_asian_indian +B02015_022E,south_asian_bangladeshi +B02015_023E,south_asian_bhutanese +B02015_024E,south_asian_nepalese +B02015_025E,south_asian_pakistani +B02015_026E,south_asian_sikh +B02015_027E,south_asian_sri_lankan +B02015_028E,south_asian_other +B02015_029E,central_asian_kazakh +B02015_030E,central_asian_uzbek +B02015_031E,central_asian_other +B02015_032E,other_asian_specified +B02015_033E,other_asian_not_specified +B19013_001E,median_household_income +B19013A_001E,median_household_income_white +B19013H_001E,median_household_income_white_non_hispanic +B19013I_001E,median_household_income_hispanic +B19013B_001E,median_household_income_black +B19013C_001E,median_household_income_american_indian_or_alaska_native +B19013D_001E,median_household_income_asian +B19013E_001E,median_household_income_native_hawaiian_or_pacific_islander +B19013F_001E,median_household_income_other_race +B19013G_001E,median_household_income_multiple_races +B19019_002E,median_household_income_1_person_households +B19019_003E,median_household_income_2_person_households +B19019_004E,median_household_income_3_person_households +B19019_005E,median_household_income_4_person_households +B19019_006E,median_household_income_5_person_households +B19019_007E,median_household_income_6_person_households +B19019_008E,median_household_income_7_or_more_person_households +B01002_001E,median_age +B01002_002E,median_age_male +B01002_003E,median_age_female +B25031_001E,median_gross_rent +B25031_002E,median_gross_rent_0_bedrooms +B25031_003E,median_gross_rent_1_bedrooms +B25031_004E,median_gross_rent_2_bedrooms +B25031_005E,median_gross_rent_3_bedrooms +B25031_006E,median_gross_rent_4_bedrooms +B25031_007E,median_gross_rent_5_bedrooms +B25032_001E,total_housing_units +B25032_002E,total_owner_occupied_housing_units +B25032_013E,total_renter_occupied_housing_units +B25070_001E,median_gross_rent_as_percentage_of_household_income diff --git a/dbt/seeds/population_categories.csv b/dbt/seeds/population_categories.csv new file mode 100644 index 00000000..501dbf73 --- /dev/null +++ b/dbt/seeds/population_categories.csv @@ -0,0 +1,9 @@ +category +population_white_non_hispanic +population_black_non_hispanic +hispanic_or_latino +population_asian_non_hispanic +population_native_hawaiian_or_pacific_islander_non_hispanic +population_american_indian_or_alaska_native_non_hispanic +population_multiple_races_non_hispanic +population_other_non_hispanic diff --git a/dbt/snapshots/.gitkeep b/dbt/snapshots/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/dbt/tests/.gitkeep b/dbt/tests/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/guides/counterfactual-explained.ipynb b/docs/guides/counterfactual-explained.ipynb index 1f2bcd99..7f1f65da 100644 --- a/docs/guides/counterfactual-explained.ipynb +++ b/docs/guides/counterfactual-explained.ipynb @@ -741,7 +741,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -5895,7 +5895,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -5907,7 +5907,7 @@ }, { "data": { - "image/png": "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DlJzh0JERET/YOJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCArcwfwsOTkZCxZsgRxcXFISEiAn58ftmzZott/+/ZtdOvWrdxzra2tcf78+QrLjo2NxdixY8ts79OnD77++uvqB09ERETPPItKnBISEnDw4EGEh4dDq9VCEAS9/R4eHlizZo3eNkEQMGnSJLRt29aga3z++efw8/PTPXdxcal+4ERERFQrWFTiFB0dje7duwMA5syZgwsXLujtt7a2RkREhN622NhY5OXloV+/fgZdo3HjxggNDTVJvERERFS7WNQYJ7G46uFs2bIF9vb2iI6OfgIREREREZWyqBanqlKr1di1axdiYmIgk8kMOuell15CVlYW3N3d0bdvX8yaNQtyubxacQiCgIKCgmqV8SiFQqH3b23H+ijFutDH+ijFutDH+ijFutBXnXqo0YnToUOHkJWVZVA3nYODAyZNmoRWrVpBJpPhxIkTWLp0KRITE7Fo0aJqxaFWqxEfH1+tMiqSlJT0RMqtqVgfpVgX+lgfpVgX+lgfpVgX1VejE6fNmzejTp06iIqKeuyxISEhCAkJ0T2PioqCh4cHPvroI5w7dw5hYWFGxyGVShEQEGD0+eVRKBRISkqCr68vbGxsTFp2TcT6KMW60Mf6KMW60Mf6KMW60FdSH8aosYlTfn4+9u/fj6FDh0IikRhVRu/evfHRRx/hwoUL1UqcRCIRbG1tjT6/MjY2Nk+s7JqI9VGKdaGP9VGKdaGP9VGKdVF9FjU4vCp2794NpVKJ/v37mzsUIiIiqiVqbOK0ZcsWNGjQAOHh4UaXsXXrVgDg9ARERERkEIvqqlMoFDh48CAAICUlBXl5edixYwcAoHXr1nB1dQUAZGRk4Pjx45g8eXK55aSkpCAmJgavvPIKpk+fDgCYPXs2GjZsiJCQEN3g8F9++QXdu3dn4kREREQGsajEKT09HbNmzdLbVvJ8+fLlaNOmDQBg+/btKCoqqrCbThAEaDQavZnHGzdujM2bN2Pp0qVQq9WoX78+pk6dipdeeukJvRoiIiJ61lhU4uTt7Y0rV6489rhRo0Zh1KhRVSpnypQpmDJlSrVjJCIiotqrxo5xIiIiInramDhZqIxcNRSCAzJy1eYOhYiIiP5hUV11VOxMfCrW7L6MrNx8ODvcxfCYJogM9jR3WERERLUeW5wsTFpGAdbtvQqVWgMAUKk1WLf3KtIyTbsWHhEREVUdEycLk5mr1CVNJVRqDbJyVGaKiIiIiEowcbIwLg5yyKT6S8jIpBI4O8rMFBERERGVYOJkYTxcbTG0W6AueZJJJRjaLRAeLlxbiIiIyNw4ONwCRQZ7wtNVjuTbqWjo7QlvTydzh0RERERgi5PFcnWQQo5cuDpIzR0KERER/YOJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGYiJExEREZGBmDgRERERGcjK3AE8LDk5GUuWLEFcXBwSEhLg5+eHLVu26B0zZswYnDx5ssy527Ztg7+/f6Xlp6am4pNPPsGRI0cglUoRExODt99+G/b29iZ9HURERPRssqjEKSEhAQcPHkR4eDi0Wi0EQSj3uBYtWuCtt97S2+bt7V1p2Wq1GpMmTQIAfPXVV1Aqlfjyyy/xxhtvYNGiRaZ5AURERPRMs6jEKTo6Gt27dwcAzJkzBxcuXCj3OEdHR0RERFSp7J07dyIhIQHbtm2Dn5+frpyJEyfi3LlzCAsLq1bsRERE9OyzqDFOYvGTC+fQoUMICgrSJU0A0L59ezg7O+PgwYNP7LpERET07LCoFidDnTx5EhEREdBoNAgPD8esWbPQqlWrSs9JTEzUS5oAQCQSoVGjRkhMTKxWPIIgoKCgoFplPEqhUOj9W9uxPkqxLvSxPkqxLvSxPkqxLvRVpx5qXOLUqlUrDBgwAL6+vkhLS8OSJUvw4osvYsWKFWjevHmF5+Xk5MDBwaHMdicnJ2RnZ1crJrVajfj4+GqVUZGkpKQnUm5NxfooxbrQx/ooxbrQx/ooxbqovhqXOM2cOVPveZcuXdCvXz8sXLgQixcvNktMUqkUAQEBJi1ToVAgKSkJvr6+sLGxMWnZNRHroxTrQh/roxTrQh/roxTrQl9JfRijxiVOj7K1tUXnzp2xc+fOSo9zdHREXl5eme3Z2dmoW7dutWIQiUSwtbWtVhkVsbGxeWJl10Ssj1KsC32sj1KsC32sj1Ksi+qzqMHhT5Kfn1+ZsUyCIODGjRtlxj4RERERlafGJ04FBQU4cOAAQkNDKz2uU6dOuHz5sl7T3PHjx5GVlYXOnTs/4SiJiIjoWWBRXXUKhUI3NUBKSgry8vKwY8cOAEDr1q2RmJiIn376CTExMahfvz7S0tLw888/4/79+/j222915aSkpCAmJgavvPIKpk+fDgDo2bMnFi1ahBkzZuD111+HQqHAf/7zH3Tp0oVzOBEREZFBLCpxSk9Px6xZs/S2lTxfvnw5vLy8oFar8fXXXyMrKws2NjZo3rw55s6dq5f8CIIAjUajN/O4VCrFTz/9hE8++QSvv/46rKysEBMTg3feeefpvDgiIiKq8SwqcfL29saVK1cqPWbJkiVGl+Pp6Yn58+cbHR8RERHVbjV+jBMRERHR08LEiYiIiMhATJyIiIiIDMTEiYiIiMhATJyIiIiIDMTEiYiIiMhATJyIiIiIDFTtxCktLQ2XL19GQUGBKeIhIiIislhGJ0579uxBr1690LlzZwwaNAhxcXEAgIyMDAwcOBB79uwxWZBERERElsCoxGnfvn2YMWMGXFxcMG3aNL2lTVxdXeHp6Yn169ebLEgiIiIiS2BU4vTdd9+hZcuWWL16NUaNGlVmf0REBOLj46sdHBEREZElMSpxSkhIQO/evSvcX6dOHaSnpxsdFBEREZElMipxsrGxgUKhqHD/rVu34OzsbGxMRERERBbJqMSpTZs22LRpE4qKisrsu3//PtauXYsOHTpUOzgiIiIiS2JU4vTqq6/i3r17GDJkCNasWQORSIQjR47g66+/Rv/+/SEIAqZNm2bqWGuVjFw1FIIDMnLV5g6FiIiI/mFlzEl+fn5YtWoVPv30U3z77bcQBAFLliwBALRu3RoffPABvL29TRpobXImPhVrdl9GVm4+nB3uYnhME0QGe5o7LCIiolrPqMQJABo3boxffvkF2dnZSE5OhiAI8PHxgaurqynjq3XSMgqwbu9VqNQaAIBKrcG6vVfh4+UADxdbM0dHRERUuxnVVbdgwQJcvXoVAODk5ISwsDCEh4frkqaEhAQsWLDAdFHWIpm5Sl3SVEKl1iArR2WmiIiIiKiE0YnTlStXKtyfkJCA7777zuigajMXBzlkUoneNplUAmdHmZkiIiIiohJPZJHfrKwsSKXSJ1H0M8/D1RZDuwXqkieZVIKh3QLZTUdERGQBDB7jdOrUKcTGxuqe7969G8nJyWWOy83NxbZt2xAYGGiaCGuhyGBPONpZ4U5aDup5OKJxAzdzh0RERESoQuIUGxurG7ckEomwa9cu7Nq1q9xjAwIC8N5775kmwlpI/646O95VR0REZCEMTpwmTZqEUaNGQRAEtGvXDnPnzkWPHj30jhGJRLCxsYFMxvE4xuJddURERJbL4MRJLpdDLpcDAPbu3QtXV1fY2Ng8scBqq5K76oo0AgRIUKQRdHfVMXEiIiIyL6Pmcapfv76p46B/uDjIUaQVkJapgEajhUSihlcdO95VR0REZAGMngDz8uXLWLlyJS5duoTc3FxotVq9/SKRCHv27Kl2gLWNSARENfPC1qM3oNBoYS0VI6qZF0Qic0dGRERERiVOsbGxmDRpEpycnNCsWTNcunQJbdu2hUqlwtmzZxEQEIBmzZqZOtZaISNHifPX09GtpQ+KNBpYSSQ4fz0dLZt4wd2ZXXVERETmZFTiNG/ePPj4+GDt2rUoLCxEu3btMGXKFERFRSEuLg6TJ0/G7NmzTR1rreDiIIegFRCXcB8KpRI2cjlsZFJ21REREVkAoybAvHTpEoYMGQJ7e3tIJMUTNZZ01YWHh2P48OH49ttvTRdlLcIJMImIiCyXUS1OEokEdnZ2AABHR0dYWVkhPT1dt9/HxwfXr183TYS1UGSwJzxd5Ui+nYqG3p7w9nQyd0hEREQEI1ucGjRogKSkJADFg8D9/Pz0BoIfOHAAderUMUmAtZWrgxRy5MLVgUvXEBERWQqjEqfOnTtj69atKCoqAgC8+OKL2LVrF3r06IEePXpg3759GD58uEkDrW0yctVQCA7IyFWbOxQiIiL6h1Fdda+88grGjh2rG980aNAgiMVi7Nq1CxKJBFOnTsXgwYNNGmhtor/kyl0uuUJERGQhqpw4qdVqXL9+Hc7OzhA9NLnQgAEDMGDAAJMGVxtxyRUiIiLLVeWuOrFYjOeff77CBX6pekqWXHlYyZIrREREZF5VbnGSSCSoV68eCgsLTR5McnIylixZgri4OCQkJMDPzw9btmzR7c/Ly8PPP/+MgwcPIikpCdbW1ggLC8Nrr72GoKCgSsuOjY3F2LFjy2zv06cPvv76a5O/FmO5OMjhZGeNBl4Ougkwb97L5TxOREREFsCoMU6jR4/Gr7/+iiFDhsDZ2dlkwSQkJODgwYMIDw+HVquFIAh6++/cuYM1a9bg+eefx6uvvgqVSoWlS5di+PDhWL9+Pfz9/R97jc8//xx+fn665y4uLiaL3xQ8XG3Rqbk3ft5yEfkKNexspHixX1N20xEREVkAoxInrVYLa2trxMTEoGfPnqhfvz7kcrneMSKRCOPHj69SudHR0ejevTsAYM6cObhw4YLefm9vb+zevRs2Nja6bW3btkV0dDRWrVqF995777HXaNy4MUJDQ6sU19OUllGAXbHJcLSzhtxaDGupFXbFJqNZQB0mT0RERGZmVOL05Zdf6v7/+++/l3uMMYmTWFz5kCtb27KJg52dHRo0aIC0tLQqXctSlYxxspKIoFZrYCWR6sY4MXEiIiIyL6MSp71795o6DqPl5OQgISEB7dq1M+j4l156CVlZWXB3d0ffvn0xa9asMq1lVSUIAgoKCqpVRgk7uQRSiQiKouJuSq1WgEwqgq1cbLJr1EQKhULv39qMdaGP9VGKdaGP9VGKdaGvOvVgVOJUv359oy9oav/9738hEokwYsSISo9zcHDApEmT0KpVK8hkMpw4cQJLly5FYmIiFi1aVK0Y1Go14uPjq1VGCYlEgl5t6mLjoRv/bClCrzY+eHD3BlJvayo9tzYombGeWBePYn2UYl3oY32UYl1Un1GJk6VYv3491q5diy+++AJeXl6VHhsSEoKQkBDd86ioKHh4eOCjjz7CuXPnEBYWZnQcUqkUAQEBRp9fHr/6rkhJzUB9T1d4uLKLTqFQICkpCb6+vnpj3Goj1oU+1kcp1oU+1kcp1oW+kvowRo1NnA4ePIj3338fr7zyCgYNGmRUGb1798ZHH32ECxcuVCtxEolE5Y6/qg4PAOmpyfBw9TZ52TWZjY0N6+MfrAt9rI9SrAt9rI9SrIvqM2qtOnM7e/YsZs2ahYEDB2LWrFnmDoeIiIhqiRqXOF27dg1TpkxB27ZtMXfu3GqVtXXrVgCw6OkJiIiIyHJYVFedQqHAwYMHAQApKSnIy8vDjh07AACtW7eGIAiYOHEiZDIZxo0bpzfPk729vW6cUUpKCmJiYvDKK69g+vTpAIDZs2ejYcOGCAkJ0Q0O/+WXX9C9e3cmTkRERGQQoxKnsWPH4uWXX0ZUVFS5+0+cOIGFCxdi+fLlVSo3PT29TNdbyfOSsu7duwcAZeaIat26NVasWAGgeHoAjUajN/N448aNsXnzZixduhRqtRr169fH1KlT8dJLL1UpRiIiIqq9jEqcTp48iaFDh1a4PyMjA6dOnapyud7e3rhy5Uqlxzxuf0XlTJkyBVOmTKlyTEREREQljB7jJBKJKtyXnJwMOzs7Y4smABm5aigEB2Tkqs0dChEREf3D4BanjRs3YuPGjbrn33//PdauXVvmuNzcXFy5cgWdOnUyTYS10Jn4VKzZfRlZuflwdriL4TFNEBnsae6wiIiIaj2DEyeFQoHMzEzd8/z8/HLXlrO1tcULL7yAadOmmSbCWiYtowCbD19HE19XFGmcYCWRYPPh6/DxcuBadURERGZmcOI0cuRIjBw5EgAQHR2Nf//73+jWrdsTC6y2ys5TIcDHBduP34BCWQQbuRV6RzVCTm4hEyciIiIzM2pw+L59+0wdB/1DIhZj54kkKAuL16VTFmqw80QS2ofXM3NkREREVK15nPLy8nDnzh3k5OTo3fpfolWrVtUpvlZSazSwkUuhLNRAAwFikQg2cinUaq25QyMiIqr1jEqcMjIy8Mknn2DXrl3QaDRl9guCAJFIhPj4+GoHWNu4OMhRz80WrYM9oBUAsQi4nZYHZ0eZuUMjIiKq9YxKnN5//33s378fY8aMQcuWLeHo6GjquGotD1dbdGrujZ+3XES+Qg07Gyle7NeU45uIiIgsgFGJ09GjRzFu3Di8+eabpo6n1kvLKMCu2GQ42llDbi2GtdQKu2KT0SygDpMnIiIiMzNqAky5XI769eubOhYCkJmrhEqtgZVEBBGK/1WpNcjKUZk7NCIiolrPqMTpueeew549e0wdC6F4jJNMKtHbJpNKOMaJiIjIAhjVVdezZ0+cOnUKEydOxPDhw+Hl5QWJRFLmuKZNm1Y7wNrGw9UWQ7sFYs3uy1Aoi5Omod0C2U1HRERkAYxKnEomwgSAY8eOldnPu+qqJzLYE56uciTfTkVDb094ezqZOyQiIiKCkYnT559/buo46BGuDlKkIheuDt7mDoWIiIj+YVTiNGjQIFPHQURERGTxjBoc/rC0tDRcvnwZBQUFpoiHiIiIyGIZnTjt2bMHvXr1QufOnTFo0CDExcUBKJ5VfODAgdi9e7fJgiQiIiKyBEYlTvv27cOMGTPg4uKCadOm6a1T5+rqCk9PT2zYsMFkQRIRERFZAqMSp++++w4tW7bE6tWrMWrUqDL7IyIieEcdERERPXOMSpwSEhLQu3fvCvfXqVMH6enpRgdFREREZImMSpxsbGygUCgq3H/r1i04OzsbGxMRERGRRTIqcWrTpg02bdqEoqKiMvvu37+PtWvXokOHDtUOjoiIiMiSGJU4vfrqq7h37x6GDBmCNWvWQCQS4ciRI/j666/Rv39/CIKAadOmmTpWIiIiIrMyKnHy8/PDqlWr4OzsjG+//RaCIGDJkiVYtGgRAgMDsWrVKnh7c8ZrIiIierYYNXM4ADRu3Bi//PILsrOzkZycDEEQ4OPjA1dXV1PGR0RERGQxjE6cSjg5OSEsLMwUsdBDMnLVUAgOyMhVw9bW3NEQERERUM3E6dSpU7h16xZycnL0JsEEAJFIhPHjx1en+FrrTHwq1uy+jKzcfDg73MXwmCaIDPY0d1hERES1nlGJU3x8PF599VXcvHmzTMJUgomTcdIyCrBu71Wo1BoAgEqtwbq9V+Hj5QAPFzY9ERERmZNRidO///1vZGRkYO7cuQgLC4ODg4Op46q1MnOVuqSphEqtQVaOiokTERGRmRmVOF27dg0zZ87EsGHDTB1PrefiIIdMKoFCpdVtk0klcHaUmTEqIiIiAoycjqBhw4YQiUSmjoUAeLjaYmi3QMikEgDFSdPQboFsbSIiIrIARrU4zZgxA1988QX69esHT08OWja1yGBPONpZ4U5aDup5OKJxAzdzh0REREQwMnHq0aMHVCoVevXqhbZt28LLywsSiaTMce+++261A6yN9O+qs+NddURERBbCqMTp5MmT+PDDD6FQKLB///5yjxGJREycjFByV11OgRpaWCGnQM276oiIiCyEUYnTxx9/DHt7e8ybNw/h4eGwt7c3STDJyclYsmQJ4uLikJCQAD8/P2zZsqXMcevWrcNPP/2EO3fuoFGjRnjttdfQtWvXx5afmpqKTz75BEeOHIFUKkVMTAzefvttk8VvCpm5StzPUuBBlgJaARCLAHWRlnfVERERWQCjBoffvHkTEydORPv27U2adCQkJODgwYNo2LAh/P39yz1m69ateO+999C7d28sXrwYERERmD59Os6ePVtp2Wq1GpMmTUJSUhK++uorfPjhhzhy5AjeeOMNk8VvCuoiLfIVamj/mR5LKwD5CjWKNJrKTyQiIqInzqgWp4CAAOTm5po6FkRHR6N79+4AgDlz5uDChQtljpk3bx769u2LV199FQDQtm1bXL16Fd999x0WL15cYdk7d+5EQkICtm3bBj8/PwCAo6MjJk6ciHPnzlnMsjE5BSpEt2qAPSdvQqEqgo3MCtGtGiArX2Xu0IiIiGo9o1qc3nrrLaxZswbnzp0zbTDiysO5desWkpKS0Lt3b73tffr0wfHjx1FYWFjhuYcOHUJQUJAuaQKA9u3bw9nZGQcPHqxe4Cbkai/HiQt30LqpF7q1aoDWTb1w4sIduDnamDs0IiKiWs+oFqelS5fCzs4Ow4cPR0BAAOrWrVsm6RGJRPj+++9NEmSJxMREAECjRo30tvv7+0OtVuPWrVsVdvElJibqJU0lMTZq1EhXrrEEQUBBQUG1yijRwNMGo3sG48KNdAgCYC0VY3TPYPi4y012jZpIoVDo/VubsS70sT5KsS70sT5KsS70VacejEqcrl69CgCoW7cu8vPzce3atTLHPIkJMrOzswEUd7E9rOR5yf7y5OTklLs0jJOTU6XnGUKtViM+Pr5aZZSwtraGVrDH5RvpKFBpYCuTIMTXGdevX6+0Ra22SEpKMncIFoN1oY/1UYp1oY/1UYp1UX1GJU779u0zdRw1mlQqRUBAgEnKSnmgwPL1J3WDw3MKtFi+7TLem9gG/m5yk1yjJlIoFEhKSoKvry9sbGp3tyXrQh/roxTrQh/roxTrQl9JfRjDqMSpsLAQ1tbWRl2wOpycnAAAubm5cHd3123PycnR218eR0dH5OXlldmenZ2NunXrVisukUgEW1vTTBWQmZsNQITcgkIIWgEisQhOdtbIyilEYx9Xk1yjJrOxsTFZXdd0rAt9rI9SrAt9rI9SrIvqM2pwePv27fHee+/h9OnTpo6nUiVjlB4dk5SYmAipVAofH59Kz330PEEQcOPGjTJjn8zJ0dYaVlYidIyoj+hWDdAxoj6srERwtH/6iSoRERHpMypx6tWrF3bt2oUxY8YgOjoaX3/9Na5fv27q2Mrw8fGBr68vduzYobd927ZtiIqKqrQVrFOnTrh8+bJe09zx48eRlZWFzp07P6mQq0xqJcGATgE4feke9p66idOX7mFApwBIxWWXtCEiIqKny6jE6eOPP8aRI0cwb948NGvWDD///DP69euHwYMHY9myZXjw4IFRwSgUCuzYsQM7duxASkoK8vLydM8zMjIAFC8wvGXLFsybNw+xsbH44IMPcO7cObzyyiu6clJSUhASEoIFCxbotvXs2RONGzfGjBkzsH//fmzbtg3vvPMOunTpYjFzOAHF3X4bDyTAVm4FNyc5bOVW2HggASLmTURERGZn1BgnALolS2JiYpCXl4ft27djy5Yt+PLLL/Hf//4XUVFReO655xATEwO53LBBzenp6Zg1a5betpLny5cvR5s2bdCvXz8oFAosXrwYP/74Ixo1aoQFCxagefPmunMEQYBGo4EgCHrx/vTTT/jkk0/w+uuvw8rKCjExMXjnnXeMrYInQq3RQCIWIz1bCa1WgFgsgpuTHGq11tyhERER1XpGJ04Ps7e3x9ChQ9GkSRMsXrwYu3btwuHDh3H48GHY2dlh2LBhmDFjxmMHpHl7e+PKlSuPvd7QoUMxdOjQKpfj6emJ+fPnP/4FmZFUIkGhWgOxWASRqLgFqlCtgVRqVOMgERERmVC1E6dbt25h8+bN2Lx5M5KSkuDs7IzRo0djwIABkEqlWLt2LVasWIHbt29bfNJiCTRaLbq1aoBtx5L+WXJFgm6tGkBTJDz+ZCIiInqijEqcMjMzsW3bNmzevBlxcXGQSqXo0qUL/vWvf6FTp06wsiot9v3334eXlxcWLlxosqCfZRqNFkfiUtAxoh7EYhG0WgFH4lIQFVq9KROIiIio+oxKnDp27IiioiJERETggw8+QJ8+fcrM5v2wxo0bw9WVcxAZQlFYhH4d/PDbrivIVxbBTm6FF3oEQaFUmzs0IiKiWs+oxGnKlCkYMGAAGjRoYNDxXbt2RdeuXY25VK1jY22FPw9fR8sQL1hJxCjSaPHn4et4a0wrc4dGRERU6xmVOM2YMcPUcdA/RGIRRBDhyNkUvbvqRDD92n9ERERUNUYPDtdoNPjzzz9x4MAB3LlzBwBQr149dO3aFf3794dEwomHjOHiIEczP1dEBnuiQKmBrVyCM/GpcHaUmTs0IiKiWs+oxCk3NxcTJ07E+fPnYWdnp1vq5NixY9i1axdWr16NJUuWwN7e3qTB1gYerrYI9quDhb+f041xGt+/KTxcuLYQERGRuRk1OdDXX3+Nixcv4t1338Xx48exceNGbNy4EceOHcN7772HCxcu4OuvvzZ1rLXCuWv38cuWi1AUFs/lpCjU4JctF3HhunGzsRMREZHpGJU47d69GyNGjMCoUaMglUp126VSKUaOHIkRI0Zg586dJguyNsnIVkKp0kCrFXQPpUqDB1kKc4dGRERU6xmVOGVlZaFRo0YV7m/UqBGys7ONDqo2c3GUQ26tPz5Mbi2Bq6ONmSIiIiKiEkYlTg0bNsS+ffsq3L9v3z6DpyqgR2gFjOgZBFt58fAzW7kVRvQMgqDlzOFERETmZtTg8BEjRuDjjz/G5MmTMW7cOPj6+gIAbty4gRUrVujGOlHVyWUSnDh/F6N7NkGRVoCVWIRj5+8guCEnECUiIjI3oxKnUaNGISMjAz/++COOHDmiX6CVFaZNm4aRI0eaJMDaRlWkRah/HSTeyYEAQAQg1L8OVGqNuUMjIiKq9Yyex2nGjBkYNWoUjh8/jpSUFABA/fr1ERUVxeVVqiFfoYZSrUHctftQFWogs5agQ3g95Cu45AoREZG5GZ04AYCrqyv69u1rqlgIgKOtNY6fv4OIQHdIxCJotAKOn7+Dtk29zB0aERFRrWdQ4lQyM3hV1atXz6jzajNrqQTtw+pj27EkKFRFsJFZoU87X1hbVSvHJSIiIhMw6K9xdHQ0RKKqr5UWHx9f5XNqO41Gix0nkqBUFQEAlKoi7DiRhKjQumaOjIiIiAxKnD777DOjEiequpyCQlhbSaAQawCtAJFYBGsrCXLyCs0dGhERUa1nUOI0ePDgJx0H/aOOky1EABxtpbq76kQA6rhwAkwiIiJzM2oCzIcJgoD09HSkp6dDEDhJY3X5eTthXN8QAEDBP3fSjesbgkb1nMwZFhEREaEad9Vdu3YN8+bNw+HDh6FUKgEAcrkcHTt2xPTp0xEYGGiyIGub6FYN4FXHFmnp+fBws0NIozrmDomIiIhgZOJ0+vRpTJ48GVqtFt26ddObOXzfvn04dOgQfvrpJ7Rs2dKUsdYaZ+JTsWb3ZWTl5sPZwQ7DY5ogMtjT3GERERHVekYlTp999hlcXV2xcuVK1K2rf7fX3bt3MWrUKHz++edYv369SYKsTdIyCnDo71vo38kf+Qo17GykOPT3Lfh4OcDDxdbc4REREdVqRiVO165dw6xZs8okTQBQt25djBgxAgsWLKh2cLVRfoEaTXzd8N26OOQri2Ant8K4viEoyFcDLuaOjoiIqHYzanB4vXr1UFhY8e3xarUaXl6c6doY+So1lm+/BIlEDEc7a0gkYizffgkFhVxyhYiIyNyMSpymTZuGFStWlDvB5aVLl7By5UrMmDGj2sHVRlm5KliJJcgtKEROfiFyCwphJZYgM0dl7tCIiIhqPaO66uLi4uDm5obBgwejefPmaNiwIQAgKSkJZ8+eRePGjXH27FmcPXtW77x333232gE/6xzsrKHWaCASiVAy56hao4GDncy8gREREZFxidPKlSt1///rr7/w119/6e2/evUqrl69qrdNJBIxcTJAvrIQPdv6YvtDa9X1bOuLPCVbnIiIiMzNqMTp8uXLpo6D/mEnt8bp+Ht4oXsgtBAghgh7z9xEZBCnIyAiIjI3oyfApCdDoVKjR+uGWLXrCgqURbCVW2FkjyAoVFyrjoiIyNyqveSKVqtFdnY2srKyyjyo6mxkUvy25wqs/rmrzkoixm97rsBGZm3u0IiIiGo9o1qc1Go1Fi9ejPXr1+PevXvQarXlHlfeXXdUuXyFGjbWUmTmKqEVALEIcHGQo0DJFiciIiJzMypxev/997Fp0yaEh4eje/fucHBwMHVctZajnTWkViLYyqW6bVIrEext2eJERERkbkYlTjt27MCAAQPwxRdfmDqeWq9QrUGn5t7IySvUDQ53tLdGoVpj7tCIiIhqPaMSJxsbG4SHh5s6FgKgLtLA3laKvaduQVmogdxaggGd/aDWMHEiIiIyN6MSp759++LAgQMYMWKEqeN5rDFjxuDkyZPl7vu///s/9O3bt9x90dHRSElJKbP93LlzkMksZ3JJG7kUq3ddgUJVnCjlK9VYvesK/j2+jZkjIyIiIqMSp3/961945513MGXKFDz//PPw8vKCRCIpc1zTpk2rHeCjPvjgA+Tl5eltW7ZsGXbt2oWoqKhKz+3ZsycmTJigt83a2rLGDuXmF0JVqIFWK+i2qQo1yC3gBJhERETmZlTiVFhYCEEQcOjQIRw6dKjMfkEQIBKJnshddQEBAWW2vfHGG2jfvj1cXV0rPbdOnTqIiIgweUymZG9rDblMAhFEAEQABAgQYG9jOa1iREREtZVRidM777yDPXv2oE+fPggPDzfrXXV//fUXbt++jVdffdVsMZiSqlCNMb1CsHzbJeQr1bCTW2FsnxAoCzkdARERkbkZlTgdOXIEo0ePxjvvvGPqeKpsy5YtsLW1Rbdu3R577ObNm7F27VpIpVK0bNkSs2fPRlBQULVjEAQBBQUF1S4HAGTWUmw8eAGdm3tDJBZB0ArYeDABM4a2MNk1aiKFQqH3b23GutDH+ijFutDH+ijFutBXnXowKnGyt7dHw4YNjb6oqRQVFWH79u2Ijo6Gra1tpcdGR0cjLCwM9erVw61bt/DDDz9g5MiR2LRpE3x8fKoVh1qtNlm3ZIHEExoNsONEkm4CTDcnG+TkKxEfn2ySa9RkSUlJ5g7BYrAu9LE+SrEu9LE+SrEuqs+oxGnYsGHYsmULXnjhhXIHhT8tR48eRUZGBvr16/fYY999913d/1u2bIn27dujd+/eWLJkCT788MNqxSGVSssde2WMhJR8KArVehNeKgrVcLSTI6B+sEmuURMpFAokJSXB19cXNjY25g7HrFgX+lgfpVgX+lgfpVgX+krqwxhGJU7+/v7Yu3cvBg0ahEGDBlV4V12PHj2MCspQW7ZsgbOzMzp06FDlcz08PBAZGYmLFy9WOw6RSPTYFi9DFSgzMbx7EFY/tMjviB5ByFcWwta2jkmuUZPZ2NiYrK5rOtaFPtZHKdaFPtZHKdZF9RmVOL322mu6/3/55ZflHvOk7qoroVQqsWfPHjz33HOQSqWPP6GGsJVbY8+pyxjRIwharQCxWIQ9p5Lx0gBOOEpERGRuRiVOy5cvN3UcVbZv3z4UFBSgf//+Rp2fmpqKM2fOYMCAASaOrHq0Gi1aNvHCqp1XoFAVwUZmhT7tfCtcSJmIiIieHqMSp9atW5s6jirbvHkz6tWrh8jIyDL7xo0bhzt37mD37t0Airv09u/fj86dO8PDwwO3bt3Cjz/+CIlEghdffPFph14psUSM3bHJsJVbwVZe/Pbsjk1GiyBPXEnOgIuDHB6ubGYlIiIyB6MSpxKFhYW4ePEi0tPT0aJFi8dOQGkq2dnZOHz4MMaNGweRSFRmv1arheahtd28vb2RlpaGzz77DLm5uXBwcEDbtm0xc+bMat9RZ2o5+SrIrK2Qnq3Qu6suO1+JDVuuQSaVYGi3QEQGe5o7VCIiolrH6MRp+fLlWLBgAXJzcwEAS5cuRVRUFDIyMtC7d2/861//wpAhQ0wW6MOcnJxw4cKFCvevWLFC73lERESZbZbK0U4GQEDH5t6wkohRpNHiUuIDONoV32WnUmuwbu9V+Hg5wMOFLU9ERERPk9iYk9avX4/PPvsMHTt2xKeffgpBKF1XzdXVFW3btsW2bdtMFmRtUqBU47lO/jh16R72nrqJU5fu4blO/ihQFemOUak1yMrh2nVERERPm1EtTj///DO6deuGr776CpmZmWX2N23atMa08FgaW7kU+8/cwuheTVCkEWAlEWHPqZuY0L90wWSZVAJnR65dR0RE9LQZlTglJydjzJgxFe53dnZGVlaWsTHVaoXqIkS39MHKHZd18ziN7BkEtbp4zFbJGCd20xERET19RiVOjo6O5bY0lbh27Rrc3d2NDqo2s5ZaYfXO4skvAaBAWYTVO6/g7fGtMe35CDg6WDNpIiIiMhOjxjh16tQJa9euRU5OTpl9CQkJWLduHaKjo6sdXG2UkaOEslCjt01ZqEFmjhLZ+SomTURERGZkVOL06quvQqPRoF+/fvjmm28gEomwadMmzJ49G88//zxcXV3xyiuvmDrWWsHVUQ65TAKxWKR7yGUSuDraYN3eq0jLLDB3iERERLWWUYmTp6cnNmzYgI4dO2L79u0QBAF//PEH9u/fj759+2Lt2rVPbU6nZ41KXYSxvUNgYy2BVivAxlqCsb1DoFKreTcdERGRmRk9j5Obmxs+/fRTfPrpp8jIyIBWq4WrqyvEYqNyMfqHRCzGgb9uYcqgMCgLiyC3tsL24zfwQkwQ76YjIiIys2rNHF6CrUumI5dZoV1YPfyw8ZzurroRPYIgl1nxbjoiIiIzMzpxys7OxpYtW3D79m1kZ2frTYIJACKRCJ999lm1A6xtMrIVOHL2DoZ3C4RWECAWiXDk7B24OcnRMcLb3OERERHVakYlTocPH8bMmTOhUChgb28PR0fHMseUt4YcPZ6jnQwPsgqwIzYZGo0WEokYhYVFcLJjFx0REZG5GZU4ffnll3B3d8f8+fMRFBRk6phqNUGrxQs9gvDLlkvIVxbBTm6F8f1CIGi1OBOfysV9iYiIzMjomcPffPNNJk1PgEgsxv7Tt/Dy82FQqDSwkUmw7egNjOzVBOt2X+HivkRERGZkVOLk6+uL/Px8U8dCAApUarQLr4eF68/pLbmiUBXppiNg4kRERGQeRs0dMGvWLKxatQq3b982dTy1nq1Miq1Hb6BLCx/0a98IXVr4YOvRG7CRWXE6AiIiIjMzqsXpxIkTcHV1RZ8+fdCuXTvUrVsXEomkzHHvvvtutQOsbfKVhWgXWg/bjiVBoSqCjcwKfdr5okCp5nQEREREZmZU4rRy5Urd/w8cOFDuMSKRiImTEezk1tgZmwSJRAQHW2sIELAzNgktgtogrHEdc4dHRERUqxmVOF2+fNnUcdA/svKUkEutkJGjhFYAxKLi9esy8xTmDo2IiKjWM8nM4WQ6zvZyFBZp4OoohwBABKCwSAMXextzh0ZERFTrcWE5S6PVYlSvYChURUjPVkKhKsKoXsEQtBpzR0ZERFTrGdXi1KRJE4NmBo+Pjzem+NpNLMbve6+iZYgXrCRiFGm0+H3vVbz6QqS5IyMiIqr1jEqcpk2bViZx0mg0SElJwZ49e9CoUSN07drVJAHWNhk5SmTkqHDwr9KpHiRiETJyOMaJiIjI3IxKnGbMmFHhvrS0NAwfPhy+vr7GxlSruTrKEeDjhD7t/KAqLILM2grbjiXC1bHsGKe0jAJk5irh4iCHhyunKSAiInrSTD443MPDAy+88AIWLlyIfv36mbr4Z561lYDurRrgx43n9Naqk1pp9Y47E5+KdXuvQqXWQCaVYGi3QK5jR0RE9IQ9kcHhNjY2nFXcSIVFIt0CvwCQryzCL1suQV1U+lalZRRg3d6ryFOooSzUIE+hxrq9V5GWWWCusImIiGoFk7c4Xb16FStWrGBXnZEyshW6pKlEvrII6TmlSVFmrhIZuSpk5ighCIBIBBQ6yrmOHRER0RNmVOIUHR1d7l11ubm5yM3NhVwux8KFC6sdXG3k6mQDOxsr5CtKkyc7Gyu4OZYmRFKJBAqlGoJQ/FwQAIVSDamUs0sQERE9SUYlTq1bty43cXJycoKPjw/69u0LZ2fn6sZWK4lFwNjeIVi+7ZJujNPY3iEQiQTcuJONRvWcoNFq0bOtL3YcT4KyUAO5tQQ92/pCUySYO3wiIqJnmlGJ0xdffGHqOOgfmbkqbD+WiJcGhenuqtu4/yqGxQRBoSpCo3pOcLKX4dqtTHRr5aM779qtTPRo29CMkRMRET37uOSKhXF2kMHKSoKrNzMhAiAAsLKSwNleDntbKQDAw9UW/Tv6l7mrjuObiIiIniwmThZGLBLQs21D3Z11JdMRiERaNKrnpDsuMtgTPl4OyMpRwdlRxqSJiIjoKeBoYguj0YqwbNsliCViONpZQywRY9m2S9Bqy75VHi62CGzoUiZpSssowJXkDKRlcHoCIiIiU2KLk4XJyFZAodRAoy29q654yRXDkiBOjElERPTkMHGyMK5ONnB1lCHEr45ukd9LiQ/g4ihHWkZBpUurlEyMqVJrAAAqtQbr9l6Fj5cDu/KIiIhMgF11FkYEAUO6BeL0pXvYe+omTl+6hyHdAiEG8H+rzuBMfGqF52bmKnVJUwmVWoOsHNUTjpqIiKh2qHGJ04YNGxAUFFTm8b///a/S8wRBwI8//oguXbogLCwMw4cPx9mzZ59O0FUgQIRVOy7DRm4FNyc5bORWWLXjMrQobUGqaGkVFwc5ZFKJ3jaZVAJnR9lTiJyIiOjZV2O76n766Sc4ODjonnt6Vj6OZ/HixZg3bx5mz56NoKAg/Prrr5gwYQL++OMP+Pj4VHru05STr4K1VIL0bAW0QvGEmG5ONsjNL9QtxVLR0ioerrYY2i2Q0xQQERE9ITU2cWratClcXV0NOlalUmHRokWYMGECxo8fDwCIjIxEr169sGTJEnz44YdPLtAqcrSTQVGohq2NFCKIIECAolANBztrZGQrIZfZQVWkwf3MAriXkxBxmgIiIqInp8Z11Rnjr7/+Ql5eHnr37q3bZm1tjZiYGBw6dMiMkZWVm69C18gG0GgE5BYUQqMR0DWyAXILCiGRiNCluTfmr/kbu08m4+yVtHLLqGiaAiIiIqqeGtvi1K9fP2RmZqJevXoYNmwYJk2aBIlEUu6xiYmJAAA/Pz+97f7+/li2bBmUSiXkcrnRsQiCgIIC08yZ5GAnw4nzd9C6qZfurroT5++gTVNPdIn0wb30fKTnKLH16A0UFWlRx1kGVwepSa5tyRQKhd6/AJCRq0Z2ngpO9rWjDkqUVxe1GeujFOtCH+ujFOtCX3XqocYlTu7u7pgxYwbCw8MhEomwb98+fPPNN0hNTcX7779f7jk5OTmwtraGTKY/SNrR0RGCICA7O7taiZNarUZ8fLzR5z9MI/fCkOhA/UV++4RAVahGPTdbbD2aCEErQKEsgrJQjeTbqUhFrkmuXRMkJSVBIpEgQ2WLjYduQFWogcxagkGdGsFVVgCNRvP4Qp4RSUlJ5g7BorA+SrEu9LE+SrEuqq/GJU4dO3ZEx44ddc87dOgAmUyGZcuWYerUqfDw8HjqMUmlUgQEBJikrISUfFxPuYc541ohI1sJVyc5jsbdRn0Pb9y+fx+92jXCxgPXoNUKkFtL0dDbE64O3pWW+Sy0zCgUCiQlJcHX1xeKIiusWnMWYrEUNvLi17Mj9i5mDo+osa+vKh6uCxsbG3OHY3asj1KsC32sj1KsC30l9WGMGpc4lad3795YunQp4uPjy02cHB0dUVhYCJVKpdfqlJOTA5FIBCcnpzLnVIVIJIKtrWnGE8llCjT2ccUXy07prVUXe/Eudp5IhruzDbpG+sDBVorG3i7w9qw89mdtJnEbGxs8uK+EWiNALC4doqfWCChQauHtWXvGddnY2Jjsc/csYH2UYl3oY32UYl1UX60YHF4ytunGjRt62xMTE1GvXr1qddOZmlKlxdq9V9EqxAvdWzdAqxAvrN17FZFNPGEtlcDKSoy4hAdoGeyFiKDKW9cqmkm8onmgagrOV0VERObyTCRO27Ztg0QiQUhISLn7W7RoAXt7e2zfvl23Ta1WY9euXejUqdPTCtMgOXlKRDWrh9iL97Dn5E3EXryHqGb1kK9Qw9VRDluZFcQiQK3WPrasZ3Um8ZL5qkqSJ85XRURET0uN66qbOHEi2rRpg6CgIADA3r17sXbtWowdOxbu7u4AgHHjxuHOnTvYvXs3AEAmk2HKlCmYP38+XF1dERgYiNWrVyMrKwsTJ04022spj6O9HMcv3EGbpl6wshKjqEiL4xfuoHVTT1hJRFAWamArszKodaWkZebh5MncLTNpGQXIzFXCxUFe6bp7j8P5qoiIyBxqXOLUqFEjrF+/Hvfu3YNWq4Wvry/eeecdjBkzRneMVqstc3fV5MmTIQgCli5dioyMDAQHB2PJkiUWNWs4ABQoC9EpwhvbjiVBoSqCjcwKfdr5Il+hRl6BGlqtgI4R9XAnLe+xyYKlzSRu6vFWHi62TJjoqTBVwk9ENV+NS5zefffdxx6zYsWKMttEIhGmTJmCKVOmPImwTMZWbo0dJ5KgUmsgFougUmuw40QSWgS1wZDoxkjPVuD89XScS3iAeh72j00cLKVlpqLxVj5eDkx+yKI9azdYEFH11LjE6VmXlaeCl6sdOkbUh1YQIBaJcPhsCrLzlDh+4S6UqqLSYytYs+5RltAyU9l4K3PHRlQRJvxE9CgmThbG1UGGLpHe+G3XFd10BC/0CIKLowzp2UrYyYvfMnOPVaoqSxxvRfQ4TPiJ6FHPxF11zxIBwO97EyAWi+Bgaw2xWITf9yZAEERQqYqgUmsgAHiuk3+N+sXNO+GoJuLUF0T0KLY4WZiMXBVEYhHy8wqhFQCxCHC0lyEjV4mRvYJx537x8iq7TiRBJpXUqLEWljLeishQlnaDBRGZHxMnC+NiL4O1VIRurRtAIhZBoxUQl5AGZ3trHL1+B9bWEly/nQ2lqqhGjrWwhPFWRFXBhJ+IHsbEycIUqovwfJeyi/yq1Rrsir0JW7kV+rRrhIs30qFUFXGsBdFTwISfiEpwjJOFsZZaYcWOS3pjnFbsuATrf8ZZ5CnU2HbsBvzqOUIAILXiW0hERPS08K+uhcnMUUKp0iAvXwXr1DvIzyt+npmrgqebLUQAFKoiFKq1aB7ogWVbL+JMfKq5wyYiIqoV2FVnYVwc5ZBZS/Dbfwfo7/gv0LmCc4qspCjy8YFVwwZAgwaAj4/+o0EDwMnpicdORET0rGPiZGGUKjVGxAQBnxp+jlWRGriRWPyojjp19JOtR/9fty4glVbvGkRERDUYEycLI5dJsftUMnAgAaLcXNg/uIfLR86if0MpipJuwjEjFalxV+GSlQq3nAew1qhNd/EHD4off/9tfBlSadnE69EEzMkJEIlMFzcRET2TLHGdSCZOFqawsAgxrRti1c4rKFAWwVZuhZFjh+JeHTukZSggk0pwKy0Pe0/dhK2NFK4OssrXzioqAu7dA27dAm7eLP730f+npZnuBajVQGJi8aM63Nz0ki0rT0+4iMUQZ2QAgYFAvXps/SIieoZZ6jqRTJwsjLW1FXbFJmN4t0BoIUAMEXbFJmPKwHDsP3MVAT7OaOztjPcmtoEIosfPK2NlBXh7Fz+ioowPLCenNNF6+PFwAqZUGl/+o9LTix9nzwIArAH4VbUMK6vyux4f3ubszNYvIiILY8nrRDJxsjC5+UpENvHEb3uuQqEqgo3MCr2iGiKnQIE2zbyw5cgNhPrVQVBD16cbmKMj0LRp8cNYGk1x69fDydajCViqCe8QLCoCbtwoflSHq2vlY7/q1QOsrU0TMxERWfQ6kUycLIyDnRxH4i6hbTMvWEnEKNJocSQuBZFNPGBT3xovDw5D3Tp2uJKcYVF9vgaRSID69YsfVWz9KigoQHx8PIKDg2Gr0QC3b1fc9XjrFqBQmC7ujIziR1yc8WVIJI8f++XiwtYvohrAEsfdPGsseWF4Jk4WRqvRolOEN7YdS9K1OPVp5wtBKyD5Xi52HLuBDhH1EZ+UAUErWEyf71Pl4AAEBxc/jFXS+lVZ1+O9e6aLWaMBkpKKH9Xh4gJ5/frwd3GBtEkToFEj/QSsfn22fhE9QZY67uZZY8nrRDJxsjBiiRg7TiRBpdZALBZBpdZgx4kktAjyhJ3cCsGNXHHgr1to26wuziU8MLrPt9Z/Y3q49attW+PLyct7/NivggLTxZ2ZCXFmJpwB4PBh48oQiyvvevTxKe6eZOsXkR5LHnfzLLLUdSKZOFmYzBwFrCRiCEIRBKH4b5eVRIyM3AL8ceg6HmQp0b11A0glItzPVKCwSFvlPl9+YzIhe3vTtH6lpVU+9uvuXdPFrNUCycnFj+pwdq6867F+fUBm/mZ1IlOx5HE3zypLXCeSiZOFcXG0gcxajO5NG0AiFkGjFRCXkAYXBzn6dfDDyu2XceL8XQzs7A9rqQQKpRpSqeEr5yTezsaKHfEoKtJCaiXmNyZLIJEUTy5aty7Qps1jD9cb72X70HuWn//4sV/5+aaLOyur+HHunPFliESPH/vl5sbWL7IIljzuhp4eJk4WxkoMDI0OxC9bLiFfWQQ7uRXG9wuBCFpYiUUQQUBWrgoCABcHGVo39YKmSDCo7DPxqbiY+AC3U/MgEhUv72Int+I3pmeFnR0QFFT8MJZWW3xnY2Vdj3fumC5mQSgu++ZNo4uwBRBhbw+tdwPk1a0PScMGsAlopJ+MeXuz9YuqzZLH3dDTw8TJwmgE4I+D1+FgZw07GynEYhH+OHgdLw8JR2GRBp0jvXHgzG2kZuRjWPfG2HPyJnq0bfjYckv65oMaukBuLYGyUIPMHCWspbawl0v5jYmKicWlrV+tWxtfTknrV2UJWF6eycKW5OVBcvkSpJcvVa+gylq+fHyKlyVi61etZqnjbujpYeJkYbJyVUjLVMDBzhoQAI1WQEZ+IbJzVdh54iY6t6iPwV0CcOCv23C0tUb/jv4G/eCW9M1fvZWFXlG+2HE8CcpCDawkYn5jItMzVevX/fuVj/1KSTFdzEC1W78AFM95VlkC5u0NyOWmibeGeVZuSrHEcTf09DBxsjAONlbwcLHBnQf50AqAWATUq2MHexspCpRquDjIkXArC1pBgL+3s8GDukv65pWqIly8kY5urXwgEYvQsbk3GtVzesKvisgIYjHg6Vn8aNWqwsMuXk/Dt7+dho1cDrG4dLzfy4PDEdjQpfiuxpSUysd+5eaaLu6cHODCheJHdXh7V56AubvXqNYv3pRCzwomThbGSmqFliGe2H3yJhQqDWxkErQM8YTU2gr9OjTC1ZtZkEiATs3rY+uRRDSs62jQN5+H++aVqiJcSc7E0G6BTJqoxnOyl0FmLdHbpjdg19YWaNy4+GGsktavyroeb9+uxqsox+3bVS7TFkDkwxscHCqfdsLbG7CxMWXU5eJt/PQsYeJkYTJylDh5KRUtg0tnDj95KRWNfVxgK5MisIEMmblKnLmcBqWqqEqDutk3T88iVwcpBnVqhB2xd6HWCE9mwO7DrV8tWxpfjkLx+LFfOTmmizs3F7h0qfhRHd7elY/98vCotPWLt/HTs4SJk4VxtpchO1eFg3+VftO0k1vB2V4GaysRcguKdElTRbfBVjaOwNR988/KmAWq2VxlBZg5PAIFSq1lfymwsal+65cgAA8elNv1qElOhubGDVibcs1HoLT16/hxo04PAvCFzAaZzh7IdPZAlrMH8tw84SW9DAQ3Lm39srXQ943oIUycLEyuohA9o3yx/aElV3pG+SJXUYg79/Nw5OwdtArxwrVbmeUODH+a4wg4ZoEshUajgauDFN6eteAPr0hUPL7J3R2I1OuYg6qiOb7Ko1AUj/2qqOXr1i0gO9tkYctUCnilJsMr9aGJV7ctrXpB9epVPvbLw6O4hZDoCWHiZGEcbKxx5vI9jOwZBK1WgFgswp5TyYgM8oDUSoJm/m44fTkVs4Y3LzM+6WmOI+CYBaIazsYGCAgofhirpPWrsq7H6t6l+Kg7d4ofJ0489tAyY75K2NlVPvbLx4etX1QhJk4WRq0uQkzrhli18woKlEWwlVthZM8gqNVFKNJoYSURQwRArdaWOfdpjiPgmAUi0mv9atHC+HKUSv3Wr/KmoMjKMlnYyM8HLl8uflRHvXqVj/3y9GTr1zOIiZOFkUqtsH5fAhztrGH/zwSY6/clYPaoVvD2sMeDTAWaB3rAxans2KanuRwAlx4gIpORywF//+KHsQQBSE/XS7bU168j99IlOOXmQlKSmGnLfuk0WknrV2ys8WXY2j5+4lU7O9PFTNXGxMnC5OarYCWRIC2jQDePk5uTDXLylVi39yqy8grhZC9DUz83uDs/MvD7KS4HwKUHiMiiiETFM7vXqQM0bw4AUBcU4IahY75KqFSVj/26edO0rV8FBaZp/fLyqrzr0cHBNPESEydL42AnQ4FSDe0/y89pBaBAqYaDnTU6R/pg1c4rcLCzrnA80dOccoDTG9CjeJcl1XgyGeDnV/wwliAAGRmPH/tlytave/eKHydPlru7wvFeegfZVt7y5eMD2NubLuYaiomThcnNVyG6VQPsOXlTd1dddKsGyM0vBCCCVitAoxEqHU/0NJcD4NIDVIJ3WRL9QyQC3NyKHxERxpdTWPj4sV8ZGSYLGwUFwJUrxY/q8PKqPAHz8gIkkseXY6GYOFkYBzsZriZnYOrgMCgLiyC3tsK2o4lo09QTVlZi2FhLIBKVjifiN3yyBLzLkugJsLYGGjUqfhhLEIDMTCiuXkXKiRNoIBLB+t69sglYUZHp4i5p/Tp1yvgy5PLSZOu994DOnU0XXzUxcbIwglaD7q0b4MeN55CvLIKd3Arj+4VA0Gqx9M+L6N66Ia7eysSQro1xJy0Pv+2+wm/4ZHa8y5LIQolEgKsrhLAwZEulKAoOhrUxUy0UFhYPhK+s69GUrV9KJXD1avFj797iBNBC1LjEafv27fjzzz9x8eJF5OTkoGHDhhgzZgyef/55iCqZ8j86Ohop5aykfu7cOchklnMnmEgswS9bL0Gl1sJKIoJKrcUvWy/h7XGtAJEIx8/fwRujIuHqKMdXv57hN3yyCLzLsmarSS3XNSnWZ4q1NeDrW/wwliAUD6yvrOvx5s2yrV8NGlQjcNOrcYnTL7/8gvr162POnDlwcXHBsWPH8N577+HevXuYPn16pef27NkTEyZM0NtmbW39JMOtsqw8FVSFGhRpSrJrASgUkJNXCLVaA2upBCKIkJHDb/hkOXiXZc1Vk8am1aRYqRwiEeDiUvwICzN3NEarcYnT999/D1dXV93zqKgoZGVl4eeff8Yrr7wCcSWTjdWpUwcR1Rmo9xQ428sgk0qg0RRBACBC8Td3R3tr5Bao0bCuvPhbvAB+wyeLwrssa56aNDatJsVKz7YaN6Xpw0lTieDgYOTl5aGgoMAMEZmWslCNET2DYCMvzmlt5FYY0TPon4HiEgz4Z326km/4MmnxnQn8hk+WwMPFFoENXfg5rCEqG5tmaWpSrPRsq3EtTuU5c+YMPD09Yf+Y+SU2b96MtWvXQiqVomXLlpg9ezaCgoKqfX1BEEyWtMmtpdh1IhnDugVCEASIRCLsOpGMlwaFYsrgUDjYSnE7NRuuDlIEN3TA9KFhyM5TwcleBlcH6TORPJZHoVDo/VubsS70sT5KVbUu7OQSSCWiMi3XtnKxxf0uMSZWfjZKsS70VaceRIJgQUPVjXD69GmMGTMGb731FsaPH1/hcZ988gnCwsJQr1493Lp1Cz/88AMePHiATZs2wcfHx+jrnz9/HoWFhUaf/6gCsQfik7P05nHq3roBQnydsXrXVRSpC2FtLcagTo3gKiuARqN5fKFEVGNJJBIIVnbIVwqwk4sgKso32c+9RCJBhsoWGw/dgKpQA5m1xGJ/t9SkWKnmsLa2RmhoaJXOqdGJ07179zB06FD4+/tj6dKllY5velRaWhp69+6N/v3748MPPzQ6hvPnz0MQBARUZ4XxhySk5OPb3/5CiF8dWEnEKNJocSnxAV59IRLfb4iDtVXxnYMyqQQzh0fA1UFqkutaOoVCgaSkJPj6+sLGxsbc4ZgV60Lfs14fF25k4fe9CboB0UO6NUazRs7lHmtsXWTkqvVari1ZVWJ91j8bVcG60FdSH8YkTjW2qy4nJweTJ0+Gs7Mz5s+fX6WkCQA8PDwQGRmJixcvVjsWkUhk+DpIjyGXKTGsWyB+2XqpdB6nviGQy8SAAN3rVGsEFCi18PasXWNJbGxsTFbXNR3ronjA8P0sDcQyx2eyPtIyCrBh/3WoNQLEYjHUGgEb9l+Hb73ISseRVbUubG0B7xpyc5oxsT6Lnw1jsS6qr0YmTkqlElOmTEFubi7WrFkDh2do8cK79wuw/69beHVEc+QWqOFgK8XGA9dgI5dC+1DjIO+go9qu5NZ0hUoNrVaNMX3s0Lrps/UHgROLElmeGpc4FRUV4dVXX0ViYiJ+/fVXeHoa9zUpNTUVZ86cwYABA0wcYfW4OMqQfC8Xn/5cOlW9nY0VXBzksLeVQqsVeAcd1Xplbk0v1OD3vQnwref8TP1ccGJRIstT4xKnuXPnYv/+/ZgzZw7y8vJw9uxZ3b6QkBBYW1tj3LhxuHPnDnbv3g0A2LJlC/bv34/OnTvDw8MDt27dwo8//giJRIIXX3zRTK+kfCJBwIgeQVi984quq25EjyCIoMVbY1txjhwi1J6WGE4sSmR5alzidPToUQDAF198UWbf3r174e3tDa1Wq3eXhbe3N9LS0vDZZ58hNzcXDg4OaNu2LWbOnFmtO+qeBEEkwt6TNzGyZxNotAIkYhH2nExGowFhxfM3/fMLk8sOUG1Wm1piOLEokWWpcYnTvn37HnvMihUr9J5HRESU2WapsvOUaBbgjpU7LutNR5CdXzrnBJcdoNru4ZYYhUoLmXXx3WbPalLx8JcmIjKvGpc4Peuc7OU4cf4O2ofXQ103O0itxLiXUQAXh9KWJi47QFTaEnM/Iw+FimwEVXCLPhGRKTFxsjAiQYuRPZsg+W4Oft+XAFVhEep72CO4oTMAt1oztoPIEB4utrCXAfHxtwDUN3c4RFQL1Li16p51gkiMvIJCxF17AAc7Kbzc7JCVq8KGg9eRllmgG9vxsGd1bAcREZGlYeJkYazEAuxtrZF8NwdpGQrcS8+HXGaFwsJ/WpW4uC8REZHZsKvOwhRpRbh4IwMyaysoVEXQCkB6lgIN6znqWpV4lw0REZF5sMXJwqRnK3D83B10b90ANrLivFZmbYV+7RvpJUgeLrYIbOjCpImIiOgpYouThXFzKl58cd+pm2jd1AtWEjFEIqBuHXszR0ZERERscbIwgqDF+H4hAICDf93GifN3ENTAGYWFapyJTzVzdERERLUbW5wsjEgkxvnr9/HWmJbIzFPBxV6GPaeTEd2yAdbt4XxNRERE5sTEycIIWi1C/dzx5YrTurXqxvcNgUJZxPmaiIiIzIxddRZGJBZjxfZ4yGVWcHOUQy6zwort8bCRSzlfExERkZmxxcnC5OSrkK8sgqZArdsmEYuQkaPkfE1ERERmxsTJwrg72UAuk0CpKl1WRS6ToH4dO4T41TFjZERERMSuOgvTpJEbJvRrCrlMAo1WgFwmwYR+TZk0ERERWQC2OFmg+u72mDE0HLkFajjYSuFsLzd3SERERAQmThYnLaMAK7bHQ6FSQ6FUwkYuh41MitdHRXJ8ExERkZmxq87CZOYqoVJr9LaVTENARERE5sXEycK4OMghk0r0tnEaAiIiIsvAxMnCeLjaYmi3QF3yJJNKOA0BERGRheAYJwsUGewJT1c5km+noqG3J7w9ncwdEhEREYEtThbL1UEKOXLh6iA1dyhERET0DyZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAYSCYIgmDuImuyvv/6CIAiwtrY2abmCIECtVkMqlUIkEpm07JqI9VGKdaGP9VGKdaGP9VGKdaGvpD5EIhFatGhRpXOtnlBMtcaT+gCKRCKTJ2M1GeujFOtCH+ujFOtCH+ujFOtCn0gk0j2qfC5bnIiIiIgMwzFORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZOFub69et48cUXERERgfbt2+M///kPCgsLzR2WWSQnJ+P999/HgAEDEBISgn79+pk7JLPZvn07Xn75ZXTq1AkREREYMGAAfv/9d9TWNboPHjyI0aNHo23btmjWrBm6deuGzz//HLm5ueYOzezy8/PRqVMnBAUF4fz58+YO56nbsGEDgoKCyjz+97//mTs0s9m4cSMGDhyI0NBQtGnTBpMmTYJSqTR3WE/dmDFjyv1sBAUFYevWrQaXY/UEY6Qqys7Oxrhx4+Dr64v58+cjNTUVX3zxBZRKJd5//31zh/fUJSQk4ODBgwgPD4dWq621SQIA/PLLL6hfvz7mzJkDFxcXHDt2DO+99x7u3buH6dOnmzu8py4rKwthYWEYM2YMnJ2dkZCQgPnz5yMhIQFLly41d3hmtXDhQmg0GnOHYXY//fQTHBwcdM89PT3NGI35fP/991i8eDGmTp2KiIgIZGZm4vjx47XyM/LBBx8gLy9Pb9uyZcuwa9cuREVFGV6QQBbjhx9+ECIiIoTMzEzdtt9++00IDg4W7t27Z77AzESj0ej+/9Zbbwl9+/Y1YzTmlZ6eXmbbu+++K7Ro0UKvnmqzNWvWCIGBgbXyZ6XEtWvXhIiICGH16tVCYGCgcO7cOXOH9NStX79eCAwMLPdnpra5fv26EBISIhw4cMDcoVis6OhoYfLkyVU6h111FuTQoUOIioqCs7Ozblvv3r2h1Wpx9OhR8wVmJmIxP54lXF1dy2wLDg5GXl4eCgoKzBCR5Sn5uVGr1eYNxIw++eQTvPDCC2jUqJG5QyELsGHDBnh7e6Nz587mDsUi/fXXX7h9+zb69+9fpfP4l8mCJCYm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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAHhCAYAAACY+zFTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACLm0lEQVR4nOzdd1yT1/4H8E8SQsJeMlRQBARBGYoLtyhu66ijbuuotq4Ob2t7u+zuvbe/tmptrdXWUa1aR+vee+BoxYWKIqiooOyRhJA8vz8owcgwhGiCfN6vV16aZ5znm5MA35xznnNEgiAIICIiIqLHEps7ACIiIqKagokTERERkYGYOBEREREZiIkTERERkYGYOBEREREZiIkTERERkYGYOBEREREZiIkTERERkYGYOBEREREZiIkTkQU6e/Ysvvjiixp/DUt05swZfP3115g7dy5OnDhR6bFnz55FUlLS0wmMiGoEK3MHQERlNW3aFI0bN67x1zCVb775Bm3btkXbtm2rVY5KpcK2bdvQs2dPBAcHQy6XG13W9u3bcevWLaSlpaFOnTqYOnWq3v6kpCQsW7ZM99zKygouLi5o06YNIiMjjb6uOWVnZ2Pr1q24ceMGrK2tER4eju7du0MsLv87eFZWFg4ePIikpCTk5eXBwcEBoaGh6NSpEyQSie6YjRs34u7du6hbty4GDRoEZ2dnXRmrVq1CREQEQkJCnsZLJHosJk5EFkgqlUIqldb4a1ia7OxsaLVaNG7cGA4ODhUed+PGDezfvx9paWkQiURwdnZGixYt0KpVK73jIiIikJKSgtTU1ArLmj59OmQyGdRqNa5evYqtW7fCxcUFfn5+JntdT4NWq8WqVatgb2+PiRMnIjc3F5s2bYJEIkG3bt3KPefBgwcAgH79+sHV1RVpaWnYvHkz1Go1evToAQDYtWsXHB0d8dxzz2H//v3YtWsXhg0bBgC4cOECRCIRkyayKEyciEzsl19+gaenJ6ysrPDXX39BIpGgZcuW6NKli+6Y48eP4+zZs8jMzISNjQ0CAwMRExMDa2trAMVdRDt27MCcOXOQnp6OBQsWYNq0aahTp45eGadOncLMmTMBAGlpadi9ezeSk5NhbW0Nf39/9OzZE7a2tuXG+fA1AODAgQO4fPky2rRpgwMHDkChUCA8PBy9e/fG8ePHcfz4cQiCgDZt2qBTp066cubOnYs+ffrg6tWrSEpKgr29PWJiYvT+2O3evRuXL19GTk4O7O3tERoais6dO+taHQDgypUrOHToEFJTU2FtbY2GDRti+PDh+OWXX5CdnY2dO3di586dAIAPPvig3NeUnZ2N7du3IzExESKRCAEBAejduzfs7e1x9uxZ/PHHHwCAefPmAQBmzZql17oBAEqlEr/99huaNWsGf39/ODg4QCaToaCgQO+43r176+qtssTJzs5O17LVpk0bxMbG4u7duwYnTnFxcdi5cydef/11WFmV/sr+7bffIJPJMGjQIIPKqa7r16/j/v37GDNmDOzt7eHl5YWuXbtiz5496NKli957WSIgIAABAQG65y4uLnjw4AFOnz6tS5zu37+Pnj17ws3NDeHh4di9ezeA4vdh//79GDt27FN5fUSGYuJE9ATExcWhbdu2mDRpEm7fvo1NmzbBx8cH/v7+AACRSIRevXrBxcUFmZmZ2Lp1K3bv3o2+ffuWKcvNzQ316tXDuXPnEB0drdt+/vx5NGvWDEDxH5lly5ahRYsW6NmzJ9RqNfbs2YN169Zh3LhxBsedmZmJa9euYfTo0cjIyMC6deuQmZkJNzc3jB8/Hrdu3cKff/4JPz8/eHt7687bv38/unfvjl69eiEuLg6///47Xn75Zbi7uwMAZDIZBg4cCAcHB6SmpmLz5s2QyWRo3749AODq1atYs2YNOnbsiIEDB0Kj0SAhIQEAMHz4cPzwww9o0aJFpV1cgiDgt99+g7W1NcaPHw+tVott27bh999/x/jx49G0aVM4OjpixYoVmDRpEpycnMpNKjMyMlBYWIjOnTsjMTERzs7O8PX1NbgOK4vv+vXryM7O1qu7koSuomQwJCQE27dvx5UrV9C0aVMAQH5+PhISEjB69OgKr7dw4UJkZWVVuL9hw4YYNWqUwfHfvn0bHh4esLe3123z9/fH1q1bkZaWhrp16xpUjkqlgo2Nje65l5cXEhMT4e/vj+vXr8PT0xNAcUtUq1at4OTkZHCMRE8DEyeiJ8DT01PXwuTm5oaTJ0/ixo0busTp4bE6zs7OiI6OxpYtW8pNnAAgNDQUJ0+e1CVO6enpuHv3LgYPHgwAOHnyJOrWravXZTJgwAB8/fXXSE9Ph5ubm0FxC4KA5557DjKZDO7u7vD19UV6ejpGjRoFkUiEOnXq4OjRo0hKStL74x8SEoIWLVoAAKKjo5GYmIiTJ0/qXs/DLVTOzs5IT0/HhQsXdInT4cOH0axZM3Tt2lV3nJeXFwDAxsYGIpEIMplM74/2oxITE5GamopZs2bp/tgOGjQICxcuREpKCurXr69LlOzs7Cosy83NDba2tti7dy8cHR3LtEhV1f/93/8BADQaDQRBQJcuXdCwYUPdfplMVun7I5VKERoairNnz+oSp3PnzsHJyanShG7kyJHQarUV7n+49coQeXl5Zeqs5HleXp5BZWRkZODkyZOIiYnRbYuJicGWLVvwzTffwNPTE/369UNycjJSU1MRExODdevW4c6dO/D390fv3r3LbdkiepqYOBE9AR4eHnrPHRwckJ+fr3uemJiII0eO4MGDB1CpVNBqtSgqKoJarS533FGzZs2wa9cu3L59G97e3jh37hzq1q2r67pLTU3FjRs38Nlnn5U5NyMjw+DEydnZGTKZTPfc3t4eYrEYIpFIb9vDrwUAfHx89J57e3vrdV9duHABJ0+e1LXmaLVavevcu3dPl3gZ68GDB3ByctJroXB3d4dcLseDBw9Qv359g8qRyWQYO3YsDh48iFOnTuHkyZPw9fVFly5dDG5VediLL74ImUyGoqIipKSkYPv27bCxsdGNlwoODkZwcHClZbRo0QKLFy9GTk4OHB0dcfbsWYSHh+u9L4+qTsL366+/Ijk5WVfOK6+8YnRZJXJycrBy5UqEhITotRw6Ojpi5MiRuudFRUVYuXIlBg4ciEOHDsHa2hrTp0/Hr7/+itOnT6NNmzbVjoWoOpg4ET0B5X0rFgQBQPFdRKtWrULLli0RHR0NGxsb3Lx5E3/++Sc0Gk25iZO9vT0aNWqE8+fPw9vbGxcuXEDLli11+wsLCxEUFITu3buXe66hyrs7qrxtJa/FELdu3cKGDRvQpUsXBAQEQCaT4cKFCzh+/LjuGEsbpO7p6Ylhw4bh7NmzUKvVuH37NpYtW4YZM2bAzs6uSmW5uLjoxjh5eHggJSUFhw8fLjPQvDJ169aFl5cX4uLi4O/vj/v37yMiIqLSc6rTVde/f38UFRUBKH3/7e3tkZKSondcSUvT4z5jubm5WLZsGXx8fNC/f/9Kjz18+DD8/f1Rr149bN68GdHR0ZBIJGjSpAmSkpKYOJHZMXEiesru3LkDQRDQs2dPXYvBxYsXH3teaGgo9uzZg2bNmiEzM1M3vgko7taKj4+Hs7NzhbeGP0m3b99GeHi47nlKSoquq+3WrVtwdnbW667Lzs7WO9/T0xM3btxA8+bNyy1fIpFU2u0EAHXq1EF2djays7N1rU7379+HUqnUjbUyhru7O8LCwnDu3DmkpqZW+244kUikS0qqonnz5oiNjUVubi78/PweO/anOl11jo6OZbZ5e3vj8OHDyM/P1yWPiYmJum7diuTk5GDZsmWoV68eBgwYUGkr2f3793HhwgVMmTIFQHGCrtFoABTf1fe4zwDR08AJMImeMldXV2i1WsTGxiIzMxNxcXE4ffr0Y88LDg6GSqXC1q1b4evrq3c7fevWraFQKLB+/XqkpKQgIyMD165dwx9//PFU/thcunQJf//9N9LT07F//36kpKSgdevWAIrHDGVnZ+PChQvIyMhAbGwsLl++rHd+586dceHCBezfvx/3799Hamoqjhw5otvv7OyMmzdvIicnp8zdbSX8/Pzg6emJDRs24O7du0hJScHGjRvRsGFD1KtXz+DXcvfuXRw4cAAPHjyAVquFUqnEsWPHYGVlpZcgZGRk4N69e8jLy0NRURHu3buHe/fu6f7Ql8jPz0deXh6ysrJw8eJFnDt3DkFBQbr98fHxWLBgwWPjCg0NRU5ODv7666/HtjYBxXXm6upa4aO85Kgy/v7+cHd3x8aNG3Hv3j1cu3YN+/btQ6tWrXRJWEpKChYsWICcnBwApUmTk5MTYmJiUFBQgLy8vHLHRAmCgC1btqBnz566u0t9fHzw119/4f79+4iLiyvTJUxkDmxxInrKvLy80KNHDxw9ehR79+5Fw4YN0a1bN2zatKnS82QyGYKCgnDx4kU899xzevscHBwwYcIE7NmzBytXrkRRURGcnZ3h7+9f6Td8U+nSpQsuXLiArVu3wsHBAc8//7wuyQgKCkLbtm2xbds2aDQaNG7cGJ06dcKBAwd05/v6+mLo0KE4dOgQjh49CplMpjeAumvXrtiyZQvmzZsHjUZT7h1oIpEIL7zwArZv346ff/5ZbzqCqrC3t0d2djZ+/fVX5OTkQCwWo06dOhg2bJhesvrnn3/qxgEBwKJFiwCUneKgJCkSi8VwdHREZGSk3tQUKpUK6enpj41LLpcjODgYCQkJaNKkSZVekymIxWKMGDECW7duxZIlS3QTYD48oF+tViM9PV2XrCcmJiIjIwMZGRn4+uuv9cp79D08c+YM7OzsEBgYqNvWpUsXrF+/Hj/99BMCAgJ0yTiROYmEqgxWICJ6xNy5czF8+HCz/DF/0s6ePWuy6QhMYfny5XB3d69yMkhEpsOuOiIiC6dQKBAfH4+kpKQqDSonItNjVx0RUQUMGUv0NCxatAhKpRLdu3fXmz2eiJ4+dtURERERGYhddUREREQGYuJEREREZCAmTkREREQGYuJEVAVz5szRLbRLRGRKt2/fRlBQEDZs2KDbNn/+fL0JU8n8mDhRtZT8UGdkZJS7v1+/fhgzZsxTjopMSaFQYP78+YiNjX1q17x27Rrmz5+P27dvP7VrEhEZgokTEVVKoVBgwYIFOHny5FO75rVr17BgwYIyi8oS1TYvv/wyzp07Z+4w6CFMnIjoiatofTmqXVQqFRfqrSIrKyvIZDJzh0EPYeJET1VsbCyCgoKwbds2fP/99+jUqRNCQ0Mxbtw4vXW/SsTFxWHixImIjIxEeHg4Ro8ejTNnzugdU9JdeOPGDcyePRuRkZFo27YtvvnmGwiCgLt37+Lll19GixYt0L59eyxdurTCmP7v//4P7du3R0REBKZOnYq7d+8+9jUVFBTgiy++QOfOndGsWTP07NkTS5YswcNTpI0ePbrM+nIlevbsiYkTJwIoHeOwZMkS/Prrr+jWrRvCw8MxYcIE3L17F4Ig4LvvvkOnTp0QFhaGl19+GVlZWWXKPHjwIEaOHImIiAg0b94cL730EhISEvSOmTNnDpo3b47U1FS88soraN68Odq2bYsvv/xSt1Dt7du3ERUVBaB4zbWgoCAEBQVh/vz5FdbHhg0bEBQUhJMnT+LDDz9EVFQUOnfuDKB4EdgPP/wQPXv2RFhYGNq0aYOZM2fqdclt2LABs2bNAgCMHTtWd82HuwoNeX2POn/+PIKCgrBx48Yy+w4fPoygoCDs378fAJCXl4dPP/0U0dHRaNasGaKiovDiiy/i4sWLlV6jIiqVCvPnz0fPnj0RGhqKDh06YPr06bh586buGEM+R0Dx2n8fffQRtm/fjj59+iAsLAzDhw/HlStXAAC//fYbYmJiEBoaijFjxpTp7hwzZgz69euHy5cvY/To0QgPD0dMTAx27NgBADh58iSGDh2KsLAw9OzZE8eOHSvzelJTU/H222+jXbt2aNasGfr27Yvff/9d75iSn6utW7fi66+/RseOHREeHq5b4DcuLg6TJ09Gq1atEBERgf79+2PZsmV6ZVy/fh0zZ85E69atERoaisGDB2Pv3r0G1fnWrVsxePBgNG/eHC1atChTfsnn9NSpU3j//ffRpk0btGjRAm+++Says7PLlGeqn6kSOTk5mDNnDiIjI9GyZUu89dZbyM3NLXPd8sY4lXwG9uzZg379+uneg0OHDpU5PzY2FoMHD0ZoaCi6d++O3377jeOmqokzh5NZLF68GCKRCBMmTEBeXh5++uknzJ49G+vWrdMdc/z4cUyePBnNmjXD9OnTIRKJsGHDBowbNw6rVq1CWFiYXpmvvfYa/P398cYbb+DgwYP4/vvv4ezsjN9++w1t27bF7NmzsXnzZnz55ZcIDQ0ts3TF999/D5FIhMmTJyM9PR3Lli3D+PHj8ccff0Aul5f7OgRBwMsvv4zY2FgMGTIEwcHBOHz4MP7zn/8gNTUV77zzDgBgwIABePfdd3H16lW9RUzPnTuHpKQkvPzyy3rlbt68GWq1GmPGjEFWVhZ++uknvPrqq2jbti1iY2MxefJkJCcnY+XKlfjyyy/x+eef687dtGkT5syZgw4dOmD27NlQKBRYvXo1Ro4ciY0bN8Lb21t3rEajwcSJExEWFoY333wTx48fx9KlS+Hj44ORI0fC1dUVH374IT788EPExMQgJiYGAAz6pTt37ly4urpi2rRpuhan8+fP4++//0bfvn3h5eWFlJQUrF69GmPHjsXWrVthY2ODVq1aYcyYMVixYgWmTp0KPz8/AIC/v3+VX9/DQkND4ePjg+3bt2PQoEF6+7Zt2wYnJyd06NABQPECtDt37sTo0aPh7++PrKwsnDlzBtevX0fTpk0f+9ofptFoMGXKFBw/fhx9+/bF2LFjkZ+fj6NHj+Lq1ato0KCBwZ+jEqdPn8a+ffswcuRIAMCPP/6IqVOnYtKkSVi1ahVGjhyJ7Oxs/PTTT3jnnXewfPlyvfOzs7MxdepU9OnTB7169cLq1avx+uuvQ6vV4rPPPsMLL7yAfv36YcmSJZg5cyYOHDgAe3t7AMCDBw8wbNgwiEQijBo1Cq6urjh06BD+/e9/Iy8vD+PHj9e71sKFCyGVSjFx4kQUFhZCKpXi6NGjmDJlCjw8PDB27FjUqVMH169fx4EDBzBu3DgAQEJCAkaMGAFPT09MnjwZtra22L59O6ZNm4b58+frPovlOXr0KF5//XVERUVh9uzZAIoXHP7rr7905Zf46KOP4OjoiOnTp+PGjRtYvXo17ty5gxUrVugWyDblzxRQ/HvjlVdewZkzZ/DCCy/A398fu3fvxltvvWXQZwooXhR5165dGDlyJOzs7LBixQrMnDkT+/fvh4uLCwDg0qVLmDRpEtzd3TFjxgxotVp89913cHV1Nfg6VA6BqBrmzZsnBAYGCunp6eXu79u3rzB69Gjd8xMnTgiBgYFC7969BZVKpdu+bNkyITAwULhy5YogCIKg1WqFHj16CBMmTBC0Wq3uOIVCIURHRwsvvvhimRjee+893baioiKhU6dOQlBQkLBo0SLd9uzsbCEsLEx46623ysTUsWNHITc3V7d927ZtQmBgoLBs2TLdtrfeekvo2rWr7vnu3buFwMBAYeHChXqve8aMGUJQUJCQnJwsCIIg5OTkCKGhocJ///tfveM+/vhjISIiQsjPzxcEQRBu3bolBAYGCm3bthVycnJ0x3311VdCYGCg8NxzzwlqtVq3/fXXXxeaNm2qq8u8vDyhZcuWwrvvvqt3nfv37wuRkZF629966y0hMDBQWLBggd6xAwcOFAYNGqR7np6eLgQGBgrz5s0TDLF+/XohMDBQGDFihFBUVKS3T6FQlDn+77//FgIDA4WNGzfqtm3fvl0IDAwUTpw4oXdsVV5feb766iuhadOmQlZWlm6bSqUSWrZsKbz99tu6bZGRkcLcuXMf+1oN8fvvvwuBgYHCzz//XGZfyWfb0M+RIAhCYGCg0KxZM+HWrVu6bb/99psQGBgotG/fXu8zXPK5efjY0aNHC4GBgcLmzZt1265fvy4EBgYKTZo0Ec6ePavbfvjwYSEwMFBYv369bts777wjtG/fXsjIyNCL9bXXXhMiIyN173HJz1W3bt303veioiIhOjpa6Nq1q5CdnV1ufQiCIIwbN07o16+f3u8JrVYrDB8+XOjRo0eZunzYJ598IrRo0aLM5+9hJZ/TQYMGCYWFhbrtixcvFgIDA4U9e/YIgvBkfqZK3u/Fixfr1cvIkSPL1HfJ77eHBQYGCk2bNtX7XMTHxwuBgYHCihUrdNumTJkihIeHC/fu3dNtS0pKEkJCQsqUSYZjVx2ZxeDBg2Ftba173rJlSwDArVu3AEC3oGn//v2RmZmJjIwMZGRkoKCgAFFRUTh16lSZsRJDhgzR/V8ikaBZs2YQBEFvu6OjIxo1aqS7zsMGDhyo+1YNAL169YK7uzsOHjxY4es4dOgQJBJJmTsHJ0yYAEEQdE3nDg4O6NatG7Zu3arretFoNNi+fTu6desGW1tbvfN79eoFBwcH3fOS1rXnnnsOVlZWetvVajVSU1MBAMeOHUNOTg769u2rq7OMjAyIxWKEh4eXe2fciBEj9J5HRkaa5G62YcOGQSKR6G17uOVOrVYjMzMTDRo0gKOjIy5duvTYMo15fQ/r06cP1Go1du3apdt29OhR5OTkoE+fPrptjo6OiIuL09VrdezatQsuLi4YPXp0mX0lLRqGfo5KREVF6bVyhIeHAwB69Oih9xku+dw8+nm3tbVF3759dc/9/Pzg6OgIf39/XVkPl1tyviAI2LVrF6KjoyEIgt570KFDB+Tm5pbpzhw4cKDe+37p0iXcvn0bY8eOhaOjY7n1kZWVhRMnTqB3797Iy8vTXSMzMxMdOnRAUlJSpe+No6MjFAoFjh49WuExJYYPHw6pVKp7PmLECFhZWel+7p/Ez9ShQ4dgZWWld5xEIin3M1KRdu3aoUGDBrrnTZo0gb29ve690mg0OH78OLp16wZPT0/dcQ0bNkTHjh0Nvg6Vxa46Mot69erpPS/5BZqTkwMASEpKAoBKm65zc3Ph5ORUYZkODg6QyWRlmqUdHBzKHRfUsGFDvecikQgNGzas9M6ulJQUeHh46P2xAkq7lR4+d+DAgdi2bRtOnz6NVq1a4dixY3jw4AEGDBhQpty6deuWibmy7dnZ2fDx8dHV26PdESUejbO8+nFycip3jEdVlddlplQqsWjRImzYsAGpqal643fKG9/xqKq+vkc1adIEfn5+2L59O4YOHQqguJvOxcUFbdu21R03e/ZszJkzB126dEHTpk3RuXNnDBw4ED4+Po+N8VE3b95Eo0aN9BLeR1XlcwSU/RyUnOfl5aW3veTzUfJzVcLLy0uXpDx87OPOz8jIQE5ODtasWYM1a9aU+1oenZrk0c9ByR/2h7usH3Xz5k0IgoBvv/0W3377bbnHpKen6yUEDxs5ciS2b9+OyZMnw9PTE+3bt0fv3r3RqVOnMsc++nNvZ2cHd3d3XZ0/iZ+plJQUuLu7w87OTu+4Ro0alXuN8jz6GSi5Tsl7lZ6eDqVSWeb1AWVfM1UNEyeqlpK7PVQqVbn7FQpFmV/GACAWl9/YWfKHtOTfN998E8HBweUe+2grTXllPtri8eh1nqYOHTqgTp06+PPPP9GqVSv8+eefcHd3R7t27cocW1Hchtbbf/7zH7i7uz+23IquYwrl3Qn08ccf68apRUREwMHBASKRCK+99ppB70lVX195+vTpgx9++AEZGRmwt7fHvn370LdvX73Epk+fPmjZsiV2796No0ePYsmSJVi8eDHmz5+vG+huThW9TkM/78aeX9LK+9xzz5UZJ1bi0fFvFY0PrEzJdSZMmFBh68jDrS2PcnNzw6ZNm3DkyBEcOnQIhw4dwoYNGzBw4EB8+eWXVYrFkn6mDLmOOX631TZMnKhaSlp5bty4UeYbkEKhwL1799C+ffsql1vyzd7e3r7cxOJJePSuPkEQkJycXOlA6Pr16+P48ePIy8vT++aZmJio219CIpGgX79+2LhxI2bPno09e/aU251VHSX15ubmZrJ6e7Rlojp27tyJgQMHYs6cObptKpWqTGtTRdc0xevr06cPFixYgF27dqFOnTrIy8vT67Yq4eHhgVGjRmHUqFFIT0/HoEGD8MMPP1Q5cWrQoAHi4uKgVqv1uoQeVpXPkTm5urrCzs4OWq3W6PoveQ+vXr1aYRklx0ilUqOvY21tjejoaERHR0Or1eLDDz/EmjVr8Morr+i1uCQnJ+u1Nubn5+P+/fu61qkn8TNVv359nDhxAvn5+XqtTjdu3DBJ+UBxvDKZrNy7lcvbRobjGCeqlqioKEilUqxevbrMmKM1a9agqKio3Obxx2nWrBkaNGiApUuXIj8/v8z+imYqr45NmzbpbpUGgB07duj9Ai1Pp06doNFo8Ouvv+pt/+WXXyASicqcO2DAAGRnZ+P9999HQUFBhVMUGKtjx46wt7fHokWLoFary+w3pt5sbGwAlO3uMUZ5SeKKFSvK3Kpdcs1HEypTvD5/f38EBgZi27Zt2LZtG9zd3fXusNRoNGWu6+bmBg8PDxQWFupd6/r161AoFJVer0ePHsjMzCzzGQFKWweq+jkyF4lEgp49e2Lnzp24evVqmf2G1H/Tpk3h7e2N5cuXl/lMldSHm5sbWrdujTVr1iAtLa3K18nMzNR7LhaLdV+AHn4PgeLfUw9/llavXq33e+tJ/Ex16tQJRUVFWL16tW6bRqPBypUrq1xWRSQSCdq1a4e9e/fqjQdLTk7G4cOHTXad2ogtTlQtbm5umDZtGr755huMGjUK0dHRsLGxwd9//40tW7agQ4cORq3tJhaL8cknn2Dy5Mno168fBg8eDE9PT6SmpiI2Nhb29vb44YcfTPpanJycMHLkSAwePFg3HUHDhg0xbNiwCs+Jjo5GmzZt8PXXXyMlJQVBQUE4evQo9u7di3HjxpXpTggJCUFgYCB27NgBf3//Kt/a/jj29vb48MMP8eabb2Lw4MHo06cPXF1dcefOHRw8eBAtWrTA+++/X6Uy5XI5AgICsH37dvj6+sLZ2RmNGzeudIxKRbp06YI//vgD9vb2CAgIwNmzZ3Hs2DE4OzvrHRccHAyJRILFixcjNzcX1tbWaNu2Ldzc3Ezy+vr06YN58+ZBJpNhyJAhel2g+fn56Ny5M3r27IkmTZrA1tYWx44dw/nz5/Vayn799VcsWLAAy5cvR5s2bSq81sCBA7Fp0yZ8/vnnOHfuHCIjI6FQKHD8+HGMGDEC3bt3r/LnyJzeeOMNxMbGYtiwYRg6dCgCAgKQnZ2Nixcv4vjx44+dYV4sFuPDDz/Eyy+/jIEDB2Lw4MFwd3dHYmIirl27hiVLlgAonhJi5MiR6N+/P4YNGwYfHx88ePAAZ8+exb179/Dnn39WeI13330X2dnZaNu2LTw9PXHnzh2sXLkSwcHBunFjJdRqNcaPH4/evXvjxo0bWLVqFSIjI9GtWzcAT+ZnKjo6Gi1atMBXX32FlJQUBAQEYNeuXQaN86uK6dOn48iRIxgxYgRGjBgBrVaLlStXonHjxoiPjzfptWoTJk5UbS+//DLq16+PX3/9FQsXLkRRURG8vb0xY8YMvPTSSxWOy3mcNm3aYM2aNVi4cCFWrlyJgoICuLu76yb8M7WpU6fiypUr+PHHH5Gfn4+oqCh88MEHutaP8ojFYnz//feYN28etm3bhg0bNqB+/fp48803MWHChHLPGTBgAP773/+WOyjcFPr37w8PDw/8+OOPWLJkCQoLC+Hp6YmWLVti8ODBRpX5ySef4OOPP8bnn38OtVqN6dOnG5U4/fvf/4ZYLMbmzZuhUqnQokUL/Pzzz5g0aZLece7u7pg7dy4WLVqEf//739BoNFi+fDnc3NxM8vr69OmDb775BgqFAr1799bbJ5fLMWLECBw9ehS7du2CIAho0KCB7g95VZUkgN9//z22bNmCXbt2wdnZGS1atNC1ghjzOTKXOnXqYN26dfjuu++we/durF69Gs7OzggICNDNmfQ4HTt2xLJly/Ddd99h6dKlEAQBPj4+el9SAgICsH79eixYsAAbN25EVlYWXF1dERISgmnTplVa/nPPPYe1a9di1apVyMnJgbu7O3r37o0ZM2aU+X30/vvvY/PmzZg3bx7UajX69u2Ld999V6+72NQ/UyXv92effYY///wTIpEI0dHRmDNnDgYOHFjl8irSrFkzLF68GP/5z3/w7bffom7dupg5cyYSExN13cBUdSKBI8molouNjcXYsWPx7bffolevXk/8esuWLcPnn3+Offv2lbkTkIiejg0bNuDtt9/G77//jtDQUHOH81S98soruHbtmt60HGQ4jnEieooEQcDvv/+OVq1aMWkioidOqVTqPU9KSsKhQ4fQunVrM0VU87GrjugpKCgowL59+xAbG4urV69i4cKF5g6JiGqB7t27Y9CgQfDx8UFKSgp+++03SKXSMt3jZDgmTkRPQUZGBt544w04Ojpi6tSpuoGnRERPUseOHbF161bcv38f1tbWiIiIwOuvvw5fX19zh1ZjcYwTERERkYE4xomIiIjIQEyciIiIiAzEMU7V9Pfff0MQhAqXUiAiIiLLo1arIRKJ0Lx58yqdxxanahIE4YksqigIAgoLC7lg4z9YH6VYF/pYH6VYF/pYH6VYF/pK/nYbUx9scaqmkpYmU0+gVlBQgPj4eAQEBMDW1takZddErI9SrAt9rI9SrAt9rI9SrAt9JfVhTG8RW5yIiIiIDMTEiYiIiMhATJyIiIiIDMTEiYiIiMhATJyIiIiIDMTEiYiIiMhATJyIiIiIDMTEiYiIiMhATJyIiIiIDMTEiYiIiMhATJyIiIiIDMTEyUJl5KqhEByQkas2dyhERET0Dy7ya4HOxKdize7LyMrNh7PDXQyPaYLIYE9zh0VERFTrscXJwqRlFGDd3qtQqTUAAJVag3V7ryIts8DMkRERERETJwuTmavUJU0lVGoNsnJUZoqIiIiISjBxsjAuDnLIpBK9bTKpBM6OMjNFRERERCWYOFkYD1dbDO0WqEueZFIJhnYLhIeLrZkjIyIiIg4Ot0CRwZ7wdJUj+XYqGnp7wtvTydwhEREREdjiZLFcHaSQIxeuDlJzh0JERET/YOJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCAmTkREREQGYuJEREREZCArcwfwsOTkZCxZsgRxcXFISEiAn58ftmzZott/+/ZtdOvWrdxzra2tcf78+QrLjo2NxdixY8ts79OnD77++uvqB09ERETPPItKnBISEnDw4EGEh4dDq9VCEAS9/R4eHlizZo3eNkEQMGnSJLRt29aga3z++efw8/PTPXdxcal+4ERERFQrWFTiFB0dje7duwMA5syZgwsXLujtt7a2RkREhN622NhY5OXloV+/fgZdo3HjxggNDTVJvERERFS7WNQYJ7G46uFs2bIF9vb2iI6OfgIREREREZWyqBanqlKr1di1axdiYmIgk8kMOuell15CVlYW3N3d0bdvX8yaNQtyubxacQiCgIKCgmqV8SiFQqH3b23H+ijFutDH+ijFutDH+ijFutBXnXqo0YnToUOHkJWVZVA3nYODAyZNmoRWrVpBJpPhxIkTWLp0KRITE7Fo0aJqxaFWqxEfH1+tMiqSlJT0RMqtqVgfpVgX+lgfpVgX+lgfpVgX1VejE6fNmzejTp06iIqKeuyxISEhCAkJ0T2PioqCh4cHPvroI5w7dw5hYWFGxyGVShEQEGD0+eVRKBRISkqCr68vbGxsTFp2TcT6KMW60Mf6KMW60Mf6KMW60FdSH8aosYlTfn4+9u/fj6FDh0IikRhVRu/evfHRRx/hwoUL1UqcRCIRbG1tjT6/MjY2Nk+s7JqI9VGKdaGP9VGKdaGP9VGKdVF9FjU4vCp2794NpVKJ/v37mzsUIiIiqiVqbOK0ZcsWNGjQAOHh4UaXsXXrVgDg9ARERERkEIvqqlMoFDh48CAAICUlBXl5edixYwcAoHXr1nB1dQUAZGRk4Pjx45g8eXK55aSkpCAmJgavvPIKpk+fDgCYPXs2GjZsiJCQEN3g8F9++QXdu3dn4kREREQGsajEKT09HbNmzdLbVvJ8+fLlaNOmDQBg+/btKCoqqrCbThAEaDQavZnHGzdujM2bN2Pp0qVQq9WoX78+pk6dipdeeukJvRoiIiJ61lhU4uTt7Y0rV6489rhRo0Zh1KhR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RERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAYSCYIgmDuImuyvv/6CIAiwtrY2abmCIECtVkMqlUIkEpm07JqI9VGKdaGP9VGKdaGP9VGKdaGvpD5EIhFatGhRpXOtnlBMtcaT+gCKRCKTJ2M1GeujFOtCH+ujFOtCH+ujFOtCn0gk0j2qfC5bnIiIiIgMwzFORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZORERERAZi4kRERERkICZOFub69et48cUXERERgfbt2+M///kPCgsLzR2WWSQnJ+P999/HgAEDEBISgn79+pk7JLPZvn07Xn75ZXTq1AkREREYMGAAfv/9d9TWNboPHjyI0aNHo23btmjWrBm6deuGzz//HLm5ueYOzezy8/PRqVMnBAUF4fz58+YO56nbsGEDgoKCyjz+97//mTs0s9m4cSMGDhyI0NBQtGnTBpMmTYJSqTR3WE/dmDFjyv1sBAUFYevWrQaXY/UEY6Qqys7Oxrhx4+Dr64v58+cjNTUVX3zxBZRKJd5//31zh/fUJSQk4ODBgwgPD4dWq621SQIA/PLLL6hfvz7mzJkDFxcXHDt2DO+99x7u3buH6dOnmzu8py4rKwthYWEYM2YMnJ2dkZCQgPnz5yMhIQFLly41d3hmtXDhQmg0GnOHYXY//fQTHBwcdM89PT3NGI35fP/991i8eDGmTp2KiIgIZGZm4vjx47XyM/LBBx8gLy9Pb9uyZcuwa9cuREVFGV6QQBbjhx9+ECIiIoTMzEzdtt9++00IDg4W7t27Z77AzESj0ej+/9Zbbwl9+/Y1YzTmlZ6eXmbbu+++K7Ro0UKvnmqzNWvWCIGBgbXyZ6XEtWvXhIiICGH16tVCYGCgcO7cOXOH9NStX79eCAwMLPdnpra5fv26EBISIhw4cMDcoVis6OhoYfLkyVU6h111FuTQoUOIioqCs7Ozblvv3r2h1Wpx9OhR8wVmJmIxP54lXF1dy2wLDg5GXl4eCgoKzBCR5Sn5uVGr1eYNxIw++eQTvPDCC2jUqJG5QyELsGHDBnh7e6Nz587mDsUi/fXXX7h9+zb69+9fpfP4l8mCJCYm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", "text/plain": [ "