├── .gitignore
├── CNAME
├── README.md
├── babel.config.js
├── deploy.sh
├── docs
├── css
│ ├── app.0aa094f3.css
│ └── chunk-vendors.6fae3a8e.css
├── favicon.ico
├── index.html
└── js
│ ├── app.0813af13.js
│ ├── app.0813af13.js.map
│ ├── chunk-vendors.f1a14921.js
│ └── chunk-vendors.f1a14921.js.map
├── package.json
├── public
├── favicon.ico
└── index.html
├── src
├── App.vue
├── EventBus.js
├── assets
│ └── logo.png
├── calcs.js
├── components
│ ├── FeatureInfo.vue
│ ├── FilterForm.vue
│ ├── Map.vue
│ ├── NearestLocations.vue
│ ├── Result.vue
│ ├── Results.vue
│ └── sheetsToGeoJSON.js
├── main.js
├── plans.js
└── yarn.lock
├── vue.config.js
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | /yarn-error.log
3 | /dist/
4 |
--------------------------------------------------------------------------------
/CNAME:
--------------------------------------------------------------------------------
1 | getlon.lat
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## getlon.lat
2 |
3 | This simple website helps users find the geocoding service (API) that meets their needs. It was built as part of a research process to identify the right service for one particular software vendor, in March 2018. For that reason, it currently has a bias towards Australian coverage.
4 |
5 | http://getlon.lat
6 |
7 | The data will go out of date quickly, so: **contributors are very much wanted** to help keep it fresh. Just submit a pull request for changes to plans.js.
8 |
9 | ### Scope
10 |
11 | The site aims to include publicly-hosted geocoding APIs.
12 |
13 | Excluded for now:
14 |
15 | * Geoocoding software that must be downloaded and installed (such as [Pelias](https://github.com/pelias/pelias) and [Data61's gnaf geocoder](https://github.com/data61/gnaf).)
16 | * User-facing websites that allow upload of spreadsheets, but don't have APIs, such as [JoinAddress](https://geocoder.wigeogis.com/welcome).
17 |
18 | ### Building
19 |
20 | ```
21 | yarn install
22 | yarn run build
23 | ```
24 |
25 | This produces output in `./dist`.
26 |
27 | See [official install instruction for yarn](https://classic.yarnpkg.com/en/docs/install/). It is important especially on Debian-based system such as Ubuntu where standard installation method may result in `cmdtest` becoming installed [instead](https://github.com/yarnpkg/yarn/issues/2821).
28 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/app'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/deploy.sh:
--------------------------------------------------------------------------------
1 | mkdir -p docs
2 | rm -rf docs/*
3 | cp -pr dist/* docs/
4 | git add docs/*
5 | git commit -m 'Update'
6 | git push
--------------------------------------------------------------------------------
/docs/css/app.0aa094f3.css:
--------------------------------------------------------------------------------
1 | h4[data-v-43d233e8]{margin-bottom:0;margin-top:.5em}.form-group[data-v-43d233e8]{margin-bottom:10px;clear:left;margin-left:20px}input[type=number][data-v-43d233e8]{border:1px solid #d3d3d3;padding:8px;border-radius:4px;width:5em;margin-bottom:4px}input[type=checkbox][data-v-43d233e8]{margin-left:-20px}.radios .form-check[data-v-43d233e8]{margin-left:1em}.radios[data-v-43d233e8]{margin-bottom:1em}.caveats[data-v-43d233e8]{padding-left:0}label[data-v-43d233e8]{padding:6px}body[data-v-c392abb4],html[data-v-c392abb4]{height:100vh;width:100%;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}#sidebar[data-v-c392abb4]{min-width:250px}h1[data-v-c392abb4]{font-size:40px}.tag[data-v-c392abb4]{font-family:Bodoni MT,Didot,Didot LT STD,Hoefler Text,Garamond,Times New Roman,serif}
--------------------------------------------------------------------------------
/docs/css/chunk-vendors.6fae3a8e.css:
--------------------------------------------------------------------------------
1 | /*! TACHYONS v4.11.1 | http://tachyons.io */
2 | /*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}.border-box,a,article,aside,blockquote,body,code,dd,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,html,input[type=email],input[type=number],input[type=password],input[type=tel],input[type=text],input[type=url],legend,li,main,nav,ol,p,pre,section,table,td,textarea,th,tr,ul{-webkit-box-sizing:border-box;box-sizing:border-box}.aspect-ratio{height:0;position:relative}.aspect-ratio--16x9{padding-bottom:56.25%}.aspect-ratio--9x16{padding-bottom:177.77%}.aspect-ratio--4x3{padding-bottom:75%}.aspect-ratio--3x4{padding-bottom:133.33%}.aspect-ratio--6x4{padding-bottom:66.6%}.aspect-ratio--4x6{padding-bottom:150%}.aspect-ratio--8x5{padding-bottom:62.5%}.aspect-ratio--5x8{padding-bottom:160%}.aspect-ratio--7x5{padding-bottom:71.42%}.aspect-ratio--5x7{padding-bottom:140%}.aspect-ratio--1x1{padding-bottom:100%}.aspect-ratio--object{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}img{max-width:100%}.cover{background-size:cover!important}.contain{background-size:contain!important}.bg-center{background-position:50%}.bg-center,.bg-top{background-repeat:no-repeat}.bg-top{background-position:top}.bg-right{background-position:100%}.bg-bottom,.bg-right{background-repeat:no-repeat}.bg-bottom{background-position:bottom}.bg-left{background-repeat:no-repeat;background-position:0}.outline{outline:1px solid}.outline-transparent{outline:1px solid transparent}.outline-0{outline:0}.ba{border-style:solid;border-width:1px}.bt{border-top-style:solid;border-top-width:1px}.br{border-right-style:solid;border-right-width:1px}.bb{border-bottom-style:solid;border-bottom-width:1px}.bl{border-left-style:solid;border-left-width:1px}.bn{border-style:none;border-width:0}.b--black{border-color:#000}.b--near-black{border-color:#111}.b--dark-gray{border-color:#333}.b--mid-gray{border-color:#555}.b--gray{border-color:#777}.b--silver{border-color:#999}.b--light-silver{border-color:#aaa}.b--moon-gray{border-color:#ccc}.b--light-gray{border-color:#eee}.b--near-white{border-color:#f4f4f4}.b--white{border-color:#fff}.b--white-90{border-color:hsla(0,0%,100%,.9)}.b--white-80{border-color:hsla(0,0%,100%,.8)}.b--white-70{border-color:hsla(0,0%,100%,.7)}.b--white-60{border-color:hsla(0,0%,100%,.6)}.b--white-50{border-color:hsla(0,0%,100%,.5)}.b--white-40{border-color:hsla(0,0%,100%,.4)}.b--white-30{border-color:hsla(0,0%,100%,.3)}.b--white-20{border-color:hsla(0,0%,100%,.2)}.b--white-10{border-color:hsla(0,0%,100%,.1)}.b--white-05{border-color:hsla(0,0%,100%,.05)}.b--white-025{border-color:hsla(0,0%,100%,.025)}.b--white-0125{border-color:hsla(0,0%,100%,.0125)}.b--black-90{border-color:rgba(0,0,0,.9)}.b--black-80{border-color:rgba(0,0,0,.8)}.b--black-70{border-color:rgba(0,0,0,.7)}.b--black-60{border-color:rgba(0,0,0,.6)}.b--black-50{border-color:rgba(0,0,0,.5)}.b--black-40{border-color:rgba(0,0,0,.4)}.b--black-30{border-color:rgba(0,0,0,.3)}.b--black-20{border-color:rgba(0,0,0,.2)}.b--black-10{border-color:rgba(0,0,0,.1)}.b--black-05{border-color:rgba(0,0,0,.05)}.b--black-025{border-color:rgba(0,0,0,.025)}.b--black-0125{border-color:rgba(0,0,0,.0125)}.b--dark-red{border-color:#e7040f}.b--red{border-color:#ff4136}.b--light-red{border-color:#ff725c}.b--orange{border-color:#ff6300}.b--gold{border-color:#ffb700}.b--yellow{border-color:gold}.b--light-yellow{border-color:#fbf1a9}.b--purple{border-color:#5e2ca5}.b--light-purple{border-color:#a463f2}.b--dark-pink{border-color:#d5008f}.b--hot-pink{border-color:#ff41b4}.b--pink{border-color:#ff80cc}.b--light-pink{border-color:#ffa3d7}.b--dark-green{border-color:#137752}.b--green{border-color:#19a974}.b--light-green{border-color:#9eebcf}.b--navy{border-color:#001b44}.b--dark-blue{border-color:#00449e}.b--blue{border-color:#357edd}.b--light-blue{border-color:#96ccff}.b--lightest-blue{border-color:#cdecff}.b--washed-blue{border-color:#f6fffe}.b--washed-green{border-color:#e8fdf5}.b--washed-yellow{border-color:#fffceb}.b--washed-red{border-color:#ffdfdf}.b--transparent{border-color:transparent}.b--inherit{border-color:inherit}.br0{border-radius:0}.br1{border-radius:.125rem}.br2{border-radius:.25rem}.br3{border-radius:.5rem}.br4{border-radius:1rem}.br-100{border-radius:100%}.br-pill{border-radius:9999px}.br--bottom{border-top-left-radius:0;border-top-right-radius:0}.br--top{border-bottom-right-radius:0}.br--right,.br--top{border-bottom-left-radius:0}.br--right{border-top-left-radius:0}.br--left{border-top-right-radius:0;border-bottom-right-radius:0}.b--dotted{border-style:dotted}.b--dashed{border-style:dashed}.b--solid{border-style:solid}.b--none{border-style:none}.bw0{border-width:0}.bw1{border-width:.125rem}.bw2{border-width:.25rem}.bw3{border-width:.5rem}.bw4{border-width:1rem}.bw5{border-width:2rem}.bt-0{border-top-width:0}.br-0{border-right-width:0}.bb-0{border-bottom-width:0}.bl-0{border-left-width:0}.shadow-1{-webkit-box-shadow:0 0 4px 2px rgba(0,0,0,.2);box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2{-webkit-box-shadow:0 0 8px 2px rgba(0,0,0,.2);box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3{-webkit-box-shadow:2px 2px 4px 2px rgba(0,0,0,.2);box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4{-webkit-box-shadow:2px 2px 8px 0 rgba(0,0,0,.2);box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5{-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.2);box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-1{top:1rem}.right-1{right:1rem}.bottom-1{bottom:1rem}.left-1{left:1rem}.top-2{top:2rem}.right-2{right:2rem}.bottom-2{bottom:2rem}.left-2{left:2rem}.top--1{top:-1rem}.right--1{right:-1rem}.bottom--1{bottom:-1rem}.left--1{left:-1rem}.top--2{top:-2rem}.right--2{right:-2rem}.bottom--2{bottom:-2rem}.left--2{left:-2rem}.absolute--fill{top:0;right:0;bottom:0;left:0}.cf:after,.cf:before{content:" ";display:table}.cf:after{clear:both}.cf{*zoom:1}.cl{clear:left}.cr{clear:right}.cb{clear:both}.cn{clear:none}.dn{display:none}.di{display:inline}.db{display:block}.dib{display:inline-block}.dit{display:inline-table}.dt{display:table}.dtc{display:table-cell}.dt-row{display:table-row}.dt-row-group{display:table-row-group}.dt-column{display:table-column}.dt-column-group{display:table-column-group}.dt--fixed{table-layout:fixed;width:100%}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0;min-height:0}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-column{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-column,.flex-row{-webkit-box-direction:normal}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse}.flex-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.flex-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-end{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.items-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.items-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.self-start{-ms-flex-item-align:start;align-self:flex-start}.self-end{-ms-flex-item-align:end;align-self:flex-end}.self-center{-ms-flex-item-align:center;align-self:center}.self-baseline{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch{-ms-flex-item-align:stretch;align-self:stretch}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.justify-around{-ms-flex-pack:distribute;justify-content:space-around}.content-start{-ms-flex-line-pack:start;align-content:flex-start}.content-end{-ms-flex-line-pack:end;align-content:flex-end}.content-center{-ms-flex-line-pack:center;align-content:center}.content-between{-ms-flex-line-pack:justify;align-content:space-between}.content-around{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch{-ms-flex-line-pack:stretch;align-content:stretch}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-last{-webkit-box-ordinal-group:100000;-ms-flex-order:99999;order:99999}.flex-grow-0{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.flex-grow-1{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.flex-shrink-1{-ms-flex-negative:1;flex-shrink:1}.fl{float:left}.fl,.fr{_display:inline}.fr{float:right}.fn{float:none}.sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.serif{font-family:georgia,times,serif}.system-sans-serif{font-family:sans-serif}.system-serif{font-family:serif}.code,code{font-family:Consolas,monaco,monospace}.courier{font-family:Courier Next,courier,monospace}.helvetica{font-family:helvetica neue,helvetica,sans-serif}.avenir{font-family:avenir next,avenir,sans-serif}.athelas{font-family:athelas,georgia,serif}.georgia{font-family:georgia,serif}.times{font-family:times,serif}.bodoni{font-family:Bodoni MT,serif}.calisto{font-family:Calisto MT,serif}.garamond{font-family:garamond,serif}.baskerville{font-family:baskerville,serif}.i{font-style:italic}.fs-normal{font-style:normal}.normal{font-weight:400}.b{font-weight:700}.fw1{font-weight:100}.fw2{font-weight:200}.fw3{font-weight:300}.fw4{font-weight:400}.fw5{font-weight:500}.fw6{font-weight:600}.fw7{font-weight:700}.fw8{font-weight:800}.fw9{font-weight:900}.input-reset{-webkit-appearance:none;-moz-appearance:none}.button-reset::-moz-focus-inner,.input-reset::-moz-focus-inner{border:0;padding:0}.h1{height:1rem}.h2{height:2rem}.h3{height:4rem}.h4{height:8rem}.h5{height:16rem}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.min-h-100{min-height:100%}.vh-25{height:25vh}.vh-50{height:50vh}.vh-75{height:75vh}.vh-100{height:100vh}.min-vh-100{min-height:100vh}.h-auto{height:auto}.h-inherit{height:inherit}.tracked{letter-spacing:.1em}.tracked-tight{letter-spacing:-.05em}.tracked-mega{letter-spacing:.25em}.lh-solid{line-height:1}.lh-title{line-height:1.25}.lh-copy{line-height:1.5}.link{text-decoration:none}.link,.link:active,.link:focus,.link:hover,.link:link,.link:visited{-webkit-transition:color .15s ease-in;transition:color .15s ease-in}.link:focus{outline:1px dotted currentColor}.list{list-style-type:none}.mw-100{max-width:100%}.mw1{max-width:1rem}.mw2{max-width:2rem}.mw3{max-width:4rem}.mw4{max-width:8rem}.mw5{max-width:16rem}.mw6{max-width:32rem}.mw7{max-width:48rem}.mw8{max-width:64rem}.mw9{max-width:96rem}.mw-none{max-width:none}.w1{width:1rem}.w2{width:2rem}.w3{width:4rem}.w4{width:8rem}.w5{width:16rem}.w-10{width:10%}.w-20{width:20%}.w-25{width:25%}.w-30{width:30%}.w-33{width:33%}.w-34{width:34%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-70{width:70%}.w-75{width:75%}.w-80{width:80%}.w-90{width:90%}.w-100{width:100%}.w-third{width:33.33333%}.w-two-thirds{width:66.66667%}.w-auto{width:auto}.overflow-visible{overflow:visible}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-auto{overflow:auto}.overflow-x-visible{overflow-x:visible}.overflow-x-hidden{overflow-x:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-visible{overflow-y:visible}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.overflow-y-auto{overflow-y:auto}.static{position:static}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.o-100{opacity:1}.o-90{opacity:.9}.o-80{opacity:.8}.o-70{opacity:.7}.o-60{opacity:.6}.o-50{opacity:.5}.o-40{opacity:.4}.o-30{opacity:.3}.o-20{opacity:.2}.o-10{opacity:.1}.o-05{opacity:.05}.o-025{opacity:.025}.o-0{opacity:0}.rotate-45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.black-90{color:rgba(0,0,0,.9)}.black-80{color:rgba(0,0,0,.8)}.black-70{color:rgba(0,0,0,.7)}.black-60{color:rgba(0,0,0,.6)}.black-50{color:rgba(0,0,0,.5)}.black-40{color:rgba(0,0,0,.4)}.black-30{color:rgba(0,0,0,.3)}.black-20{color:rgba(0,0,0,.2)}.black-10{color:rgba(0,0,0,.1)}.black-05{color:rgba(0,0,0,.05)}.white-90{color:hsla(0,0%,100%,.9)}.white-80{color:hsla(0,0%,100%,.8)}.white-70{color:hsla(0,0%,100%,.7)}.white-60{color:hsla(0,0%,100%,.6)}.white-50{color:hsla(0,0%,100%,.5)}.white-40{color:hsla(0,0%,100%,.4)}.white-30{color:hsla(0,0%,100%,.3)}.white-20{color:hsla(0,0%,100%,.2)}.white-10{color:hsla(0,0%,100%,.1)}.black{color:#000}.near-black{color:#111}.dark-gray{color:#333}.mid-gray{color:#555}.gray{color:#777}.silver{color:#999}.light-silver{color:#aaa}.moon-gray{color:#ccc}.light-gray{color:#eee}.near-white{color:#f4f4f4}.white{color:#fff}.dark-red{color:#e7040f}.red{color:#ff4136}.light-red{color:#ff725c}.orange{color:#ff6300}.gold{color:#ffb700}.yellow{color:gold}.light-yellow{color:#fbf1a9}.purple{color:#5e2ca5}.light-purple{color:#a463f2}.dark-pink{color:#d5008f}.hot-pink{color:#ff41b4}.pink{color:#ff80cc}.light-pink{color:#ffa3d7}.dark-green{color:#137752}.green{color:#19a974}.light-green{color:#9eebcf}.navy{color:#001b44}.dark-blue{color:#00449e}.blue{color:#357edd}.light-blue{color:#96ccff}.lightest-blue{color:#cdecff}.washed-blue{color:#f6fffe}.washed-green{color:#e8fdf5}.washed-yellow{color:#fffceb}.washed-red{color:#ffdfdf}.color-inherit{color:inherit}.bg-black-90{background-color:rgba(0,0,0,.9)}.bg-black-80{background-color:rgba(0,0,0,.8)}.bg-black-70{background-color:rgba(0,0,0,.7)}.bg-black-60{background-color:rgba(0,0,0,.6)}.bg-black-50{background-color:rgba(0,0,0,.5)}.bg-black-40{background-color:rgba(0,0,0,.4)}.bg-black-30{background-color:rgba(0,0,0,.3)}.bg-black-20{background-color:rgba(0,0,0,.2)}.bg-black-10{background-color:rgba(0,0,0,.1)}.bg-black-05{background-color:rgba(0,0,0,.05)}.bg-white-90{background-color:hsla(0,0%,100%,.9)}.bg-white-80{background-color:hsla(0,0%,100%,.8)}.bg-white-70{background-color:hsla(0,0%,100%,.7)}.bg-white-60{background-color:hsla(0,0%,100%,.6)}.bg-white-50{background-color:hsla(0,0%,100%,.5)}.bg-white-40{background-color:hsla(0,0%,100%,.4)}.bg-white-30{background-color:hsla(0,0%,100%,.3)}.bg-white-20{background-color:hsla(0,0%,100%,.2)}.bg-white-10{background-color:hsla(0,0%,100%,.1)}.bg-black{background-color:#000}.bg-near-black{background-color:#111}.bg-dark-gray{background-color:#333}.bg-mid-gray{background-color:#555}.bg-gray{background-color:#777}.bg-silver{background-color:#999}.bg-light-silver{background-color:#aaa}.bg-moon-gray{background-color:#ccc}.bg-light-gray{background-color:#eee}.bg-near-white{background-color:#f4f4f4}.bg-white{background-color:#fff}.bg-transparent{background-color:transparent}.bg-dark-red{background-color:#e7040f}.bg-red{background-color:#ff4136}.bg-light-red{background-color:#ff725c}.bg-orange{background-color:#ff6300}.bg-gold{background-color:#ffb700}.bg-yellow{background-color:gold}.bg-light-yellow{background-color:#fbf1a9}.bg-purple{background-color:#5e2ca5}.bg-light-purple{background-color:#a463f2}.bg-dark-pink{background-color:#d5008f}.bg-hot-pink{background-color:#ff41b4}.bg-pink{background-color:#ff80cc}.bg-light-pink{background-color:#ffa3d7}.bg-dark-green{background-color:#137752}.bg-green{background-color:#19a974}.bg-light-green{background-color:#9eebcf}.bg-navy{background-color:#001b44}.bg-dark-blue{background-color:#00449e}.bg-blue{background-color:#357edd}.bg-light-blue{background-color:#96ccff}.bg-lightest-blue{background-color:#cdecff}.bg-washed-blue{background-color:#f6fffe}.bg-washed-green{background-color:#e8fdf5}.bg-washed-yellow{background-color:#fffceb}.bg-washed-red{background-color:#ffdfdf}.bg-inherit{background-color:inherit}.hover-black:focus,.hover-black:hover{color:#000}.hover-near-black:focus,.hover-near-black:hover{color:#111}.hover-dark-gray:focus,.hover-dark-gray:hover{color:#333}.hover-mid-gray:focus,.hover-mid-gray:hover{color:#555}.hover-gray:focus,.hover-gray:hover{color:#777}.hover-silver:focus,.hover-silver:hover{color:#999}.hover-light-silver:focus,.hover-light-silver:hover{color:#aaa}.hover-moon-gray:focus,.hover-moon-gray:hover{color:#ccc}.hover-light-gray:focus,.hover-light-gray:hover{color:#eee}.hover-near-white:focus,.hover-near-white:hover{color:#f4f4f4}.hover-white:focus,.hover-white:hover{color:#fff}.hover-black-90:focus,.hover-black-90:hover{color:rgba(0,0,0,.9)}.hover-black-80:focus,.hover-black-80:hover{color:rgba(0,0,0,.8)}.hover-black-70:focus,.hover-black-70:hover{color:rgba(0,0,0,.7)}.hover-black-60:focus,.hover-black-60:hover{color:rgba(0,0,0,.6)}.hover-black-50:focus,.hover-black-50:hover{color:rgba(0,0,0,.5)}.hover-black-40:focus,.hover-black-40:hover{color:rgba(0,0,0,.4)}.hover-black-30:focus,.hover-black-30:hover{color:rgba(0,0,0,.3)}.hover-black-20:focus,.hover-black-20:hover{color:rgba(0,0,0,.2)}.hover-black-10:focus,.hover-black-10:hover{color:rgba(0,0,0,.1)}.hover-white-90:focus,.hover-white-90:hover{color:hsla(0,0%,100%,.9)}.hover-white-80:focus,.hover-white-80:hover{color:hsla(0,0%,100%,.8)}.hover-white-70:focus,.hover-white-70:hover{color:hsla(0,0%,100%,.7)}.hover-white-60:focus,.hover-white-60:hover{color:hsla(0,0%,100%,.6)}.hover-white-50:focus,.hover-white-50:hover{color:hsla(0,0%,100%,.5)}.hover-white-40:focus,.hover-white-40:hover{color:hsla(0,0%,100%,.4)}.hover-white-30:focus,.hover-white-30:hover{color:hsla(0,0%,100%,.3)}.hover-white-20:focus,.hover-white-20:hover{color:hsla(0,0%,100%,.2)}.hover-white-10:focus,.hover-white-10:hover{color:hsla(0,0%,100%,.1)}.hover-inherit:focus,.hover-inherit:hover{color:inherit}.hover-bg-black:focus,.hover-bg-black:hover{background-color:#000}.hover-bg-near-black:focus,.hover-bg-near-black:hover{background-color:#111}.hover-bg-dark-gray:focus,.hover-bg-dark-gray:hover{background-color:#333}.hover-bg-mid-gray:focus,.hover-bg-mid-gray:hover{background-color:#555}.hover-bg-gray:focus,.hover-bg-gray:hover{background-color:#777}.hover-bg-silver:focus,.hover-bg-silver:hover{background-color:#999}.hover-bg-light-silver:focus,.hover-bg-light-silver:hover{background-color:#aaa}.hover-bg-moon-gray:focus,.hover-bg-moon-gray:hover{background-color:#ccc}.hover-bg-light-gray:focus,.hover-bg-light-gray:hover{background-color:#eee}.hover-bg-near-white:focus,.hover-bg-near-white:hover{background-color:#f4f4f4}.hover-bg-white:focus,.hover-bg-white:hover{background-color:#fff}.hover-bg-transparent:focus,.hover-bg-transparent:hover{background-color:transparent}.hover-bg-black-90:focus,.hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.hover-bg-black-80:focus,.hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.hover-bg-black-70:focus,.hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.hover-bg-black-60:focus,.hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.hover-bg-black-50:focus,.hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.hover-bg-black-40:focus,.hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.hover-bg-black-30:focus,.hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.hover-bg-black-20:focus,.hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.hover-bg-black-10:focus,.hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.hover-bg-white-90:focus,.hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.hover-bg-white-80:focus,.hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.hover-bg-white-70:focus,.hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.hover-bg-white-60:focus,.hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.hover-bg-white-50:focus,.hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.hover-bg-white-40:focus,.hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.hover-bg-white-30:focus,.hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.hover-bg-white-20:focus,.hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.hover-bg-white-10:focus,.hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.hover-dark-red:focus,.hover-dark-red:hover{color:#e7040f}.hover-red:focus,.hover-red:hover{color:#ff4136}.hover-light-red:focus,.hover-light-red:hover{color:#ff725c}.hover-orange:focus,.hover-orange:hover{color:#ff6300}.hover-gold:focus,.hover-gold:hover{color:#ffb700}.hover-yellow:focus,.hover-yellow:hover{color:gold}.hover-light-yellow:focus,.hover-light-yellow:hover{color:#fbf1a9}.hover-purple:focus,.hover-purple:hover{color:#5e2ca5}.hover-light-purple:focus,.hover-light-purple:hover{color:#a463f2}.hover-dark-pink:focus,.hover-dark-pink:hover{color:#d5008f}.hover-hot-pink:focus,.hover-hot-pink:hover{color:#ff41b4}.hover-pink:focus,.hover-pink:hover{color:#ff80cc}.hover-light-pink:focus,.hover-light-pink:hover{color:#ffa3d7}.hover-dark-green:focus,.hover-dark-green:hover{color:#137752}.hover-green:focus,.hover-green:hover{color:#19a974}.hover-light-green:focus,.hover-light-green:hover{color:#9eebcf}.hover-navy:focus,.hover-navy:hover{color:#001b44}.hover-dark-blue:focus,.hover-dark-blue:hover{color:#00449e}.hover-blue:focus,.hover-blue:hover{color:#357edd}.hover-light-blue:focus,.hover-light-blue:hover{color:#96ccff}.hover-lightest-blue:focus,.hover-lightest-blue:hover{color:#cdecff}.hover-washed-blue:focus,.hover-washed-blue:hover{color:#f6fffe}.hover-washed-green:focus,.hover-washed-green:hover{color:#e8fdf5}.hover-washed-yellow:focus,.hover-washed-yellow:hover{color:#fffceb}.hover-washed-red:focus,.hover-washed-red:hover{color:#ffdfdf}.hover-bg-dark-red:focus,.hover-bg-dark-red:hover{background-color:#e7040f}.hover-bg-red:focus,.hover-bg-red:hover{background-color:#ff4136}.hover-bg-light-red:focus,.hover-bg-light-red:hover{background-color:#ff725c}.hover-bg-orange:focus,.hover-bg-orange:hover{background-color:#ff6300}.hover-bg-gold:focus,.hover-bg-gold:hover{background-color:#ffb700}.hover-bg-yellow:focus,.hover-bg-yellow:hover{background-color:gold}.hover-bg-light-yellow:focus,.hover-bg-light-yellow:hover{background-color:#fbf1a9}.hover-bg-purple:focus,.hover-bg-purple:hover{background-color:#5e2ca5}.hover-bg-light-purple:focus,.hover-bg-light-purple:hover{background-color:#a463f2}.hover-bg-dark-pink:focus,.hover-bg-dark-pink:hover{background-color:#d5008f}.hover-bg-hot-pink:focus,.hover-bg-hot-pink:hover{background-color:#ff41b4}.hover-bg-pink:focus,.hover-bg-pink:hover{background-color:#ff80cc}.hover-bg-light-pink:focus,.hover-bg-light-pink:hover{background-color:#ffa3d7}.hover-bg-dark-green:focus,.hover-bg-dark-green:hover{background-color:#137752}.hover-bg-green:focus,.hover-bg-green:hover{background-color:#19a974}.hover-bg-light-green:focus,.hover-bg-light-green:hover{background-color:#9eebcf}.hover-bg-navy:focus,.hover-bg-navy:hover{background-color:#001b44}.hover-bg-dark-blue:focus,.hover-bg-dark-blue:hover{background-color:#00449e}.hover-bg-blue:focus,.hover-bg-blue:hover{background-color:#357edd}.hover-bg-light-blue:focus,.hover-bg-light-blue:hover{background-color:#96ccff}.hover-bg-lightest-blue:focus,.hover-bg-lightest-blue:hover{background-color:#cdecff}.hover-bg-washed-blue:focus,.hover-bg-washed-blue:hover{background-color:#f6fffe}.hover-bg-washed-green:focus,.hover-bg-washed-green:hover{background-color:#e8fdf5}.hover-bg-washed-yellow:focus,.hover-bg-washed-yellow:hover{background-color:#fffceb}.hover-bg-washed-red:focus,.hover-bg-washed-red:hover{background-color:#ffdfdf}.hover-bg-inherit:focus,.hover-bg-inherit:hover{background-color:inherit}.pa0{padding:0}.pa1{padding:.25rem}.pa2{padding:.5rem}.pa3{padding:1rem}.pa4{padding:2rem}.pa5{padding:4rem}.pa6{padding:8rem}.pa7{padding:16rem}.pl0{padding-left:0}.pl1{padding-left:.25rem}.pl2{padding-left:.5rem}.pl3{padding-left:1rem}.pl4{padding-left:2rem}.pl5{padding-left:4rem}.pl6{padding-left:8rem}.pl7{padding-left:16rem}.pr0{padding-right:0}.pr1{padding-right:.25rem}.pr2{padding-right:.5rem}.pr3{padding-right:1rem}.pr4{padding-right:2rem}.pr5{padding-right:4rem}.pr6{padding-right:8rem}.pr7{padding-right:16rem}.pb0{padding-bottom:0}.pb1{padding-bottom:.25rem}.pb2{padding-bottom:.5rem}.pb3{padding-bottom:1rem}.pb4{padding-bottom:2rem}.pb5{padding-bottom:4rem}.pb6{padding-bottom:8rem}.pb7{padding-bottom:16rem}.pt0{padding-top:0}.pt1{padding-top:.25rem}.pt2{padding-top:.5rem}.pt3{padding-top:1rem}.pt4{padding-top:2rem}.pt5{padding-top:4rem}.pt6{padding-top:8rem}.pt7{padding-top:16rem}.pv0{padding-top:0;padding-bottom:0}.pv1{padding-top:.25rem;padding-bottom:.25rem}.pv2{padding-top:.5rem;padding-bottom:.5rem}.pv3{padding-top:1rem;padding-bottom:1rem}.pv4{padding-top:2rem;padding-bottom:2rem}.pv5{padding-top:4rem;padding-bottom:4rem}.pv6{padding-top:8rem;padding-bottom:8rem}.pv7{padding-top:16rem;padding-bottom:16rem}.ph0{padding-left:0;padding-right:0}.ph1{padding-left:.25rem;padding-right:.25rem}.ph2{padding-left:.5rem;padding-right:.5rem}.ph3{padding-left:1rem;padding-right:1rem}.ph4{padding-left:2rem;padding-right:2rem}.ph5{padding-left:4rem;padding-right:4rem}.ph6{padding-left:8rem;padding-right:8rem}.ph7{padding-left:16rem;padding-right:16rem}.ma0{margin:0}.ma1{margin:.25rem}.ma2{margin:.5rem}.ma3{margin:1rem}.ma4{margin:2rem}.ma5{margin:4rem}.ma6{margin:8rem}.ma7{margin:16rem}.ml0{margin-left:0}.ml1{margin-left:.25rem}.ml2{margin-left:.5rem}.ml3{margin-left:1rem}.ml4{margin-left:2rem}.ml5{margin-left:4rem}.ml6{margin-left:8rem}.ml7{margin-left:16rem}.mr0{margin-right:0}.mr1{margin-right:.25rem}.mr2{margin-right:.5rem}.mr3{margin-right:1rem}.mr4{margin-right:2rem}.mr5{margin-right:4rem}.mr6{margin-right:8rem}.mr7{margin-right:16rem}.mb0{margin-bottom:0}.mb1{margin-bottom:.25rem}.mb2{margin-bottom:.5rem}.mb3{margin-bottom:1rem}.mb4{margin-bottom:2rem}.mb5{margin-bottom:4rem}.mb6{margin-bottom:8rem}.mb7{margin-bottom:16rem}.mt0{margin-top:0}.mt1{margin-top:.25rem}.mt2{margin-top:.5rem}.mt3{margin-top:1rem}.mt4{margin-top:2rem}.mt5{margin-top:4rem}.mt6{margin-top:8rem}.mt7{margin-top:16rem}.mv0{margin-top:0;margin-bottom:0}.mv1{margin-top:.25rem;margin-bottom:.25rem}.mv2{margin-top:.5rem;margin-bottom:.5rem}.mv3{margin-top:1rem;margin-bottom:1rem}.mv4{margin-top:2rem;margin-bottom:2rem}.mv5{margin-top:4rem;margin-bottom:4rem}.mv6{margin-top:8rem;margin-bottom:8rem}.mv7{margin-top:16rem;margin-bottom:16rem}.mh0{margin-left:0;margin-right:0}.mh1{margin-left:.25rem;margin-right:.25rem}.mh2{margin-left:.5rem;margin-right:.5rem}.mh3{margin-left:1rem;margin-right:1rem}.mh4{margin-left:2rem;margin-right:2rem}.mh5{margin-left:4rem;margin-right:4rem}.mh6{margin-left:8rem;margin-right:8rem}.mh7{margin-left:16rem;margin-right:16rem}.na1{margin:-.25rem}.na2{margin:-.5rem}.na3{margin:-1rem}.na4{margin:-2rem}.na5{margin:-4rem}.na6{margin:-8rem}.na7{margin:-16rem}.nl1{margin-left:-.25rem}.nl2{margin-left:-.5rem}.nl3{margin-left:-1rem}.nl4{margin-left:-2rem}.nl5{margin-left:-4rem}.nl6{margin-left:-8rem}.nl7{margin-left:-16rem}.nr1{margin-right:-.25rem}.nr2{margin-right:-.5rem}.nr3{margin-right:-1rem}.nr4{margin-right:-2rem}.nr5{margin-right:-4rem}.nr6{margin-right:-8rem}.nr7{margin-right:-16rem}.nb1{margin-bottom:-.25rem}.nb2{margin-bottom:-.5rem}.nb3{margin-bottom:-1rem}.nb4{margin-bottom:-2rem}.nb5{margin-bottom:-4rem}.nb6{margin-bottom:-8rem}.nb7{margin-bottom:-16rem}.nt1{margin-top:-.25rem}.nt2{margin-top:-.5rem}.nt3{margin-top:-1rem}.nt4{margin-top:-2rem}.nt5{margin-top:-4rem}.nt6{margin-top:-8rem}.nt7{margin-top:-16rem}.collapse{border-collapse:collapse;border-spacing:0}.striped--light-silver:nth-child(odd){background-color:#aaa}.striped--moon-gray:nth-child(odd){background-color:#ccc}.striped--light-gray:nth-child(odd){background-color:#eee}.striped--near-white:nth-child(odd){background-color:#f4f4f4}.stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.strike{text-decoration:line-through}.underline{text-decoration:underline}.no-underline{text-decoration:none}.tl{text-align:left}.tr{text-align:right}.tc{text-align:center}.tj{text-align:justify}.ttc{text-transform:capitalize}.ttl{text-transform:lowercase}.ttu{text-transform:uppercase}.ttn{text-transform:none}.f-6,.f-headline{font-size:6rem}.f-5,.f-subheadline{font-size:5rem}.f1{font-size:3rem}.f2{font-size:2.25rem}.f3{font-size:1.5rem}.f4{font-size:1.25rem}.f5{font-size:1rem}.f6{font-size:.875rem}.f7{font-size:.75rem}.measure{max-width:30em}.measure-wide{max-width:34em}.measure-narrow{max-width:20em}.indent{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps{font-variant:small-caps}.truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.overflow-container{overflow-y:scroll}.center{margin-left:auto}.center,.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal{white-space:normal}.nowrap{white-space:nowrap}.pre{white-space:pre}.v-base{vertical-align:baseline}.v-mid{vertical-align:middle}.v-top{vertical-align:top}.v-btm{vertical-align:bottom}.dim{opacity:1}.dim,.dim:focus,.dim:hover{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.dim:focus,.dim:hover{opacity:.5}.dim:active{opacity:.8;-webkit-transition:opacity .15s ease-out;transition:opacity .15s ease-out}.glow,.glow:focus,.glow:hover{-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.glow:focus,.glow:hover{opacity:1}.hide-child .child{opacity:0;-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.hide-child:active .child,.hide-child:focus .child,.hide-child:hover .child{opacity:1;-webkit-transition:opacity .15s ease-in;transition:opacity .15s ease-in}.underline-hover:focus,.underline-hover:hover{text-decoration:underline}.grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;-webkit-transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out,-webkit-transform .25s ease-out}.grow:focus,.grow:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.grow:active{-webkit-transform:scale(.9);transform:scale(.9)}.grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-in-out;-webkit-transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out,-webkit-transform .25s ease-in-out}.grow-large:focus,.grow-large:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.grow-large:active{-webkit-transform:scale(.95);transform:scale(.95)}.pointer:hover,.shadow-hover{cursor:pointer}.shadow-hover{position:relative;-webkit-transition:all .5s cubic-bezier(.165,.84,.44,1);transition:all .5s cubic-bezier(.165,.84,.44,1)}.shadow-hover:after{content:"";-webkit-box-shadow:0 0 16px 2px rgba(0,0,0,.2);box-shadow:0 0 16px 2px rgba(0,0,0,.2);border-radius:inherit;opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;-webkit-transition:opacity .5s cubic-bezier(.165,.84,.44,1);transition:opacity .5s cubic-bezier(.165,.84,.44,1)}.shadow-hover:focus:after,.shadow-hover:hover:after{opacity:1}.bg-animate,.bg-animate:focus,.bg-animate:hover{-webkit-transition:background-color .15s ease-in-out;transition:background-color .15s ease-in-out}.z-0{z-index:0}.z-1{z-index:1}.z-2{z-index:2}.z-3{z-index:3}.z-4{z-index:4}.z-5{z-index:5}.z-999{z-index:999}.z-9999{z-index:9999}.z-max{z-index:2147483647}.z-inherit{z-index:inherit}.z-initial{z-index:auto}.z-unset{z-index:unset}.nested-copy-line-height ol,.nested-copy-line-height p,.nested-copy-line-height ul{line-height:1.5}.nested-headline-line-height h1,.nested-headline-line-height h2,.nested-headline-line-height h3,.nested-headline-line-height h4,.nested-headline-line-height h5,.nested-headline-line-height h6{line-height:1.25}.nested-list-reset ol,.nested-list-reset ul{padding-left:0;margin-left:0;list-style-type:none}.nested-copy-indent p+p{text-indent:1em;margin-top:0;margin-bottom:0}.nested-copy-separator p+p{margin-top:1.5em}.nested-img img{width:100%;max-width:100%;display:block}.nested-links a{color:#357edd}.nested-links a,.nested-links a:focus,.nested-links a:hover{-webkit-transition:color .15s ease-in;transition:color .15s ease-in}.nested-links a:focus,.nested-links a:hover{color:#96ccff}.debug *{outline:1px solid gold}.debug-white *{outline:1px solid #fff}.debug-black *{outline:1px solid #000}.debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAFElEQVR4AWPAC97/9x0eCsAEPgwAVLshdpENIxcAAAAASUVORK5CYII=) repeat 0 0}.debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMklEQVR4AWOgCLz/b0epAa6UGuBOqQHOQHLUgFEDnAbcBZ4UGwDOkiCnkIhdgNgNxAYAiYlD+8sEuo8AAAAASUVORK5CYII=) repeat 0 0}.debug-grid-8-solid{background:#fff url(data:image/gif;base64,R0lGODdhCAAIAPEAAADw/wDx/////wAAACwAAAAACAAIAAACDZQvgaeb/lxbAIKA8y0AOw==) repeat 0 0}.debug-grid-16-solid{background:#fff url(data:image/gif;base64,R0lGODdhEAAQAPEAAADw/wDx/xXy/////ywAAAAAEAAQAAACIZyPKckYDQFsb6ZqD85jZ2+BkwiRFKehhqQCQgDHcgwEBQA7) repeat 0 0}@media screen and (min-width:30em){.aspect-ratio-ns{height:0;position:relative}.aspect-ratio--16x9-ns{padding-bottom:56.25%}.aspect-ratio--9x16-ns{padding-bottom:177.77%}.aspect-ratio--4x3-ns{padding-bottom:75%}.aspect-ratio--3x4-ns{padding-bottom:133.33%}.aspect-ratio--6x4-ns{padding-bottom:66.6%}.aspect-ratio--4x6-ns{padding-bottom:150%}.aspect-ratio--8x5-ns{padding-bottom:62.5%}.aspect-ratio--5x8-ns{padding-bottom:160%}.aspect-ratio--7x5-ns{padding-bottom:71.42%}.aspect-ratio--5x7-ns{padding-bottom:140%}.aspect-ratio--1x1-ns{padding-bottom:100%}.aspect-ratio--object-ns{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.cover-ns{background-size:cover!important}.contain-ns{background-size:contain!important}.bg-center-ns{background-position:50%}.bg-center-ns,.bg-top-ns{background-repeat:no-repeat}.bg-top-ns{background-position:top}.bg-right-ns{background-position:100%}.bg-bottom-ns,.bg-right-ns{background-repeat:no-repeat}.bg-bottom-ns{background-position:bottom}.bg-left-ns{background-repeat:no-repeat;background-position:0}.outline-ns{outline:1px solid}.outline-transparent-ns{outline:1px solid transparent}.outline-0-ns{outline:0}.ba-ns{border-style:solid;border-width:1px}.bt-ns{border-top-style:solid;border-top-width:1px}.br-ns{border-right-style:solid;border-right-width:1px}.bb-ns{border-bottom-style:solid;border-bottom-width:1px}.bl-ns{border-left-style:solid;border-left-width:1px}.bn-ns{border-style:none;border-width:0}.br0-ns{border-radius:0}.br1-ns{border-radius:.125rem}.br2-ns{border-radius:.25rem}.br3-ns{border-radius:.5rem}.br4-ns{border-radius:1rem}.br-100-ns{border-radius:100%}.br-pill-ns{border-radius:9999px}.br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.br--top-ns{border-bottom-right-radius:0}.br--right-ns,.br--top-ns{border-bottom-left-radius:0}.br--right-ns{border-top-left-radius:0}.br--left-ns{border-top-right-radius:0;border-bottom-right-radius:0}.b--dotted-ns{border-style:dotted}.b--dashed-ns{border-style:dashed}.b--solid-ns{border-style:solid}.b--none-ns{border-style:none}.bw0-ns{border-width:0}.bw1-ns{border-width:.125rem}.bw2-ns{border-width:.25rem}.bw3-ns{border-width:.5rem}.bw4-ns{border-width:1rem}.bw5-ns{border-width:2rem}.bt-0-ns{border-top-width:0}.br-0-ns{border-right-width:0}.bb-0-ns{border-bottom-width:0}.bl-0-ns{border-left-width:0}.shadow-1-ns{-webkit-box-shadow:0 0 4px 2px rgba(0,0,0,.2);box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2-ns{-webkit-box-shadow:0 0 8px 2px rgba(0,0,0,.2);box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3-ns{-webkit-box-shadow:2px 2px 4px 2px rgba(0,0,0,.2);box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4-ns{-webkit-box-shadow:2px 2px 8px 0 rgba(0,0,0,.2);box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5-ns{-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.2);box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.top-0-ns{top:0}.left-0-ns{left:0}.right-0-ns{right:0}.bottom-0-ns{bottom:0}.top-1-ns{top:1rem}.left-1-ns{left:1rem}.right-1-ns{right:1rem}.bottom-1-ns{bottom:1rem}.top-2-ns{top:2rem}.left-2-ns{left:2rem}.right-2-ns{right:2rem}.bottom-2-ns{bottom:2rem}.top--1-ns{top:-1rem}.right--1-ns{right:-1rem}.bottom--1-ns{bottom:-1rem}.left--1-ns{left:-1rem}.top--2-ns{top:-2rem}.right--2-ns{right:-2rem}.bottom--2-ns{bottom:-2rem}.left--2-ns{left:-2rem}.absolute--fill-ns{top:0;right:0;bottom:0;left:0}.cl-ns{clear:left}.cr-ns{clear:right}.cb-ns{clear:both}.cn-ns{clear:none}.dn-ns{display:none}.di-ns{display:inline}.db-ns{display:block}.dib-ns{display:inline-block}.dit-ns{display:inline-table}.dt-ns{display:table}.dtc-ns{display:table-cell}.dt-row-ns{display:table-row}.dt-row-group-ns{display:table-row-group}.dt-column-ns{display:table-column}.dt-column-group-ns{display:table-column-group}.dt--fixed-ns{table-layout:fixed;width:100%}.flex-ns{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex-ns{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.flex-auto-ns{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0;min-height:0}.flex-none-ns{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-column-ns{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.flex-row-ns{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.flex-wrap-ns{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap-ns{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-wrap-reverse-ns{-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse}.flex-column-reverse-ns{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.flex-row-reverse-ns{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.items-start-ns{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-end-ns{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.items-center-ns{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.items-baseline-ns{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.items-stretch-ns{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.self-start-ns{-ms-flex-item-align:start;align-self:flex-start}.self-end-ns{-ms-flex-item-align:end;align-self:flex-end}.self-center-ns{-ms-flex-item-align:center;align-self:center}.self-baseline-ns{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch-ns{-ms-flex-item-align:stretch;align-self:stretch}.justify-start-ns{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-end-ns{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.justify-center-ns{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between-ns{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.justify-around-ns{-ms-flex-pack:distribute;justify-content:space-around}.content-start-ns{-ms-flex-line-pack:start;align-content:flex-start}.content-end-ns{-ms-flex-line-pack:end;align-content:flex-end}.content-center-ns{-ms-flex-line-pack:center;align-content:center}.content-between-ns{-ms-flex-line-pack:justify;align-content:space-between}.content-around-ns{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch-ns{-ms-flex-line-pack:stretch;align-content:stretch}.order-0-ns{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1-ns{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2-ns{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3-ns{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4-ns{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5-ns{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6-ns{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7-ns{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8-ns{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-last-ns{-webkit-box-ordinal-group:100000;-ms-flex-order:99999;order:99999}.flex-grow-0-ns{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.flex-grow-1-ns{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.flex-shrink-0-ns{-ms-flex-negative:0;flex-shrink:0}.flex-shrink-1-ns{-ms-flex-negative:1;flex-shrink:1}.fl-ns{float:left}.fl-ns,.fr-ns{_display:inline}.fr-ns{float:right}.fn-ns{float:none}.i-ns{font-style:italic}.fs-normal-ns{font-style:normal}.normal-ns{font-weight:400}.b-ns{font-weight:700}.fw1-ns{font-weight:100}.fw2-ns{font-weight:200}.fw3-ns{font-weight:300}.fw4-ns{font-weight:400}.fw5-ns{font-weight:500}.fw6-ns{font-weight:600}.fw7-ns{font-weight:700}.fw8-ns{font-weight:800}.fw9-ns{font-weight:900}.h1-ns{height:1rem}.h2-ns{height:2rem}.h3-ns{height:4rem}.h4-ns{height:8rem}.h5-ns{height:16rem}.h-25-ns{height:25%}.h-50-ns{height:50%}.h-75-ns{height:75%}.h-100-ns{height:100%}.min-h-100-ns{min-height:100%}.vh-25-ns{height:25vh}.vh-50-ns{height:50vh}.vh-75-ns{height:75vh}.vh-100-ns{height:100vh}.min-vh-100-ns{min-height:100vh}.h-auto-ns{height:auto}.h-inherit-ns{height:inherit}.tracked-ns{letter-spacing:.1em}.tracked-tight-ns{letter-spacing:-.05em}.tracked-mega-ns{letter-spacing:.25em}.lh-solid-ns{line-height:1}.lh-title-ns{line-height:1.25}.lh-copy-ns{line-height:1.5}.mw-100-ns{max-width:100%}.mw1-ns{max-width:1rem}.mw2-ns{max-width:2rem}.mw3-ns{max-width:4rem}.mw4-ns{max-width:8rem}.mw5-ns{max-width:16rem}.mw6-ns{max-width:32rem}.mw7-ns{max-width:48rem}.mw8-ns{max-width:64rem}.mw9-ns{max-width:96rem}.mw-none-ns{max-width:none}.w1-ns{width:1rem}.w2-ns{width:2rem}.w3-ns{width:4rem}.w4-ns{width:8rem}.w5-ns{width:16rem}.w-10-ns{width:10%}.w-20-ns{width:20%}.w-25-ns{width:25%}.w-30-ns{width:30%}.w-33-ns{width:33%}.w-34-ns{width:34%}.w-40-ns{width:40%}.w-50-ns{width:50%}.w-60-ns{width:60%}.w-70-ns{width:70%}.w-75-ns{width:75%}.w-80-ns{width:80%}.w-90-ns{width:90%}.w-100-ns{width:100%}.w-third-ns{width:33.33333%}.w-two-thirds-ns{width:66.66667%}.w-auto-ns{width:auto}.overflow-visible-ns{overflow:visible}.overflow-hidden-ns{overflow:hidden}.overflow-scroll-ns{overflow:scroll}.overflow-auto-ns{overflow:auto}.overflow-x-visible-ns{overflow-x:visible}.overflow-x-hidden-ns{overflow-x:hidden}.overflow-x-scroll-ns{overflow-x:scroll}.overflow-x-auto-ns{overflow-x:auto}.overflow-y-visible-ns{overflow-y:visible}.overflow-y-hidden-ns{overflow-y:hidden}.overflow-y-scroll-ns{overflow-y:scroll}.overflow-y-auto-ns{overflow-y:auto}.static-ns{position:static}.relative-ns{position:relative}.absolute-ns{position:absolute}.fixed-ns{position:fixed}.rotate-45-ns{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90-ns{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135-ns{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180-ns{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225-ns{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270-ns{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315-ns{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.pa0-ns{padding:0}.pa1-ns{padding:.25rem}.pa2-ns{padding:.5rem}.pa3-ns{padding:1rem}.pa4-ns{padding:2rem}.pa5-ns{padding:4rem}.pa6-ns{padding:8rem}.pa7-ns{padding:16rem}.pl0-ns{padding-left:0}.pl1-ns{padding-left:.25rem}.pl2-ns{padding-left:.5rem}.pl3-ns{padding-left:1rem}.pl4-ns{padding-left:2rem}.pl5-ns{padding-left:4rem}.pl6-ns{padding-left:8rem}.pl7-ns{padding-left:16rem}.pr0-ns{padding-right:0}.pr1-ns{padding-right:.25rem}.pr2-ns{padding-right:.5rem}.pr3-ns{padding-right:1rem}.pr4-ns{padding-right:2rem}.pr5-ns{padding-right:4rem}.pr6-ns{padding-right:8rem}.pr7-ns{padding-right:16rem}.pb0-ns{padding-bottom:0}.pb1-ns{padding-bottom:.25rem}.pb2-ns{padding-bottom:.5rem}.pb3-ns{padding-bottom:1rem}.pb4-ns{padding-bottom:2rem}.pb5-ns{padding-bottom:4rem}.pb6-ns{padding-bottom:8rem}.pb7-ns{padding-bottom:16rem}.pt0-ns{padding-top:0}.pt1-ns{padding-top:.25rem}.pt2-ns{padding-top:.5rem}.pt3-ns{padding-top:1rem}.pt4-ns{padding-top:2rem}.pt5-ns{padding-top:4rem}.pt6-ns{padding-top:8rem}.pt7-ns{padding-top:16rem}.pv0-ns{padding-top:0;padding-bottom:0}.pv1-ns{padding-top:.25rem;padding-bottom:.25rem}.pv2-ns{padding-top:.5rem;padding-bottom:.5rem}.pv3-ns{padding-top:1rem;padding-bottom:1rem}.pv4-ns{padding-top:2rem;padding-bottom:2rem}.pv5-ns{padding-top:4rem;padding-bottom:4rem}.pv6-ns{padding-top:8rem;padding-bottom:8rem}.pv7-ns{padding-top:16rem;padding-bottom:16rem}.ph0-ns{padding-left:0;padding-right:0}.ph1-ns{padding-left:.25rem;padding-right:.25rem}.ph2-ns{padding-left:.5rem;padding-right:.5rem}.ph3-ns{padding-left:1rem;padding-right:1rem}.ph4-ns{padding-left:2rem;padding-right:2rem}.ph5-ns{padding-left:4rem;padding-right:4rem}.ph6-ns{padding-left:8rem;padding-right:8rem}.ph7-ns{padding-left:16rem;padding-right:16rem}.ma0-ns{margin:0}.ma1-ns{margin:.25rem}.ma2-ns{margin:.5rem}.ma3-ns{margin:1rem}.ma4-ns{margin:2rem}.ma5-ns{margin:4rem}.ma6-ns{margin:8rem}.ma7-ns{margin:16rem}.ml0-ns{margin-left:0}.ml1-ns{margin-left:.25rem}.ml2-ns{margin-left:.5rem}.ml3-ns{margin-left:1rem}.ml4-ns{margin-left:2rem}.ml5-ns{margin-left:4rem}.ml6-ns{margin-left:8rem}.ml7-ns{margin-left:16rem}.mr0-ns{margin-right:0}.mr1-ns{margin-right:.25rem}.mr2-ns{margin-right:.5rem}.mr3-ns{margin-right:1rem}.mr4-ns{margin-right:2rem}.mr5-ns{margin-right:4rem}.mr6-ns{margin-right:8rem}.mr7-ns{margin-right:16rem}.mb0-ns{margin-bottom:0}.mb1-ns{margin-bottom:.25rem}.mb2-ns{margin-bottom:.5rem}.mb3-ns{margin-bottom:1rem}.mb4-ns{margin-bottom:2rem}.mb5-ns{margin-bottom:4rem}.mb6-ns{margin-bottom:8rem}.mb7-ns{margin-bottom:16rem}.mt0-ns{margin-top:0}.mt1-ns{margin-top:.25rem}.mt2-ns{margin-top:.5rem}.mt3-ns{margin-top:1rem}.mt4-ns{margin-top:2rem}.mt5-ns{margin-top:4rem}.mt6-ns{margin-top:8rem}.mt7-ns{margin-top:16rem}.mv0-ns{margin-top:0;margin-bottom:0}.mv1-ns{margin-top:.25rem;margin-bottom:.25rem}.mv2-ns{margin-top:.5rem;margin-bottom:.5rem}.mv3-ns{margin-top:1rem;margin-bottom:1rem}.mv4-ns{margin-top:2rem;margin-bottom:2rem}.mv5-ns{margin-top:4rem;margin-bottom:4rem}.mv6-ns{margin-top:8rem;margin-bottom:8rem}.mv7-ns{margin-top:16rem;margin-bottom:16rem}.mh0-ns{margin-left:0;margin-right:0}.mh1-ns{margin-left:.25rem;margin-right:.25rem}.mh2-ns{margin-left:.5rem;margin-right:.5rem}.mh3-ns{margin-left:1rem;margin-right:1rem}.mh4-ns{margin-left:2rem;margin-right:2rem}.mh5-ns{margin-left:4rem;margin-right:4rem}.mh6-ns{margin-left:8rem;margin-right:8rem}.mh7-ns{margin-left:16rem;margin-right:16rem}.na1-ns{margin:-.25rem}.na2-ns{margin:-.5rem}.na3-ns{margin:-1rem}.na4-ns{margin:-2rem}.na5-ns{margin:-4rem}.na6-ns{margin:-8rem}.na7-ns{margin:-16rem}.nl1-ns{margin-left:-.25rem}.nl2-ns{margin-left:-.5rem}.nl3-ns{margin-left:-1rem}.nl4-ns{margin-left:-2rem}.nl5-ns{margin-left:-4rem}.nl6-ns{margin-left:-8rem}.nl7-ns{margin-left:-16rem}.nr1-ns{margin-right:-.25rem}.nr2-ns{margin-right:-.5rem}.nr3-ns{margin-right:-1rem}.nr4-ns{margin-right:-2rem}.nr5-ns{margin-right:-4rem}.nr6-ns{margin-right:-8rem}.nr7-ns{margin-right:-16rem}.nb1-ns{margin-bottom:-.25rem}.nb2-ns{margin-bottom:-.5rem}.nb3-ns{margin-bottom:-1rem}.nb4-ns{margin-bottom:-2rem}.nb5-ns{margin-bottom:-4rem}.nb6-ns{margin-bottom:-8rem}.nb7-ns{margin-bottom:-16rem}.nt1-ns{margin-top:-.25rem}.nt2-ns{margin-top:-.5rem}.nt3-ns{margin-top:-1rem}.nt4-ns{margin-top:-2rem}.nt5-ns{margin-top:-4rem}.nt6-ns{margin-top:-8rem}.nt7-ns{margin-top:-16rem}.strike-ns{text-decoration:line-through}.underline-ns{text-decoration:underline}.no-underline-ns{text-decoration:none}.tl-ns{text-align:left}.tr-ns{text-align:right}.tc-ns{text-align:center}.tj-ns{text-align:justify}.ttc-ns{text-transform:capitalize}.ttl-ns{text-transform:lowercase}.ttu-ns{text-transform:uppercase}.ttn-ns{text-transform:none}.f-6-ns,.f-headline-ns{font-size:6rem}.f-5-ns,.f-subheadline-ns{font-size:5rem}.f1-ns{font-size:3rem}.f2-ns{font-size:2.25rem}.f3-ns{font-size:1.5rem}.f4-ns{font-size:1.25rem}.f5-ns{font-size:1rem}.f6-ns{font-size:.875rem}.f7-ns{font-size:.75rem}.measure-ns{max-width:30em}.measure-wide-ns{max-width:34em}.measure-narrow-ns{max-width:20em}.indent-ns{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps-ns{font-variant:small-caps}.truncate-ns{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.center-ns{margin-left:auto}.center-ns,.mr-auto-ns{margin-right:auto}.ml-auto-ns{margin-left:auto}.clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal-ns{white-space:normal}.nowrap-ns{white-space:nowrap}.pre-ns{white-space:pre}.v-base-ns{vertical-align:baseline}.v-mid-ns{vertical-align:middle}.v-top-ns{vertical-align:top}.v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.aspect-ratio-m{height:0;position:relative}.aspect-ratio--16x9-m{padding-bottom:56.25%}.aspect-ratio--9x16-m{padding-bottom:177.77%}.aspect-ratio--4x3-m{padding-bottom:75%}.aspect-ratio--3x4-m{padding-bottom:133.33%}.aspect-ratio--6x4-m{padding-bottom:66.6%}.aspect-ratio--4x6-m{padding-bottom:150%}.aspect-ratio--8x5-m{padding-bottom:62.5%}.aspect-ratio--5x8-m{padding-bottom:160%}.aspect-ratio--7x5-m{padding-bottom:71.42%}.aspect-ratio--5x7-m{padding-bottom:140%}.aspect-ratio--1x1-m{padding-bottom:100%}.aspect-ratio--object-m{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.cover-m{background-size:cover!important}.contain-m{background-size:contain!important}.bg-center-m{background-position:50%}.bg-center-m,.bg-top-m{background-repeat:no-repeat}.bg-top-m{background-position:top}.bg-right-m{background-position:100%}.bg-bottom-m,.bg-right-m{background-repeat:no-repeat}.bg-bottom-m{background-position:bottom}.bg-left-m{background-repeat:no-repeat;background-position:0}.outline-m{outline:1px solid}.outline-transparent-m{outline:1px solid transparent}.outline-0-m{outline:0}.ba-m{border-style:solid;border-width:1px}.bt-m{border-top-style:solid;border-top-width:1px}.br-m{border-right-style:solid;border-right-width:1px}.bb-m{border-bottom-style:solid;border-bottom-width:1px}.bl-m{border-left-style:solid;border-left-width:1px}.bn-m{border-style:none;border-width:0}.br0-m{border-radius:0}.br1-m{border-radius:.125rem}.br2-m{border-radius:.25rem}.br3-m{border-radius:.5rem}.br4-m{border-radius:1rem}.br-100-m{border-radius:100%}.br-pill-m{border-radius:9999px}.br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.br--top-m{border-bottom-right-radius:0}.br--right-m,.br--top-m{border-bottom-left-radius:0}.br--right-m{border-top-left-radius:0}.br--left-m{border-top-right-radius:0;border-bottom-right-radius:0}.b--dotted-m{border-style:dotted}.b--dashed-m{border-style:dashed}.b--solid-m{border-style:solid}.b--none-m{border-style:none}.bw0-m{border-width:0}.bw1-m{border-width:.125rem}.bw2-m{border-width:.25rem}.bw3-m{border-width:.5rem}.bw4-m{border-width:1rem}.bw5-m{border-width:2rem}.bt-0-m{border-top-width:0}.br-0-m{border-right-width:0}.bb-0-m{border-bottom-width:0}.bl-0-m{border-left-width:0}.shadow-1-m{-webkit-box-shadow:0 0 4px 2px rgba(0,0,0,.2);box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2-m{-webkit-box-shadow:0 0 8px 2px rgba(0,0,0,.2);box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3-m{-webkit-box-shadow:2px 2px 4px 2px rgba(0,0,0,.2);box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4-m{-webkit-box-shadow:2px 2px 8px 0 rgba(0,0,0,.2);box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5-m{-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.2);box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.top-0-m{top:0}.left-0-m{left:0}.right-0-m{right:0}.bottom-0-m{bottom:0}.top-1-m{top:1rem}.left-1-m{left:1rem}.right-1-m{right:1rem}.bottom-1-m{bottom:1rem}.top-2-m{top:2rem}.left-2-m{left:2rem}.right-2-m{right:2rem}.bottom-2-m{bottom:2rem}.top--1-m{top:-1rem}.right--1-m{right:-1rem}.bottom--1-m{bottom:-1rem}.left--1-m{left:-1rem}.top--2-m{top:-2rem}.right--2-m{right:-2rem}.bottom--2-m{bottom:-2rem}.left--2-m{left:-2rem}.absolute--fill-m{top:0;right:0;bottom:0;left:0}.cl-m{clear:left}.cr-m{clear:right}.cb-m{clear:both}.cn-m{clear:none}.dn-m{display:none}.di-m{display:inline}.db-m{display:block}.dib-m{display:inline-block}.dit-m{display:inline-table}.dt-m{display:table}.dtc-m{display:table-cell}.dt-row-m{display:table-row}.dt-row-group-m{display:table-row-group}.dt-column-m{display:table-column}.dt-column-group-m{display:table-column-group}.dt--fixed-m{table-layout:fixed;width:100%}.flex-m{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex-m{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.flex-auto-m{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0;min-height:0}.flex-none-m{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-column-m{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-column-m,.flex-row-m{-webkit-box-direction:normal}.flex-row-m{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-wrap-m{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap-m{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-wrap-reverse-m{-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse}.flex-column-reverse-m{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.flex-row-reverse-m{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.items-start-m{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-end-m{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.items-center-m{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.items-baseline-m{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.items-stretch-m{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.self-start-m{-ms-flex-item-align:start;align-self:flex-start}.self-end-m{-ms-flex-item-align:end;align-self:flex-end}.self-center-m{-ms-flex-item-align:center;align-self:center}.self-baseline-m{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch-m{-ms-flex-item-align:stretch;align-self:stretch}.justify-start-m{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-end-m{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.justify-center-m{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between-m{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.justify-around-m{-ms-flex-pack:distribute;justify-content:space-around}.content-start-m{-ms-flex-line-pack:start;align-content:flex-start}.content-end-m{-ms-flex-line-pack:end;align-content:flex-end}.content-center-m{-ms-flex-line-pack:center;align-content:center}.content-between-m{-ms-flex-line-pack:justify;align-content:space-between}.content-around-m{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch-m{-ms-flex-line-pack:stretch;align-content:stretch}.order-0-m{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1-m{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2-m{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3-m{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4-m{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5-m{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6-m{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7-m{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8-m{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-last-m{-webkit-box-ordinal-group:100000;-ms-flex-order:99999;order:99999}.flex-grow-0-m{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.flex-grow-1-m{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.flex-shrink-0-m{-ms-flex-negative:0;flex-shrink:0}.flex-shrink-1-m{-ms-flex-negative:1;flex-shrink:1}.fl-m{float:left}.fl-m,.fr-m{_display:inline}.fr-m{float:right}.fn-m{float:none}.i-m{font-style:italic}.fs-normal-m{font-style:normal}.normal-m{font-weight:400}.b-m{font-weight:700}.fw1-m{font-weight:100}.fw2-m{font-weight:200}.fw3-m{font-weight:300}.fw4-m{font-weight:400}.fw5-m{font-weight:500}.fw6-m{font-weight:600}.fw7-m{font-weight:700}.fw8-m{font-weight:800}.fw9-m{font-weight:900}.h1-m{height:1rem}.h2-m{height:2rem}.h3-m{height:4rem}.h4-m{height:8rem}.h5-m{height:16rem}.h-25-m{height:25%}.h-50-m{height:50%}.h-75-m{height:75%}.h-100-m{height:100%}.min-h-100-m{min-height:100%}.vh-25-m{height:25vh}.vh-50-m{height:50vh}.vh-75-m{height:75vh}.vh-100-m{height:100vh}.min-vh-100-m{min-height:100vh}.h-auto-m{height:auto}.h-inherit-m{height:inherit}.tracked-m{letter-spacing:.1em}.tracked-tight-m{letter-spacing:-.05em}.tracked-mega-m{letter-spacing:.25em}.lh-solid-m{line-height:1}.lh-title-m{line-height:1.25}.lh-copy-m{line-height:1.5}.mw-100-m{max-width:100%}.mw1-m{max-width:1rem}.mw2-m{max-width:2rem}.mw3-m{max-width:4rem}.mw4-m{max-width:8rem}.mw5-m{max-width:16rem}.mw6-m{max-width:32rem}.mw7-m{max-width:48rem}.mw8-m{max-width:64rem}.mw9-m{max-width:96rem}.mw-none-m{max-width:none}.w1-m{width:1rem}.w2-m{width:2rem}.w3-m{width:4rem}.w4-m{width:8rem}.w5-m{width:16rem}.w-10-m{width:10%}.w-20-m{width:20%}.w-25-m{width:25%}.w-30-m{width:30%}.w-33-m{width:33%}.w-34-m{width:34%}.w-40-m{width:40%}.w-50-m{width:50%}.w-60-m{width:60%}.w-70-m{width:70%}.w-75-m{width:75%}.w-80-m{width:80%}.w-90-m{width:90%}.w-100-m{width:100%}.w-third-m{width:33.33333%}.w-two-thirds-m{width:66.66667%}.w-auto-m{width:auto}.overflow-visible-m{overflow:visible}.overflow-hidden-m{overflow:hidden}.overflow-scroll-m{overflow:scroll}.overflow-auto-m{overflow:auto}.overflow-x-visible-m{overflow-x:visible}.overflow-x-hidden-m{overflow-x:hidden}.overflow-x-scroll-m{overflow-x:scroll}.overflow-x-auto-m{overflow-x:auto}.overflow-y-visible-m{overflow-y:visible}.overflow-y-hidden-m{overflow-y:hidden}.overflow-y-scroll-m{overflow-y:scroll}.overflow-y-auto-m{overflow-y:auto}.static-m{position:static}.relative-m{position:relative}.absolute-m{position:absolute}.fixed-m{position:fixed}.rotate-45-m{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90-m{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135-m{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180-m{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225-m{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270-m{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315-m{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.pa0-m{padding:0}.pa1-m{padding:.25rem}.pa2-m{padding:.5rem}.pa3-m{padding:1rem}.pa4-m{padding:2rem}.pa5-m{padding:4rem}.pa6-m{padding:8rem}.pa7-m{padding:16rem}.pl0-m{padding-left:0}.pl1-m{padding-left:.25rem}.pl2-m{padding-left:.5rem}.pl3-m{padding-left:1rem}.pl4-m{padding-left:2rem}.pl5-m{padding-left:4rem}.pl6-m{padding-left:8rem}.pl7-m{padding-left:16rem}.pr0-m{padding-right:0}.pr1-m{padding-right:.25rem}.pr2-m{padding-right:.5rem}.pr3-m{padding-right:1rem}.pr4-m{padding-right:2rem}.pr5-m{padding-right:4rem}.pr6-m{padding-right:8rem}.pr7-m{padding-right:16rem}.pb0-m{padding-bottom:0}.pb1-m{padding-bottom:.25rem}.pb2-m{padding-bottom:.5rem}.pb3-m{padding-bottom:1rem}.pb4-m{padding-bottom:2rem}.pb5-m{padding-bottom:4rem}.pb6-m{padding-bottom:8rem}.pb7-m{padding-bottom:16rem}.pt0-m{padding-top:0}.pt1-m{padding-top:.25rem}.pt2-m{padding-top:.5rem}.pt3-m{padding-top:1rem}.pt4-m{padding-top:2rem}.pt5-m{padding-top:4rem}.pt6-m{padding-top:8rem}.pt7-m{padding-top:16rem}.pv0-m{padding-top:0;padding-bottom:0}.pv1-m{padding-top:.25rem;padding-bottom:.25rem}.pv2-m{padding-top:.5rem;padding-bottom:.5rem}.pv3-m{padding-top:1rem;padding-bottom:1rem}.pv4-m{padding-top:2rem;padding-bottom:2rem}.pv5-m{padding-top:4rem;padding-bottom:4rem}.pv6-m{padding-top:8rem;padding-bottom:8rem}.pv7-m{padding-top:16rem;padding-bottom:16rem}.ph0-m{padding-left:0;padding-right:0}.ph1-m{padding-left:.25rem;padding-right:.25rem}.ph2-m{padding-left:.5rem;padding-right:.5rem}.ph3-m{padding-left:1rem;padding-right:1rem}.ph4-m{padding-left:2rem;padding-right:2rem}.ph5-m{padding-left:4rem;padding-right:4rem}.ph6-m{padding-left:8rem;padding-right:8rem}.ph7-m{padding-left:16rem;padding-right:16rem}.ma0-m{margin:0}.ma1-m{margin:.25rem}.ma2-m{margin:.5rem}.ma3-m{margin:1rem}.ma4-m{margin:2rem}.ma5-m{margin:4rem}.ma6-m{margin:8rem}.ma7-m{margin:16rem}.ml0-m{margin-left:0}.ml1-m{margin-left:.25rem}.ml2-m{margin-left:.5rem}.ml3-m{margin-left:1rem}.ml4-m{margin-left:2rem}.ml5-m{margin-left:4rem}.ml6-m{margin-left:8rem}.ml7-m{margin-left:16rem}.mr0-m{margin-right:0}.mr1-m{margin-right:.25rem}.mr2-m{margin-right:.5rem}.mr3-m{margin-right:1rem}.mr4-m{margin-right:2rem}.mr5-m{margin-right:4rem}.mr6-m{margin-right:8rem}.mr7-m{margin-right:16rem}.mb0-m{margin-bottom:0}.mb1-m{margin-bottom:.25rem}.mb2-m{margin-bottom:.5rem}.mb3-m{margin-bottom:1rem}.mb4-m{margin-bottom:2rem}.mb5-m{margin-bottom:4rem}.mb6-m{margin-bottom:8rem}.mb7-m{margin-bottom:16rem}.mt0-m{margin-top:0}.mt1-m{margin-top:.25rem}.mt2-m{margin-top:.5rem}.mt3-m{margin-top:1rem}.mt4-m{margin-top:2rem}.mt5-m{margin-top:4rem}.mt6-m{margin-top:8rem}.mt7-m{margin-top:16rem}.mv0-m{margin-top:0;margin-bottom:0}.mv1-m{margin-top:.25rem;margin-bottom:.25rem}.mv2-m{margin-top:.5rem;margin-bottom:.5rem}.mv3-m{margin-top:1rem;margin-bottom:1rem}.mv4-m{margin-top:2rem;margin-bottom:2rem}.mv5-m{margin-top:4rem;margin-bottom:4rem}.mv6-m{margin-top:8rem;margin-bottom:8rem}.mv7-m{margin-top:16rem;margin-bottom:16rem}.mh0-m{margin-left:0;margin-right:0}.mh1-m{margin-left:.25rem;margin-right:.25rem}.mh2-m{margin-left:.5rem;margin-right:.5rem}.mh3-m{margin-left:1rem;margin-right:1rem}.mh4-m{margin-left:2rem;margin-right:2rem}.mh5-m{margin-left:4rem;margin-right:4rem}.mh6-m{margin-left:8rem;margin-right:8rem}.mh7-m{margin-left:16rem;margin-right:16rem}.na1-m{margin:-.25rem}.na2-m{margin:-.5rem}.na3-m{margin:-1rem}.na4-m{margin:-2rem}.na5-m{margin:-4rem}.na6-m{margin:-8rem}.na7-m{margin:-16rem}.nl1-m{margin-left:-.25rem}.nl2-m{margin-left:-.5rem}.nl3-m{margin-left:-1rem}.nl4-m{margin-left:-2rem}.nl5-m{margin-left:-4rem}.nl6-m{margin-left:-8rem}.nl7-m{margin-left:-16rem}.nr1-m{margin-right:-.25rem}.nr2-m{margin-right:-.5rem}.nr3-m{margin-right:-1rem}.nr4-m{margin-right:-2rem}.nr5-m{margin-right:-4rem}.nr6-m{margin-right:-8rem}.nr7-m{margin-right:-16rem}.nb1-m{margin-bottom:-.25rem}.nb2-m{margin-bottom:-.5rem}.nb3-m{margin-bottom:-1rem}.nb4-m{margin-bottom:-2rem}.nb5-m{margin-bottom:-4rem}.nb6-m{margin-bottom:-8rem}.nb7-m{margin-bottom:-16rem}.nt1-m{margin-top:-.25rem}.nt2-m{margin-top:-.5rem}.nt3-m{margin-top:-1rem}.nt4-m{margin-top:-2rem}.nt5-m{margin-top:-4rem}.nt6-m{margin-top:-8rem}.nt7-m{margin-top:-16rem}.strike-m{text-decoration:line-through}.underline-m{text-decoration:underline}.no-underline-m{text-decoration:none}.tl-m{text-align:left}.tr-m{text-align:right}.tc-m{text-align:center}.tj-m{text-align:justify}.ttc-m{text-transform:capitalize}.ttl-m{text-transform:lowercase}.ttu-m{text-transform:uppercase}.ttn-m{text-transform:none}.f-6-m,.f-headline-m{font-size:6rem}.f-5-m,.f-subheadline-m{font-size:5rem}.f1-m{font-size:3rem}.f2-m{font-size:2.25rem}.f3-m{font-size:1.5rem}.f4-m{font-size:1.25rem}.f5-m{font-size:1rem}.f6-m{font-size:.875rem}.f7-m{font-size:.75rem}.measure-m{max-width:30em}.measure-wide-m{max-width:34em}.measure-narrow-m{max-width:20em}.indent-m{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps-m{font-variant:small-caps}.truncate-m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.center-m{margin-left:auto}.center-m,.mr-auto-m{margin-right:auto}.ml-auto-m{margin-left:auto}.clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal-m{white-space:normal}.nowrap-m{white-space:nowrap}.pre-m{white-space:pre}.v-base-m{vertical-align:baseline}.v-mid-m{vertical-align:middle}.v-top-m{vertical-align:top}.v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.aspect-ratio-l{height:0;position:relative}.aspect-ratio--16x9-l{padding-bottom:56.25%}.aspect-ratio--9x16-l{padding-bottom:177.77%}.aspect-ratio--4x3-l{padding-bottom:75%}.aspect-ratio--3x4-l{padding-bottom:133.33%}.aspect-ratio--6x4-l{padding-bottom:66.6%}.aspect-ratio--4x6-l{padding-bottom:150%}.aspect-ratio--8x5-l{padding-bottom:62.5%}.aspect-ratio--5x8-l{padding-bottom:160%}.aspect-ratio--7x5-l{padding-bottom:71.42%}.aspect-ratio--5x7-l{padding-bottom:140%}.aspect-ratio--1x1-l{padding-bottom:100%}.aspect-ratio--object-l{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.cover-l{background-size:cover!important}.contain-l{background-size:contain!important}.bg-center-l{background-position:50%}.bg-center-l,.bg-top-l{background-repeat:no-repeat}.bg-top-l{background-position:top}.bg-right-l{background-position:100%}.bg-bottom-l,.bg-right-l{background-repeat:no-repeat}.bg-bottom-l{background-position:bottom}.bg-left-l{background-repeat:no-repeat;background-position:0}.outline-l{outline:1px solid}.outline-transparent-l{outline:1px solid transparent}.outline-0-l{outline:0}.ba-l{border-style:solid;border-width:1px}.bt-l{border-top-style:solid;border-top-width:1px}.br-l{border-right-style:solid;border-right-width:1px}.bb-l{border-bottom-style:solid;border-bottom-width:1px}.bl-l{border-left-style:solid;border-left-width:1px}.bn-l{border-style:none;border-width:0}.br0-l{border-radius:0}.br1-l{border-radius:.125rem}.br2-l{border-radius:.25rem}.br3-l{border-radius:.5rem}.br4-l{border-radius:1rem}.br-100-l{border-radius:100%}.br-pill-l{border-radius:9999px}.br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.br--top-l{border-bottom-right-radius:0}.br--right-l,.br--top-l{border-bottom-left-radius:0}.br--right-l{border-top-left-radius:0}.br--left-l{border-top-right-radius:0;border-bottom-right-radius:0}.b--dotted-l{border-style:dotted}.b--dashed-l{border-style:dashed}.b--solid-l{border-style:solid}.b--none-l{border-style:none}.bw0-l{border-width:0}.bw1-l{border-width:.125rem}.bw2-l{border-width:.25rem}.bw3-l{border-width:.5rem}.bw4-l{border-width:1rem}.bw5-l{border-width:2rem}.bt-0-l{border-top-width:0}.br-0-l{border-right-width:0}.bb-0-l{border-bottom-width:0}.bl-0-l{border-left-width:0}.shadow-1-l{-webkit-box-shadow:0 0 4px 2px rgba(0,0,0,.2);box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2-l{-webkit-box-shadow:0 0 8px 2px rgba(0,0,0,.2);box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3-l{-webkit-box-shadow:2px 2px 4px 2px rgba(0,0,0,.2);box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4-l{-webkit-box-shadow:2px 2px 8px 0 rgba(0,0,0,.2);box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5-l{-webkit-box-shadow:4px 4px 8px 0 rgba(0,0,0,.2);box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.top-0-l{top:0}.left-0-l{left:0}.right-0-l{right:0}.bottom-0-l{bottom:0}.top-1-l{top:1rem}.left-1-l{left:1rem}.right-1-l{right:1rem}.bottom-1-l{bottom:1rem}.top-2-l{top:2rem}.left-2-l{left:2rem}.right-2-l{right:2rem}.bottom-2-l{bottom:2rem}.top--1-l{top:-1rem}.right--1-l{right:-1rem}.bottom--1-l{bottom:-1rem}.left--1-l{left:-1rem}.top--2-l{top:-2rem}.right--2-l{right:-2rem}.bottom--2-l{bottom:-2rem}.left--2-l{left:-2rem}.absolute--fill-l{top:0;right:0;bottom:0;left:0}.cl-l{clear:left}.cr-l{clear:right}.cb-l{clear:both}.cn-l{clear:none}.dn-l{display:none}.di-l{display:inline}.db-l{display:block}.dib-l{display:inline-block}.dit-l{display:inline-table}.dt-l{display:table}.dtc-l{display:table-cell}.dt-row-l{display:table-row}.dt-row-group-l{display:table-row-group}.dt-column-l{display:table-column}.dt-column-group-l{display:table-column-group}.dt--fixed-l{table-layout:fixed;width:100%}.flex-l{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex-l{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.flex-auto-l{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0;min-height:0}.flex-none-l{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-column-l{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-column-l,.flex-row-l{-webkit-box-direction:normal}.flex-row-l{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-wrap-l{-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-nowrap-l{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.flex-wrap-reverse-l{-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse}.flex-column-reverse-l{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.flex-row-reverse-l{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.items-start-l{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-end-l{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.items-center-l{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.items-baseline-l{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.items-stretch-l{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.self-start-l{-ms-flex-item-align:start;align-self:flex-start}.self-end-l{-ms-flex-item-align:end;align-self:flex-end}.self-center-l{-ms-flex-item-align:center;align-self:center}.self-baseline-l{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch-l{-ms-flex-item-align:stretch;align-self:stretch}.justify-start-l{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-end-l{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.justify-center-l{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between-l{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.justify-around-l{-ms-flex-pack:distribute;justify-content:space-around}.content-start-l{-ms-flex-line-pack:start;align-content:flex-start}.content-end-l{-ms-flex-line-pack:end;align-content:flex-end}.content-center-l{-ms-flex-line-pack:center;align-content:center}.content-between-l{-ms-flex-line-pack:justify;align-content:space-between}.content-around-l{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch-l{-ms-flex-line-pack:stretch;align-content:stretch}.order-0-l{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1-l{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2-l{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3-l{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4-l{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5-l{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6-l{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7-l{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8-l{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-last-l{-webkit-box-ordinal-group:100000;-ms-flex-order:99999;order:99999}.flex-grow-0-l{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.flex-grow-1-l{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.flex-shrink-0-l{-ms-flex-negative:0;flex-shrink:0}.flex-shrink-1-l{-ms-flex-negative:1;flex-shrink:1}.fl-l{float:left}.fl-l,.fr-l{_display:inline}.fr-l{float:right}.fn-l{float:none}.i-l{font-style:italic}.fs-normal-l{font-style:normal}.normal-l{font-weight:400}.b-l{font-weight:700}.fw1-l{font-weight:100}.fw2-l{font-weight:200}.fw3-l{font-weight:300}.fw4-l{font-weight:400}.fw5-l{font-weight:500}.fw6-l{font-weight:600}.fw7-l{font-weight:700}.fw8-l{font-weight:800}.fw9-l{font-weight:900}.h1-l{height:1rem}.h2-l{height:2rem}.h3-l{height:4rem}.h4-l{height:8rem}.h5-l{height:16rem}.h-25-l{height:25%}.h-50-l{height:50%}.h-75-l{height:75%}.h-100-l{height:100%}.min-h-100-l{min-height:100%}.vh-25-l{height:25vh}.vh-50-l{height:50vh}.vh-75-l{height:75vh}.vh-100-l{height:100vh}.min-vh-100-l{min-height:100vh}.h-auto-l{height:auto}.h-inherit-l{height:inherit}.tracked-l{letter-spacing:.1em}.tracked-tight-l{letter-spacing:-.05em}.tracked-mega-l{letter-spacing:.25em}.lh-solid-l{line-height:1}.lh-title-l{line-height:1.25}.lh-copy-l{line-height:1.5}.mw-100-l{max-width:100%}.mw1-l{max-width:1rem}.mw2-l{max-width:2rem}.mw3-l{max-width:4rem}.mw4-l{max-width:8rem}.mw5-l{max-width:16rem}.mw6-l{max-width:32rem}.mw7-l{max-width:48rem}.mw8-l{max-width:64rem}.mw9-l{max-width:96rem}.mw-none-l{max-width:none}.w1-l{width:1rem}.w2-l{width:2rem}.w3-l{width:4rem}.w4-l{width:8rem}.w5-l{width:16rem}.w-10-l{width:10%}.w-20-l{width:20%}.w-25-l{width:25%}.w-30-l{width:30%}.w-33-l{width:33%}.w-34-l{width:34%}.w-40-l{width:40%}.w-50-l{width:50%}.w-60-l{width:60%}.w-70-l{width:70%}.w-75-l{width:75%}.w-80-l{width:80%}.w-90-l{width:90%}.w-100-l{width:100%}.w-third-l{width:33.33333%}.w-two-thirds-l{width:66.66667%}.w-auto-l{width:auto}.overflow-visible-l{overflow:visible}.overflow-hidden-l{overflow:hidden}.overflow-scroll-l{overflow:scroll}.overflow-auto-l{overflow:auto}.overflow-x-visible-l{overflow-x:visible}.overflow-x-hidden-l{overflow-x:hidden}.overflow-x-scroll-l{overflow-x:scroll}.overflow-x-auto-l{overflow-x:auto}.overflow-y-visible-l{overflow-y:visible}.overflow-y-hidden-l{overflow-y:hidden}.overflow-y-scroll-l{overflow-y:scroll}.overflow-y-auto-l{overflow-y:auto}.static-l{position:static}.relative-l{position:relative}.absolute-l{position:absolute}.fixed-l{position:fixed}.rotate-45-l{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90-l{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135-l{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180-l{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225-l{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270-l{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315-l{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.pa0-l{padding:0}.pa1-l{padding:.25rem}.pa2-l{padding:.5rem}.pa3-l{padding:1rem}.pa4-l{padding:2rem}.pa5-l{padding:4rem}.pa6-l{padding:8rem}.pa7-l{padding:16rem}.pl0-l{padding-left:0}.pl1-l{padding-left:.25rem}.pl2-l{padding-left:.5rem}.pl3-l{padding-left:1rem}.pl4-l{padding-left:2rem}.pl5-l{padding-left:4rem}.pl6-l{padding-left:8rem}.pl7-l{padding-left:16rem}.pr0-l{padding-right:0}.pr1-l{padding-right:.25rem}.pr2-l{padding-right:.5rem}.pr3-l{padding-right:1rem}.pr4-l{padding-right:2rem}.pr5-l{padding-right:4rem}.pr6-l{padding-right:8rem}.pr7-l{padding-right:16rem}.pb0-l{padding-bottom:0}.pb1-l{padding-bottom:.25rem}.pb2-l{padding-bottom:.5rem}.pb3-l{padding-bottom:1rem}.pb4-l{padding-bottom:2rem}.pb5-l{padding-bottom:4rem}.pb6-l{padding-bottom:8rem}.pb7-l{padding-bottom:16rem}.pt0-l{padding-top:0}.pt1-l{padding-top:.25rem}.pt2-l{padding-top:.5rem}.pt3-l{padding-top:1rem}.pt4-l{padding-top:2rem}.pt5-l{padding-top:4rem}.pt6-l{padding-top:8rem}.pt7-l{padding-top:16rem}.pv0-l{padding-top:0;padding-bottom:0}.pv1-l{padding-top:.25rem;padding-bottom:.25rem}.pv2-l{padding-top:.5rem;padding-bottom:.5rem}.pv3-l{padding-top:1rem;padding-bottom:1rem}.pv4-l{padding-top:2rem;padding-bottom:2rem}.pv5-l{padding-top:4rem;padding-bottom:4rem}.pv6-l{padding-top:8rem;padding-bottom:8rem}.pv7-l{padding-top:16rem;padding-bottom:16rem}.ph0-l{padding-left:0;padding-right:0}.ph1-l{padding-left:.25rem;padding-right:.25rem}.ph2-l{padding-left:.5rem;padding-right:.5rem}.ph3-l{padding-left:1rem;padding-right:1rem}.ph4-l{padding-left:2rem;padding-right:2rem}.ph5-l{padding-left:4rem;padding-right:4rem}.ph6-l{padding-left:8rem;padding-right:8rem}.ph7-l{padding-left:16rem;padding-right:16rem}.ma0-l{margin:0}.ma1-l{margin:.25rem}.ma2-l{margin:.5rem}.ma3-l{margin:1rem}.ma4-l{margin:2rem}.ma5-l{margin:4rem}.ma6-l{margin:8rem}.ma7-l{margin:16rem}.ml0-l{margin-left:0}.ml1-l{margin-left:.25rem}.ml2-l{margin-left:.5rem}.ml3-l{margin-left:1rem}.ml4-l{margin-left:2rem}.ml5-l{margin-left:4rem}.ml6-l{margin-left:8rem}.ml7-l{margin-left:16rem}.mr0-l{margin-right:0}.mr1-l{margin-right:.25rem}.mr2-l{margin-right:.5rem}.mr3-l{margin-right:1rem}.mr4-l{margin-right:2rem}.mr5-l{margin-right:4rem}.mr6-l{margin-right:8rem}.mr7-l{margin-right:16rem}.mb0-l{margin-bottom:0}.mb1-l{margin-bottom:.25rem}.mb2-l{margin-bottom:.5rem}.mb3-l{margin-bottom:1rem}.mb4-l{margin-bottom:2rem}.mb5-l{margin-bottom:4rem}.mb6-l{margin-bottom:8rem}.mb7-l{margin-bottom:16rem}.mt0-l{margin-top:0}.mt1-l{margin-top:.25rem}.mt2-l{margin-top:.5rem}.mt3-l{margin-top:1rem}.mt4-l{margin-top:2rem}.mt5-l{margin-top:4rem}.mt6-l{margin-top:8rem}.mt7-l{margin-top:16rem}.mv0-l{margin-top:0;margin-bottom:0}.mv1-l{margin-top:.25rem;margin-bottom:.25rem}.mv2-l{margin-top:.5rem;margin-bottom:.5rem}.mv3-l{margin-top:1rem;margin-bottom:1rem}.mv4-l{margin-top:2rem;margin-bottom:2rem}.mv5-l{margin-top:4rem;margin-bottom:4rem}.mv6-l{margin-top:8rem;margin-bottom:8rem}.mv7-l{margin-top:16rem;margin-bottom:16rem}.mh0-l{margin-left:0;margin-right:0}.mh1-l{margin-left:.25rem;margin-right:.25rem}.mh2-l{margin-left:.5rem;margin-right:.5rem}.mh3-l{margin-left:1rem;margin-right:1rem}.mh4-l{margin-left:2rem;margin-right:2rem}.mh5-l{margin-left:4rem;margin-right:4rem}.mh6-l{margin-left:8rem;margin-right:8rem}.mh7-l{margin-left:16rem;margin-right:16rem}.na1-l{margin:-.25rem}.na2-l{margin:-.5rem}.na3-l{margin:-1rem}.na4-l{margin:-2rem}.na5-l{margin:-4rem}.na6-l{margin:-8rem}.na7-l{margin:-16rem}.nl1-l{margin-left:-.25rem}.nl2-l{margin-left:-.5rem}.nl3-l{margin-left:-1rem}.nl4-l{margin-left:-2rem}.nl5-l{margin-left:-4rem}.nl6-l{margin-left:-8rem}.nl7-l{margin-left:-16rem}.nr1-l{margin-right:-.25rem}.nr2-l{margin-right:-.5rem}.nr3-l{margin-right:-1rem}.nr4-l{margin-right:-2rem}.nr5-l{margin-right:-4rem}.nr6-l{margin-right:-8rem}.nr7-l{margin-right:-16rem}.nb1-l{margin-bottom:-.25rem}.nb2-l{margin-bottom:-.5rem}.nb3-l{margin-bottom:-1rem}.nb4-l{margin-bottom:-2rem}.nb5-l{margin-bottom:-4rem}.nb6-l{margin-bottom:-8rem}.nb7-l{margin-bottom:-16rem}.nt1-l{margin-top:-.25rem}.nt2-l{margin-top:-.5rem}.nt3-l{margin-top:-1rem}.nt4-l{margin-top:-2rem}.nt5-l{margin-top:-4rem}.nt6-l{margin-top:-8rem}.nt7-l{margin-top:-16rem}.strike-l{text-decoration:line-through}.underline-l{text-decoration:underline}.no-underline-l{text-decoration:none}.tl-l{text-align:left}.tr-l{text-align:right}.tc-l{text-align:center}.tj-l{text-align:justify}.ttc-l{text-transform:capitalize}.ttl-l{text-transform:lowercase}.ttu-l{text-transform:uppercase}.ttn-l{text-transform:none}.f-6-l,.f-headline-l{font-size:6rem}.f-5-l,.f-subheadline-l{font-size:5rem}.f1-l{font-size:3rem}.f2-l{font-size:2.25rem}.f3-l{font-size:1.5rem}.f4-l{font-size:1.25rem}.f5-l{font-size:1rem}.f6-l{font-size:.875rem}.f7-l{font-size:.75rem}.measure-l{max-width:30em}.measure-wide-l{max-width:34em}.measure-narrow-l{max-width:20em}.indent-l{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps-l{font-variant:small-caps}.truncate-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.center-l{margin-left:auto}.center-l,.mr-auto-l{margin-right:auto}.ml-auto-l{margin-left:auto}.clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal-l{white-space:normal}.nowrap-l{white-space:nowrap}.pre-l{white-space:pre}.v-base-l{vertical-align:baseline}.v-mid-l{vertical-align:middle}.v-top-l{vertical-align:top}.v-btm-l{vertical-align:bottom}}
--------------------------------------------------------------------------------
/docs/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevage/which-geocoder/158f0e2260f2ed9a8a564c3fe1ad7881f4648f8c/docs/favicon.ico
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
getlon.lat
--------------------------------------------------------------------------------
/docs/js/app.0813af13.js:
--------------------------------------------------------------------------------
1 | (function(e){function t(t){for(var r,n,l=t[0],i=t[1],c=t[2],p=0,d=[];p-1:e.public},on:{change:function(t){var o=e.public,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.public=o.concat([s])):n>-1&&(e.public=o.slice(0,n).concat(o.slice(n+1)))}else e.public=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"public-facing"}},[e._v("Accessible to the public")])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.free,expression:"free"}],staticClass:"form-check-input",attrs:{id:"free",type:"checkbox"},domProps:{checked:Array.isArray(e.free)?e._i(e.free,null)>-1:e.free},on:{change:function(t){var o=e.free,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.free=o.concat([s])):n>-1&&(e.free=o.slice(0,n).concat(o.slice(n+1)))}else e.free=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"free"}},[e._v("Free of charge")])]),o("h4",[e._v("I need to:")]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.permanent,expression:"permanent"}],staticClass:"form-check-input",attrs:{id:"permanent-geocodes",type:"checkbox"},domProps:{checked:Array.isArray(e.permanent)?e._i(e.permanent,null)>-1:e.permanent},on:{change:function(t){var o=e.permanent,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.permanent=o.concat([s])):n>-1&&(e.permanent=o.slice(0,n).concat(o.slice(n+1)))}else e.permanent=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"permanent-geocodes"}},[e._v("Store geocodes permanently")])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.bulkJobs,expression:"bulkJobs"}],staticClass:"form-check-input",attrs:{id:"bulk-jobs",type:"checkbox"},domProps:{checked:Array.isArray(e.bulkJobs)?e._i(e.bulkJobs,null)>-1:e.bulkJobs},on:{change:function(t){var o=e.bulkJobs,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.bulkJobs=o.concat([s])):n>-1&&(e.bulkJobs=o.slice(0,n).concat(o.slice(n+1)))}else e.bulkJobs=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"bulk-jobs"}},[e._v("Carry out bulk jobs not triggered by users")])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.thirdParty,expression:"thirdParty"}],staticClass:"form-check-input",attrs:{id:"third-party",type:"checkbox"},domProps:{checked:Array.isArray(e.thirdParty)?e._i(e.thirdParty,null)>-1:e.thirdParty},on:{change:function(t){var o=e.thirdParty,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.thirdParty=o.concat([s])):n>-1&&(e.thirdParty=o.slice(0,n).concat(o.slice(n+1)))}else e.thirdParty=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"third-party"}},[e._v("Show results on third-party basemaps")])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.autoComplete,expression:"autoComplete"}],staticClass:"form-check-input",attrs:{id:"autocomplete",type:"checkbox"},domProps:{checked:Array.isArray(e.autoComplete)?e._i(e.autoComplete,null)>-1:e.autoComplete},on:{change:function(t){var o=e.autoComplete,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.autoComplete=o.concat([s])):n>-1&&(e.autoComplete=o.slice(0,n).concat(o.slice(n+1)))}else e.autoComplete=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"autocomplete"}},[e._v("Auto-complete addresses as they're typed")]),o("div",{staticClass:"form-row f7 ml3"},[o("input",{directives:[{name:"model",rawName:"v-model.number",value:e.autocompleteMultiplier,expression:"autocompleteMultiplier",modifiers:{number:!0}}],staticClass:"w3 form-control",attrs:{id:"autocomplete-multiplier",type:"number",placeholder:"10",disabled:!e.autoComplete},domProps:{value:e.autocompleteMultiplier},on:{input:function(t){t.target.composing||(e.autocompleteMultiplier=e._n(t.target.value))},blur:function(t){e.$forceUpdate()}}}),o("label",{attrs:{for:"null"}},[e._v("autocompletes per geocode.")])])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.reverseGeocode,expression:"reverseGeocode"}],staticClass:"form-check-input",attrs:{id:"reverse-geocode",type:"checkbox"},domProps:{checked:Array.isArray(e.reverseGeocode)?e._i(e.reverseGeocode,null)>-1:e.reverseGeocode},on:{change:function(t){var o=e.reverseGeocode,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.reverseGeocode=o.concat([s])):n>-1&&(e.reverseGeocode=o.slice(0,n).concat(o.slice(n+1)))}else e.reverseGeocode=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"reverse-geocode"}},[e._v("Reverse-geocode (find address from a pin drop)")])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.locationWeighting,expression:"locationWeighting"}],staticClass:"form-check-input",attrs:{id:"location-weighting",type:"checkbox"},domProps:{checked:Array.isArray(e.locationWeighting)?e._i(e.locationWeighting,null)>-1:e.locationWeighting},on:{change:function(t){var o=e.locationWeighting,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.locationWeighting=o.concat([s])):n>-1&&(e.locationWeighting=o.slice(0,n).concat(o.slice(n+1)))}else e.locationWeighting=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"location-weighting"}},[e._v("Prioritise results near a provided location")])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.mappingLibrary,expression:"mappingLibrary"}],staticClass:"form-check-input",attrs:{id:"mapping-library",type:"checkbox"},domProps:{checked:Array.isArray(e.mappingLibrary)?e._i(e.mappingLibrary,null)>-1:e.mappingLibrary},on:{change:function(t){var o=e.mappingLibrary,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.mappingLibrary=o.concat([s])):n>-1&&(e.mappingLibrary=o.slice(0,n).concat(o.slice(n+1)))}else e.mappingLibrary=a}}}),e._m(0)]),o("h4",[e._v("Miscellaneous")]),o("div",{staticClass:"radios"},[o("span",[e._v("Open data: ")]),o("div",{staticClass:"form-check form-check-inline"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.openData,expression:"openData"}],staticClass:"form-check-input",attrs:{id:"open-data-ok",type:"radio",name:"open-data"},domProps:{checked:e._q(e.openData,null)},on:{change:function(t){e.openData=null}}}),o("label",{staticClass:"form-check-label",attrs:{for:"open-data-ok"}},[e._v("It's ok")])]),o("div",{staticClass:"form-check form-check-inline"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.openData,expression:"openData"}],staticClass:"form-check-input",attrs:{id:"open-data-love",type:"radio",value:"true",name:"open-data"},domProps:{checked:e._q(e.openData,"true")},on:{change:function(t){e.openData="true"}}}),o("label",{staticClass:"form-check-label",attrs:{for:"open-data-love"}},[e._v("Love it")])]),o("div",{staticClass:"form-check form-check-inline"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.openData,expression:"openData"}],staticClass:"form-check-input",attrs:{id:"open-data-hate",type:"radio",value:"false",name:"open-data"},domProps:{checked:e._q(e.openData,"false")},on:{change:function(t){e.openData="false"}}}),o("label",{staticClass:"form-check-label",attrs:{for:"open-data-hate"}},[e._v("Hate it")])])]),o("div",{staticClass:"form-group"},[o("input",{directives:[{name:"model",rawName:"v-model",value:e.payAnnually,expression:"payAnnually"}],staticClass:"form-check-input",attrs:{id:"pay-annually",type:"checkbox"},domProps:{checked:Array.isArray(e.payAnnually)?e._i(e.payAnnually,null)>-1:e.payAnnually},on:{change:function(t){var o=e.payAnnually,r=t.target,a=!!r.checked;if(Array.isArray(o)){var s=null,n=e._i(o,s);r.checked?n<0&&(e.payAnnually=o.concat([s])):n>-1&&(e.payAnnually=o.slice(0,n).concat(o.slice(n+1)))}else e.payAnnually=a}}}),o("label",{staticClass:"form-check-label",attrs:{for:"pay-annually"}},[e._v("Happy to pay annually")])])]),o("h4",{staticClass:"background-light",attrs:{id:"caveats"}},[e._v("Caveats")]),e._m(1)])},i=[function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("label",{staticClass:"form-check-label",attrs:{for:"mapping-library"}},[e._v("Use my own mapping library "),o("br"),o("small",[e._v("(Leaflet, Mapbox-GL-JS, OpenLayers...)")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ul",{staticClass:"caveats"},[o("li",[e._v("Annual-payment discounts are not included.")]),o("li",[e._v("No assessment of quality.")]),o("li",[e._v("Not all known plans are included.")]),o("li",[e._v("Data on Google and Bing is pretty sparse.")]),o("li",[e._v("All prices in USD unless noted.")])])}],c={name:"FilterForm",data:function(){return{public:!1,free:!1,permanent:!1,openData:null,geocodesMonthly:5e3,geocodesDaily:100,geocodesSecondly:void 0,bulkJobs:!1,thirdParty:!1,autoComplete:!1,reverseGeocode:!1,locationWeighting:!1,mappingLibrary:!1,payAnnually:!1,autocompleteMultiplier:void 0}},created:function(){window.FilterForm=this},mounted:function(){var e=this;this.$nextTick(function(){return n.$emit("update-form",e)})},watch:{$data:{handler:function(){n.$emit("update-form",this)},deep:!0}}},u=c,p=(o("9723"),o("2877")),d=Object(p["a"])(u,l,i,!1,null,"43d233e8",null);d.options.__file="FilterForm.vue";var m=d.exports,h=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{attrs:{id:"Results"}},[o("div",{staticClass:"flex flex-wrap"},e._l(e.results,function(e){return o("Result",{attrs:{plan:e}})}),1)])},y=[],g=o("bfb3"),v=o.n(g),f=o("f499"),b=o.n(f),q=(o("55dd"),function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"Result w-25-ns ba b--gray ma1 pa3 shadow-4 br2 flex-grow",staticStyle:{"min-width":"300px"}},[o("h2",{staticClass:"card-title mt0 mb0 fw5"},[e._v(e._s(e.plan.group)+" ")]),o("h3",{staticClass:"mb-3 card-subtitle gray text-muted fw4 mt0"},[e._v(e._s(e.plan.name))]),o("div",{staticClass:"plan-details"},[o("div",{staticClass:"plan-details-inner"},[e.plan.custom?o("div",[o("p",[e._v("Custom plan by negotiation.")])]):o("div",[o("div",{staticClass:"f5"},[o("b",[e._v(e._s(e._f("money")(e.plan.dollarsMonthly,e.plan.currencySymbol))+" ")]),void 0!==e.plan.includedRequestsMonthly?o("span",[o("span",[e._v("for ")]),o("b",[e._v(e._s(e._f("integer")(e.plan.includedRequestsMonthly))+" ")]),o("span",[e._v("/mo.")])]):e.plan.includedRequestsDaily?o("span",[o("span",[e._v("for ")]),o("b",[e._v(e._s(e._f("integer")(e.plan.includedRequestsDaily))+" ")]),o("span",[e._v("/day ("+e._s(e._f("integer")(e.plan.includedRequestsDaily*e.MONTH))+" /mo.)")])]):e._e()]),e.plan.extra?o("div",{staticClass:"i extra"},[o("div",{staticClass:"f7"},[e._v(e._s(e.plan.extra))])]):e._e(),e.plan.maxRequestsDaily?o("p",[o("span",[e._v(e._s(e._f("integer")(e.plan.maxRequestsDaily))+" requests per day max.")])]):e._e()]),e.plan.requestsPerSecond?o("div",[o("p",[e._v("Rate limit: "+e._s(e.plan.requestsPerSecond)+" per sec")])]):e._e(),o("ul",{staticClass:"details"},[e.plan.openData?o("li",[e._v("ℹ Based on open data")]):e._e(),!0===e.plan.permanent?o("li",[e._v("✅ Storing geocodes ok")]):e._e(),"string"===typeof e.plan.permanent?o("li",[e._v("🚫 Storing geocodes: "+e._s(e.plan.permanent))]):e._e(),e.plan.permanent?e._e():o("li",[e._v("🚫 Must not store geocodes.")]),e.plan.thirdParty?o("li",[e._v("✅ Third-party basemaps ok")]):o("li",[e._v("🚫 Must not combine with third-party basemaps")]),e.plan.humanOnly?o("li",[e._v("🚫 No scripted queries")]):e._e(),e.plan.freeRequired?o("li",[o("del",[e._v("$")]),e._v(" Free apps only")]):e._e(),e.plan.publicRequired?o("li",[e._v("App must be public")]):e._e(),e._l(e.plan.provider.cons,function(t){return o("li",{staticClass:"con red"},[e._v("👎 "+e._s(t))])}),e.plan.provider.quality?o("li",[e._v(e._s(e.plan.provider.quality))]):e._e(),void 0!==e.plan.autocompleteMultiplier?o("li",[e._v("1 autocomplete = "+e._s(e.plan.autocompleteMultiplier)+" transactions.")]):e._e(),e.plan.termsUrl?o("li",[o("a",{attrs:{href:e.plan.termsUrl}},[e._v("Terms and conditions")])]):e._e()],2),o("div",[e.plan.provider.api.docs?o("a",{attrs:{href:e.plan.provider.api.docs}},[e._v("API")]):o("span",[e._v("API")])]),o("ul",{staticClass:"api"},[e.plan.provider.api.autocomplete?o("li",[e._v("✓ Auto-complete"),"string"===typeof e.plan.provider.api.autocomplete?o("a",{attrs:{href:e.plan.provider.api.autocomplete}},[e._v(" ℹ")]):e._e()]):e._e(),void 0===e.plan.provider.api.autocomplete?o("li",[e._v("? Auto-complete unknown")]):e._e(),!1===e.plan.provider.api.autocomplete?o("li",[e._v("𐄂 No auto-complete")]):e._e(),e.plan.provider.api.reverse?o("li",[e._v("✓ Reverse-geocode"),"string"===typeof e.plan.provider.api.reverse?o("a",{attrs:{href:e.plan.provider.api.reverse}},[e._v(" ℹ")]):e._e()]):e._e(),void 0===e.plan.provider.api.reverse?o("li",[e._v("? Reverse-geocode unknown")]):e._e(),!1===e.plan.provider.api.reverse?o("li",[e._v("𐄂 No reverse-geocode")]):e._e(),e.plan.provider.api.locationWeighting?o("li",[e._v("✓ Location-weighting"),"string"===typeof e.plan.provider.api.locationWeighting?o("a",{attrs:{href:e.plan.provider.api.locationWeighting}},[e._v(" ℹ")]):e._e()]):e._e(),void 0===e.plan.provider.api.locationWeighting?o("li",[e._v("? Location-weighting unknown")]):e._e(),!1===e.plan.provider.api.locationWeighting?o("li",[e._v("𐄂 No location-weighting")]):e._e(),e.plan.provider.playUrl?o("li",[o("a",{attrs:{href:e.plan.provider.playUrl}},[e._v("Test area")])]):e._e()]),e.plan.bonuses?o("ul",{staticClass:"bg-light-green bonuses ba b--dark-green alert alert-success"},e._l(e.plan.bonuses,function(t){return o("li",[e._v(e._s(t))])}),0):e._e(),e.plan.conditions?o("ul",{staticClass:"bg-light-yellow ba b--gold conditions alert alert-warning"},e._l(e.plan.conditions,function(t){return o("li",[o("span",{domProps:{innerHTML:e._s(t)}})])}),0):e._e()])]),o("p",{staticClass:"spacer"}),o("h5",[o("a",{staticClass:"db dark-blue animate hover-bg-washed-blue",attrs:{href:e.plan.url}},[o("div",{staticClass:"f1 tc annual-price"},[e._v(e._s(e._f("money")(e.plan._annualCost,e.plan.currencySymbol))),o("small",[e._v("/yr")])])])])])}),M=[],P=o("2be2"),x=o.n(P),R=30.4;r["a"].filter("money",function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"$";return void 0===e?"?":"number"===typeof e?t+x()(e.toFixed(0)):t+e}),r["a"].filter("integer",function(e){return 1e12===e?"unlimited":"number"===typeof e?x()(e.toFixed(0)):e});var _={name:"Result",props:["plan"],data:function(){return{MONTH:R}},created:function(){}},w=_,k=Object(p["a"])(w,q,M,!1,null,"e9ef3d02",null);k.options.__file="Result.vue";var S=k.exports,D=o("a4bb"),C=o.n(D),A=(o("ac6a"),30.4);function O(e,t){return"+ $"+e+" per "+t+"k ($"+(e/t).toFixed(2)+"/1k)"}var E={ArcGIS:{api:{docs:"https://developers.arcgis.com/rest/geocode/api-reference/overview-world-geocoding-service.htm",geocode:"https://developers.arcgis.com/rest/geocode/api-reference/geocoding-find-address-candidates.htm",reverse:"https://developers.arcgis.com/rest/geocode/api-reference/geocoding-reverse-geocode.htm",autocomplete:"https://developers.arcgis.com/rest/geocode/api-reference/geocoding-suggest.htm",batch:"https://developers.arcgis.com/rest/geocode/api-reference/geocoding-geocode-addresses.htm"},termsUrl:"https://www.esri.com/en-us/legal/terms/full-master-agreement/mla-e204-e300-english",openData:!1},Gisgraphy:{api:{docs:"https://www.gisgraphy.com/documentation/index.php",autocomplete:"https://www.gisgraphy.com/documentation/user-guide.php#fulltextservice",geocode:"https://www.gisgraphy.com/documentation/user-guide.php#geocodingservice",reverse:"https://www.gisgraphy.com/documentation/user-guide.php#reversegeocodingservice",locationWeighting:!0},termsUrl:"https://www.gisgraphy.com/terms.php",permanent:!0,humanOnly:!1,openData:!0,batch:"https://premium.gisgraphy.com/products#batch",quality:"★★☆ : OSM, OpenAddresses, Geonames..."},HERE:{api:{docs:"https://developer.here.com/documentation",autocomplete:"https://developer.here.com/documentation/geocoder-autocomplete/topics/quick-start.html",geocode:"https://developer.here.com/documentation/geocoder/topics/quick-start.html",reverse:"https://developer.here.com/documentation/geocoder/topics/resource-reverse-geocode.html",locationWeighting:!0},termsUrl:"https://developer.here.com/terms-and-conditions",permanent:"30 days",humanOnly:!0,humanOnlyNote:"You are not allowed to: ... issue queries (i) not responsive to end user actions; or (ii) that are subsequent or automatic follow-up queries related to an initial query or end user action (such as triggering automatic Request based on an end user's search result); or otherwise modify queries to the HERE Materials; "},OpenCage:{api:{docs:"https://opencagedata.com/api",geocode:"https://opencagedata.com/api#forward-resp",reverse:"https://opencagedata.com/api#reverse-resp",autocomplete:!1},termsUrl:"https://opencagedata.com/terms",quality:"AU: ★★★ GNAF, elsewhere: ★★☆ OSM + other open data sources"},Mapbox:{api:{geocode:"https://www.mapbox.com/api-documentation/#geocoding",reverse:"https://www.mapbox.com/api-documentation/#search-for-places",autocomplete:"https://www.mapbox.com/api-documentation/#geocoding",locationWeighting:"Filtering by bounding box, and 5 mile proximity bias."},termsUrl:"https://www.mapbox.com/tos/#geocoding"},"Geocode.xyz":{api:{geocode:"https://geocode.xyz/api",reverse:!0,autocomplete:!1}},LocationIQ:{api:{geocode:"https://locationiq.com/docs",reverse:"https://locationiq.com/docs",autocomplete:!0,batch:"https://locationiq.com/#batch-geocoding",locationWeighting:!0},termsUrl:"https://locationiq.com/tos",quality:"★★☆ OpenStreetMap, OpenAddresses, WhosonFirst, Polylines & Geonames."},Nominatim:{api:{docs:"https://nominatim.org/release-docs/develop/api/Overview/",geocode:"https://nominatim.org/release-docs/develop/api/Search/",reverse:"hhttps://nominatim.org/release-docs/develop/api/Reverse/",autocomplete:!1},termsUrl:"https://operations.osmfoundation.org/policies/nominatim/",quality:"★★☆ OSM"},Tomtom:{api:{docs:"https://developer.tomtom.com/online-search/online-search-documentation-search",geocode:"https://developer.tomtom.com/online-search/online-search-documentation-search/fuzzy-search",autocomplete:!0,reverse:"https://developer.tomtom.com/online-search/online-search-documentation-search/geometry-search",locationWeighting:!0},cons:['Can\'t display on an OSM or "open source" map.'],termsUrl:"https://developer.tomtom.com/terms-and-conditions",permanent:"30 days"},"Geocode.farm":{api:{docs:"https://geocode.farm/geocoding/free-api-documentation/",geocode:"https://geocode.farm/geocoding/free-api-documentation/",reverse:"https://geocode.farm/geocoding/free-api-documentation/",autocomplete:!1,locationWeighting:!0}},Bing:{api:{docs:"https://msdn.microsoft.com/en-us/library/ff701715.aspx",geocode:"https://msdn.microsoft.com/en-us/library/ff701714.aspx",reverse:"https://msdn.microsoft.com/en-us/library/ff701710.aspx",autocomplete:"https://msdn.microsoft.com/en-us/library/mt712650.aspx",locationWeighting:"https://msdn.microsoft.com/en-us/library/ff701704.aspx",playUrl:"http://www.bing.com/api/maps/sdkrelease/mapcontrol/isdk#autoSuggestUi+JS"},cons:['"Autosuggest" is not exactly autocomplete.',"Session management code required for cheapest pricing."],termsUrl:"https://www.microsoft.com/en-us/maps/product/terms"},Mapquest:{api:{docs:"https://developer.mapquest.com/documentation/geocoding-api/",geocode:"https://developer.mapquest.com/documentation/geocoding-api/",reverse:"https://developer.mapquest.com/documentation/geocoding-api/reverse/get/",locationWeighting:!0,autocomplete:"https://developer.mapquest.com/documentation/searchahead-api/"},quality:"AU: ★★☆ Unit-level",playUrl:"https://developer.mapquest.com/documentation/samples/geocoding/v1/address/",termsUrl:"https://developer.mapquest.com/legal"},Maplarge:{api:{docs:"http://www.maplarge.com/developer/geocoderapi",geocode:!0,reverse:!0,autocomplete:!1,locationWeighting:!1},cons:["API documentation looks old and broken."]},Photon:{api:{docs:"http://photon.komoot.de/",autocomplete:!0,geocode:"http://photon.komoot.de/",reverse:"http://photon.komoot.de/",locationWeighting:!0}},"Yahoo BOSS PlaceFinder":{cons:["Looks out of date and poorly maintained."],api:{}},"Pitney-Bowes":{cons:["No public plan information"],api:{docs:"https://locate.pitneybowes.com/",geocode:!0,reverse:!0,autocomplete:"https://locate.pitneybowes.com/geosearch"},termsUrl:"https://www.pitneybowes.com/us/developer/subscription-agreement.html?tab2"},"Geocode Earth":{api:{geocode:!0,reverse:!0,autocomplete:!0,locationWeighting:!0},quality:"AU: ★★★ GNAF, elsewhere: ★☆☆ OSM + OpenAddresses"},Google:{api:{geocode:!0,reverse:!0,docs:"https://developers.google.com/maps/documentation/geocoding/intro",locationWeighting:"https://developers.google.com/maps/documentation/geocoding/intro#Viewports",autocomplete:"https://developers.google.com/places/web-service/autocomplete"},cons:["Must use a Google Map (not Leaflet/Mapbox-GL-jS/OL)"],quality:"★★★ Top-notch",termsUrl:"https://enterprise.google.com/maps/terms/us/maps_purchase_agreement_emea.html"},PSMA:{quality:"AU: ★★★ Authoritative",api:{geocode:!0,reverse:!1,autocomplete:"https://developer.psma.com.au/api/predictive-address-verification/get/predictive/address"},playUrl:"https://demo.psma.com.au/predictive-address-verification"},SmartyStreets:{api:{geocode:!0,autocomplete:!1,reverse:!1,locationWeighting:!1}}},G=[{group:"ArcGIS",name:"Geosearch, Not Stored",dollarsMonthly:0,includedRequestsMonthly:1e6,permanent:!1,thirdParty:!0,url:"https://developers.arcgis.com/features/geocoding/",conditions:["must display attribution"]},{group:"ArcGIS",name:"Geocode, Batch or Stored",dollarsMonthly:0,includedRequestsMonthly:0,extraPer1000:4,permanent:!0,thirdParty:!0,url:"https://developers.arcgis.com/features/geocoding/",conditions:["must display attribution"]},{group:"Gisgraphy",name:"First",dollarsMonthly:93,includedRequestsMonthly:1296e3,requestsPerSecond:.5,url:"https://premium.gisgraphy.com/pricing",thirdParty:!0,publicRequired:!1,bonuses:["Entire SQL database can be downloaded."],freeRequired:!1,sortDollars:938,autocompleteMultiplier:1},{group:"Gisgraphy",name:"Standard",dollarsMonthly:235,includedRequestsMonthly:5184e3,requestsPerSecond:2,url:"https://premium.gisgraphy.com/pricing",thirdParty:!0,publicRequired:!1,bonuses:["Entire SQL database can be downloaded."],freeRequired:!1,sortDollars:2347,autocompleteMultiplier:1},{group:"Gisgraphy",name:"Business",dollarsMonthly:352,includedRequestsMonthly:1296e4,requestsPerSecond:5,url:"https://premium.gisgraphy.com/pricing",thirdParty:!0,publicRequired:!1,bonuses:["Entire SQL database can be downloaded."],freeRequired:!1,sortDollars:3522,autocompleteMultiplier:1},{group:"Gisgraphy",name:"Expert",dollarsMonthly:586,includedRequestsMonthly:216e5,requestsPerSecond:9,url:"https://premium.gisgraphy.com/pricing",thirdParty:!0,publicRequired:!1,bonuses:["Entire SQL database can be downloaded."],freeRequired:!1,sortDollars:5868,autocompleteMultiplier:1},{group:"HERE",name:"Public Basic",dollarsMonthly:0,includedRequestsMonthly:15e3,requestsPerSecond:1,extra:O(1,2),extraPer1000:.5,maxRequestsMonthly:!1,url:"https://developer.here.com/plans",thirdParty:!1,publicRequired:!0},{group:"HERE",name:"Public Starter",requestsPerSecond:1,dollarsMonthly:49,dollarsAnnually:490,includedRequestsMonthly:1e5,extra:O(1,2),extraPer1000:.5,maxRequestsMonthly:!1,url:"https://developer.here.com/plans",thirdParty:!1,publicRequired:!0},{group:"HERE",name:"Public Standard",includedRequestsMonthly:25e4,extra:O(1,2),extraPer1000:.5,maxRequestsMonthly:!1,requestsPerSecond:2,url:"https://developer.here.com/plans",dollarsMonthly:119,dollarsAnnually:1190,thirdParty:!1,publicRequired:!0},{group:"HERE",name:"Public Pro",includedRequestsMonthly:1e6,extra:O(1,2),extraPer1000:.5,maxRequestsMonthly:!1,requestsPerSecond:3,url:"https://developer.here.com/plans",dollarsMonthly:449,dollarsAnnually:4490,thirdParty:!1,publicRequired:!0},{group:"HERE",name:"Public Custom",includedRequestsMonthly:void 0,maxRequestsMonthly:void 0,url:"https://developer.here.com/plans",dollarsMonthly:void 0,custom:!0,publicRequired:!0,thirdParty:!1,sortDollars:5e3},{group:"HERE",name:"Business Starter",includedRequestsMonthly:5e4,extra:O(1,.2),extraPer1000:5,maxRequestsMonthly:!1,requestsPerSecond:1,url:"https://developer.here.com/plans",dollarsMonthly:199,dollarsAnnually:1990,thirdParty:!1,publicRequired:!1},{group:"HERE",name:"Business Standard",includedRequestsMonthly:1e5,extra:O(1,.2),extraPer1000:5,maxRequestsMonthly:!1,requestsPerSecond:2,url:"https://developer.here.com/plans",dollarsMonthly:349,dollarsAnnually:3490,publicRequired:!1,thirdParty:!1},{group:"HERE",name:"Business Pro",includedRequestsMonthly:15e4,extra:O(1,.2),extraPer1000:5,maxRequestsMonthly:!1,requestsPerSecond:3,url:"https://developer.here.com/plans",dollarsMonthly:499,dollarsAnnually:4990,thirdParty:!1,publicRequired:!1},{group:"HERE",name:"Business Custom",includedRequestsMonthly:void 0,maxRequestsMonthly:void 0,url:"https://developer.here.com/plans",dollarsMonthly:void 0,bonuses:["Permanent storage +$5k/year."],custom:!0,publicRequired:!1,permanent:!0,thirdParty:!1,sortDollars:1e4},{group:"Bing",name:"Consumer, Free",includedRequestsMonthly:125e3/12,maxRequestsMonthly:125e3/12,dollarsMonthly:0,publicRequired:!0,freeRequired:!0,permanent:!1,thirdParty:!0,conditions:["Max 125,000 transactions per year"],bonuses:['Local caching of geocodes is allowed "for use with your Company Applications"'],url:"https://www.microsoft.com/en-us/maps/licensing/options",autocompleteMultiplier:0},{group:"Bing",name:"Non-profit, Free",includedRequestsDaily:5e4,maxRequestsMonthly:5e4*A,dollarsMonthly:0,publicRequired:!0,permanent:!1,freeRequired:!0,conditions:["Must be non-profit.","Less than 50k transactions per 24 hours."],bonuses:['Local caching of geocodes is allowed "for use with your Company Applications"'],thirdParty:!0,url:"https://www.microsoft.com/en-us/maps/licensing/options",autocompleteMultiplier:0},{group:"Bing",name:"Quote #1",includedRequestsMonthly:5e5/12,dollarsMonthly:385,sortDollars:3680,permanent:!1,thirdParty:!0,autocompleteMultiplier:0,bonuses:['Local caching of geocodes is allowed "for use with your Company Applications"']},{group:"Bing",name:"Quote #2",includedRequestsMonthly:1e6/12,dollarsMonthly:6050/12,sortDollars:4818,permanent:!1,thirdParty:!0,autocompleteMultiplier:0,bonuses:['Local caching of geocodes is allowed "for use with your Company Applications"']},{group:"Mapbox",name:"Pay-as-you-go",includedRequestsMonthly:5e4,maxRequestsMonthly:!1,dollarsMonthly:0,extra:"+ 50c/1000",extraPer1000:.5,publicRequired:!0,requestsPerSecond:10,freeRequired:!0,thirdParty:!1,conditions:["No bulk jobs.","Must display on Mapbox map.","May not reveal lat/lon to user.","Must not cache at all."],humanOnly:!0,url:"https://www.mapbox.com/pricing/"},{group:"Mapbox",name:"Commercial",includedRequestsMonthly:5e4,maxRequestsMonthly:!1,dollarsMonthly:499,publicRequired:!1,thirdParty:!1,requestsPerSecond:10,conditions:["No bulk jobs.","Must display on Mapbox map.","May not reveal lat/lon to user.","Must not cache at all."],extraPer1000:.5,extra:"+$0.50 per 1000 requests",humanOnly:!0,url:"https://www.mapbox.com/pricing/"},{group:"Mapbox",name:"Enterprise",includedRequestsMonthly:void 0,maxRequestsMonthly:!1,dollarsMonthly:void 0,custom:!0,publicRequired:!1,thirdParty:!1,requestsPerSecond:20,permanent:!0,bonuses:["50 locations per request"],sortDollars:12500,humanOnly:!1,url:"https://www.mapbox.com/pricing/"},{group:"OpenCage",name:"Free Trial",includedRequestsDaily:2500,requestsPerSecond:1,dollarsMonthly:0,permanent:!0,openData:!0,thirdParty:!0,url:"https://opencagedata.com/pricing"},{group:"OpenCage",name:"X-Small",includedRequestsDaily:1e4,requestsPerSecond:10,dollarsMonthly:66,currencySymbol:"$A",permanent:!0,openData:!0,thirdParty:!0,url:"https://opencagedata.com/pricing"},{group:"OpenCage",name:"Small",includedRequestsDaily:2e4,requestsPerSecond:12,dollarsMonthly:132,currencySymbol:"$A",permanent:!0,openData:!0,thirdParty:!0,url:"https://opencagedata.com/pricing"},{group:"OpenCage",name:"Medium",includedRequestsDaily:1e5,requestsPerSecond:15,dollarsMonthly:660,currencySymbol:"$A",permanent:!0,openData:!0,thirdParty:!0,url:"https://opencagedata.com/pricing"},{group:"OpenCage",name:"Large",includedRequestsDaily:1e6,requestsPerSecond:15,dollarsMonthly:1320,currencySymbol:"$A",permanent:!0,url:"https://opencagedata.com/pricing",openData:!0,thirdParty:!0},{group:"Google",name:"Standard",includedRequestsDaily:2500,maxRequestsMonthly:1e5,freeRequired:!0,publicRequired:!0,totalMonthly:function(e){return 0+.5*Math.max(e-2500*A,0)/1e3},url:"https://developers.google.com/maps/pricing-and-plans/#details",thirdParty:!1,humanOnly:!0,libraryRequired:!0,conditions:["Your ToS and Privacy Policy must reference Google's","No bulk downloads"],autocompleteMultiplier:.4,bonuses:["Excellent worldwide quality"]},{group:"Google",name:"Premium",includedRequestsMonthly:1e5*A,custom:!0,url:"https://developers.google.com/maps/premium/usage-limits",sortDollars:2e4,thirdParty:!1,humanOnly:!0,libraryRequired:!0,conditions:["Your ToS and Privacy Policy must reference Google's","No bulk downloads"],autocompleteMultiplier:.4,bonuses:["Excellent worldwide quality"]},{group:"Google",name:"ONI Group quote",includedRequestsMonthly:0,dollarsMonthly:0,currencySymbol:"$A",extraPer1000:5.25,maxRequestsMonthly:!1,url:"https://developers.google.com/maps/premium/usage-limits",thirdParty:!1,humanOnly:!0,libraryRequired:!0,conditions:["Your ToS and Privacy Policy must reference Google's","No bulk downloads"],autocompleteMultiplier:.4,bonuses:["Excellent worldwide quality"]},{group:"Geocode Earth",name:"Basic",includedRequestsMonthly:2e5,dollarsMonthly:200,requestsPerSecond:5,openData:!0,thirdParty:!0,permanent:!0,bonuses:["Made by the Mapzen team"],url:"https://geocode.earth/"},{group:"Geocode Earth",name:"Advanced",includedRequestsMonthly:2e6,dollarsMonthly:500,requestsPerSecond:10,openData:!0,thirdParty:!0,permanent:!0,bonuses:["Made by the Mapzen team"],url:"https://geocode.earth/"},{group:"Geocode Earth",name:"Custom",custom:!0,openData:!0,thirdParty:!0,permanent:!0,bonuses:["Made by the Mapzen team"],url:"https://geocode.earth/"},{group:"SmartyStreets",name:"International 1000",includedRequestsMonthly:1e3,dollarsMonthly:65,url:"https://smartystreets.com/pricing/international",thirdParty:!0,autocomplete:!1},{group:"SmartyStreets",name:"International 10,000",includedRequestsMonthly:1e4,dollarsMonthly:592,url:"https://smartystreets.com/pricing/international",thirdParty:!0,autocomplete:!1},{group:"SmartyStreets",name:"International 100,000",includedRequestsMonthly:1e5,dollarsMonthly:5400,url:"https://smartystreets.com/pricing/international",thirdParty:!0,autocomplete:!1},{group:"SmartyStreets",name:"International 1,000,000",includedRequestsMonthly:1e6,dollarsMonthly:5e4,url:"https://smartystreets.com/pricing/international",thirdParty:!0,autocomplete:!1},{group:"Geocode.xyz",name:"Throttled API",dollarsMonthly:0,requestsPerSecond:1,maxRequestsDaily:86400,includedRequestsMonthly:1e12,permanent:!0,openData:!0,thirdParty:!0,url:"https://geocode.xyz/pricing"},{group:"Geocode.xyz",name:"Pay-per-use",dollarsMonthly:0,maxRequestsMonthly:!1,includedRequestsMonthly:0,extraPer1000:2.5,extra:"+ €2.50/1000 requests",currencySymbol:"€",permanent:!0,openData:!0,thirdParty:!0,url:"https://geocode.xyz/pricing"},{group:"Geocode.xyz",name:"Monthly unlimited",dollarsMonthly:100,maxRequestsMonthly:!1,includedRequestsMonthly:1e12,extras:"Unlimited requests",currencySymbol:"€",permanent:!0,openData:!0,thirdParty:!0,url:"https://geocode.xyz/pricing"},{group:"LocationIQ",name:"Free",dollarsMonthly:0,includedRequestsDaily:1e4,requestsPerSecond:2,freeRequired:!1,url:"https://locationiq.com/",openData:!0,permanent:!0,thirdParty:!0,humanOnly:!1},{group:"LocationIQ",name:"Developer+",dollarsMonthly:50,includedRequestsDaily:2e4,requestsPerSecond:20,freeRequired:!1,url:"https://locationiq.com/",openData:!0,permanent:!0,thirdParty:!0,humanOnly:!1},{group:"LocationIQ",name:"Starter",dollarsMonthly:100,includedRequestsDaily:5e4,requestsPerSecond:24,freeRequired:!1,url:"https://locationiq.com/",openData:!0,permanent:!0,thirdParty:!0,humanOnly:!1},{group:"LocationIQ",name:"Business",dollarsMonthly:200,includedRequestsDaily:1e5,requestsPerSecond:30,freeRequired:!1,url:"https://locationiq.com/",openData:!0,permanent:!0,thirdParty:!0,humanOnly:!1},{group:"LocationIQ",name:"Business+",dollarsMonthly:500,includedRequestsDaily:5e5,requestsPerSecond:40,freeRequired:!1,url:"https://locationiq.com/",openData:!0,permanent:!0,thirdParty:!0,humanOnly:!1},{group:"LocationIQ",name:"Enterprise",custom:!0,url:"https://locationiq.com/",openData:!0,thirdParty:!0,permanent:!0,humanOnly:!1,sortDollars:12e3},{group:"Mapquest",name:"Free",dollarsMonthly:0,includedRequestsMonthly:15e3,thirdParty:!1,permanent:!1,humanOnly:!0,url:"https://developer.mapquest.com/plans"},{group:"Mapquest",name:"Basic",dollarsMonthly:99,includedRequestsMonthly:3e4,thirdParty:!1,permanent:!1,humanOnly:!0,conditions:['Excess usage billed as "overage"'],url:"https://developer.mapquest.com/plans"},{group:"Mapquest",name:"Plus",dollarsMonthly:199,includedRequestsMonthly:75e3,thirdParty:!1,permanent:!1,humanOnly:!0,conditions:['Excess usage billed as "overage"'],url:"https://developer.mapquest.com/plans"},{group:"Mapquest",name:"Business",dollarsMonthly:399,includedRequestsMonthly:2e5,thirdParty:!1,permanent:!1,humanOnly:!0,conditions:['Excess usage billed as "overage"'],url:"https://developer.mapquest.com/plans"},{group:"Mapquest",name:"Business Plus",dollarsMonthly:799,includedRequestsMonthly:5e5,thirdParty:!1,permanent:!1,humanOnly:!0,conditions:['Excess usage billed as "overage"'],url:"https://developer.mapquest.com/plans"},{group:"Mapquest",name:"Business Enhanced",dollarsMonthly:499,includedRequestsMonthly:2e5,bonuses:["Store results (US+Canada)","Bulk queries, third-party-maps"],conditions:["6 month commitment",'Excess usage billed as "overage"'],thirdParty:!0,url:"https://developer.mapquest.com/plans",permanent:!1},{group:"Mapquest",name:"Business Plus Enhanced",dollarsMonthly:899,includedRequestsMonthly:5e5,bonuses:["Store results (US + Canada)","Bulk queries, third-party-maps"],conditions:["6 month commitment",'Excess usage billed as "overage"'],thirdParty:!0,url:"https://developer.mapquest.com/plans",permanent:!1},{group:"Mapquest",name:"Enterprise",custom:!0,thirdParty:!0,conditions:['Excess usage billed as "overage"'],bonuses:["Store results (US + Canada)","Bulk queries, third-party-maps"],url:"https://developer.mapquest.com/plans",permanent:!1,sortDollars:12e3},{group:"Yandex",name:"Free",thirdParty:!1,humanOnly:!0,publicRequired:!0,freeRequired:!0,permanent:!1,includedRequestsMonthly:25e3,dollarsMonthly:0,url:"https://tech.yandex.com/maps/doc/jsapi/2.1/terms/index-docpage/?from=geocoder#conditions"},{group:"Yandex",name:"API for Business",thirdParty:!1,humanOnly:!0,permanent:!0,includedRequestsMonthly:1e5,conditions:["Primarily eastern Europe",'Storing geocodes "On request"','Processing without showing "On request"'],publicRequired:!1,dollarsMonthly:1e5,sortDollars:21264,currencySymbol:"₽",url:"https://tech.yandex.com/maps/commercial/?from=geocoder"},{group:"Pitney-Bowes",name:"Quote #1",includedRequestsMonthly:0,dollarsMonthly:0,extraPer1000:18.13,currencySymbol:"$A",url:"https://locate.pitneybowes.com/",conditions:['"Premium" geocode API uses 3x credits',"3 credits per autocomplete request!"],permanent:"30 days",humanOnly:!1,cacheLimitDays:30,autocompleteMultiplier:3},{group:"Geocode.farm",name:"Bronze",includedRequestsDaily:25e3,dollarsMonthly:100,currencySymbol:"£",url:"https://geocode.farm/our-packages/",conditions:["Based in Belize",'⚠ "No chargebacks ever" policy'],permanent:!0,thirdParty:!0},{group:"Geocode.farm",name:"Silver",includedRequestsDaily:5e4,dollarsMonthly:200,currencySymbol:"£",url:"https://geocode.farm/our-packages/",conditions:["Based in Belize",'⚠"No chargebacks ever" policy'],permanent:!0,thirdParty:!0},{group:"Geocode.farm",name:"Gold",includedRequestsDaily:1e5,dollarsMonthly:300,currencySymbol:"£",url:"https://geocode.farm/our-packages/",conditions:["Based in Belize",'⚠"No chargebacks ever" policy'],permanent:!0,thirdParty:!0},{group:"Geocode.farm",name:"Platinum",includedRequestsDaily:1e6,dollarsMonthly:1e3,currencySymbol:"£",url:"https://geocode.farm/our-packages/",conditions:["£1000 setup fee","Based in Belize",'⚠"No chargebacks ever" policy'],permanent:!0,thirdParty:!0},{group:"Yahoo BOSS PlaceFinder",name:"0-10,000",includedRequestsDaily:0,maxRequestsDaily:1e4,dollarsMonthly:0,url:"https://developer.yahoo.com/boss/geo/#pricing",extra:"+ $6/1000",extraPer1000:6,totalMonthly:function(e){return 0+e/1e3*6}},{group:"Yahoo BOSS PlaceFinder",name:"10,0001-35,000",includedRequestsDaily:1e4,maxRequestsDaily:35e3,dollarsMonthly:40*A,extra:"+ $4/1000",extraPer1000:4,url:"https://developer.yahoo.com/boss/geo/#pricing",totalMonthly:function(e){return 0+Math.max(e,10001)/1e3*4}},{group:"Yahoo BOSS PlaceFinder",name:"35,000+",includedRequestsDaily:35e3,maxRequestsDaily:!1,dollarsMonthly:3150,extra:"+ $3/1000",extraPer1000:3,url:"https://developer.yahoo.com/boss/geo/#pricing",totalMonthly:function(e){return 0+Math.max(e,35e3)/1e3*3}},{group:"Maplarge",name:"Bulk upload",dollarsMonthly:0,extra:"+ $4/1000",extraPer1000:4,bonuses:["Cheaper at higher rates"],conditions:["Pricing of API unknown"],url:"http://www.maplarge.com/geocoder#pricing",thirdParty:!0},{group:"Nominatim",name:"Public API",dollarsMonthly:0,requestsPerSecond:1,bonuses:["No hard limits","Open source, running own instance is possible"],conditions:["Caching mandatory if possible","No big jobs","Attribution required","valid HTTP Referer or User-Agent mandatory","data is ODbL licensed"],permanent:!0,humanOnly:!1,openData:!0,thirdParty:!0},{group:"Photon",name:"Demo instance",dollarsMonthly:0,requestsPerSecond:1,termsUrl:"http://photon.komoot.de/",bonuses:["Open source, running own instance is possible"],conditions:["demo supports only some values of lang parameter","Attribution required","data is ODbL licensed"],permanent:!0,humanOnly:!1,openData:!0,thirdParty:!0},{group:"Tomtom",name:"Free",dollarsMonthly:0,requestsPerSecond:5,includedRequestsDaily:2500,maxRequestsDaily:2500,thirdParty:!1,publicRequired:!0,url:"https://developer.tomtom.com/store/maps-api"},{group:"Tomtom",name:"50,000 public",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,includedRequestsMonthly:2500*A,extra:O(25,50),extraPer1000:.5,thirdParty:!1,publicRequired:!0,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"1,000,000 public",extra:O(449,1e3),dollarsMonthly:0,minDollarsYearly:449,includedRequestsDaily:2500,maxRequestsMonthly:!1,maxRequestsDaily:!1,extraPer1000:.449,thirdParty:!1,publicRequired:!0,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"10,000,000 public",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,minDollarsYearly:4199,includedRequestsDaily:2500,extraPer1000:.4199,extra:O(4199,1e4),thirdParty:!1,publicRequired:!0,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"50,000 private",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,includedRequestsMonthly:2500,extraPer1000:3.98,extra:"+ $199 per 50k ($3.98/1k)",thirdParty:!1,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"100,000 private",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,minDollarsYearly:379,includedRequestsDaily:2500,extraPer1000:3.79,extra:"+ $379 per 100k ($3.79/1k)",thirdParty:!1,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"250,000 private",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,minDollarsYearly:909,includedRequestsDaily:2500,extraPer1000:3.636,extra:"+ $909 per 250k ($3.63/1k)",thirdParty:!1,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"500,000 private",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,minDollarsYearly:1719,includedRequestsDaily:2500,extraPer1000:3.438,extra:"+ $1719 per 500k ($3.44/1k)",thirdParty:!1,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"1,000,000 private",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,minDollarsYearly:3249,includedRequestsDaily:2500,extraPer1000:3.249,extra:"+ $3249 per 1M ($3.25/1k)",thirdParty:!1,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"Tomtom",name:"10,000,000 private",dollarsMonthly:0,maxRequestsMonthly:!1,maxRequestsDaily:!1,minDollarsYearly:27499,includedRequestsDaily:2500,extraPer1000:2.7499,extra:"+ $27,499 per 10M ($2.75/1k)",thirdParty:!1,url:"https://developer.tomtom.com/store/maps-api",bonuses:["Credits last 12 months","2500 free per day"]},{group:"PSMA",name:"Free",dollarsMonthly:0,includedRequestsMonthly:500,permanent:!0,thirdParty:!0,url:"https://developer.psma.com.au/pricing",bonuses:["Open data licence applies","Free autocomplete"],conditions:["Australia only"],autocompleteMultiplier:0},{group:"PSMA",name:"Standard",dollarsMonthly:99,includedRequestsMonthly:1e4,permanent:!0,thirdParty:!0,url:"https://developer.psma.com.au/pricing",bonuses:["Open data licence applies","Free autocomplete"],conditions:["Australia only"],currency:"AUD",currencySymbol:"$A",autocompleteMultiplier:0},{group:"PSMA",name:"Pro",dollarsMonthly:749,includedRequestsMonthly:1e5,permanent:!0,thirdParty:!0,url:"https://developer.psma.com.au/pricing",bonuses:["Open data licence applies","Free autocomplete"],conditions:["Australia only"],currency:"AUD",currencySymbol:"$A",autocompleteMultiplier:0},{group:"PSMA",name:"Custom",permanent:!0,thirdParty:!0,url:"https://developer.psma.com.au/pricing",bonuses:["Open data licence applies","Free autocomplete"],conditions:["Australia only"],custom:!0,currency:"AUD",currencySymbol:"$A",autocompleteMultiplier:0}],$={};G.forEach(function(e){e.provider=E[e.group]||{api:{}},["termsUrl","permanent","humanOnly","humanOnlyNote","openData"].forEach(function(t){void 0===e[t]&&void 0!==e.provider[t]&&(e[t]=e.provider[t])}),$[e.group]=!0});var N=G;console.log(G.length+" plans, from "+C()($).length+" different providers loaded."),console.log("Providers: "+C()($));var B={name:"Results",components:{Result:S},data:function(){return{results:[]}},created:function(){var e=this;window.Results=this,n.$on("update-form",function(t){e.results=JSON.parse(b()(N)).filter(function(e){return z(t,e)}).map(function(e){return e._annualCost=L(F(t,e,I(t,e)),"?"),!e.extra&&e.extraPer1000&&(e.extra="+ "+(e.currencySymbol||"$")+e.extraPer1000+"/1k"),e}).sort(function(e,t){return L(e.sortDollars,U(+e._annualCost,e))-L(t.sortDollars,U(+t._annualCost,t))})})}};function U(e,t){var o={"€":1.083,"£":1.305,$A:.67,AUD:.67};return v()(e)&&(console.log(e,t.currencySymbol+" = "+(o[t.currencySymbol]||1)*e+"$"),console.log(t.sortDollars),console.log(t)),(o[t.currencySymbol]||o[t.currency]||1)*e}function L(e,t,o){return void 0===e||v()(e)?void 0===t||v()(t)?o:t:e}function F(e,t,o){if(void 0!==W(e,t,o))return Math.max(12*W(e,t,o),L(t.minDollarsYearly,0))}function T(e,t){return e.payAnnually&&t.dollarsAnnually?t.dollarsAnnually/12:t.dollarsMonthly}function W(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(void 0!==t.totalMonthly)return 12*t.totalMonthly(o);if(void 0!==T(e,t)){var r=Math.max(o-L(t.includedRequestsMonthly,t.includedRequestsDaily*R,0),0);return T(e,t)+L(t.extraPer1000,0)*r/1e3}}function I(e,t){return L(e.geocodesMonthly,0)+L(e.geocodesMonthly,0)*L(e.autocompleteMultiplier,0)*L(t.autocompleteMultiplier,1)}function j(e,t){return L(e.geocodesDaily,0)+L(e.geocodesDaily,0)*L(e.autocompleteMultiplier,0)*L(t.autocompleteMultiplier,1)}function z(e,t){console.log(R);var o=t,r=(!1===o.maxRequestsMonthly?1e20:o.maxRequestsMonthly)||o.maxRequestsDaily*R||o.includedRequestsMonthly||o.includedRequestsDaily*R||1e20;return(!o.publicRequired||e.public)&&(!o.freeRequired||e.free)&&(!0===o.permanent||!e.permanent)&&(!o.humanOnly||!e.bulkJobs)&&(o.thirdParty||!e.thirdParty)&&!("true"===e.openData&&!o.openData||"false"===e.openData&&o.openData)&&(!1===o.maxRequestsDaily||void 0===L(o.maxRequestsDaily,o.includedRequestsDaily)||L(o.maxRequestsDaily,o.includedRequestsDaily)>=j(e,t))&&(void 0===o.requestsPerSecond||o.requestsPerSecond>=L(e.geocodesSecondly,0))&&(!1!==L(o.provider.api,{}).autocomplete||!e.autoComplete)&&(!1!==L(o.provider.api,{}).reverse||!e.reverseGeocode)&&(!o.libraryRequired||!e.mappingLibrary)&&r>=I(e,o)}var H=B,Y=Object(p["a"])(H,h,y,!1,null,"8126eaee",null);Y.options.__file="Results.vue";var J=Y.exports;window.app={};var Q={name:"app",components:{FilterForm:m,Results:J},data:function(){return{planCount:N.length}},created:function(){window.app.App=this}};o("948e");var V=Q,X=(o("d38b"),Object(p["a"])(V,a,s,!1,null,"c392abb4",null));X.options.__file="App.vue";var K=X.exports;r["a"].config.productionTip=!1,new r["a"]({render:function(e){return e(K)}}).$mount("#app")},"722b":function(e,t,o){},"7c18":function(e,t,o){},9723:function(e,t,o){"use strict";var r=o("722b"),a=o.n(r);a.a},d38b:function(e,t,o){"use strict";var r=o("7c18"),a=o.n(r);a.a}});
2 | //# sourceMappingURL=app.0813af13.js.map
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "map-template",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build",
8 | "deploy": "npm run build; ./deploy.sh",
9 | "lint": "vue-cli-service lint"
10 | },
11 | "dependencies": {
12 | "cheap-ruler": "^2.5.1",
13 | "d3-fetch": "^1.1.2",
14 | "geojson-bounds": "^1.0.2",
15 | "mapbox-gl": "^1.6.1",
16 | "mapbox-gl-utils": "^0.28.1",
17 | "sheets2geojson": "^0.0.2",
18 | "thousands": "^1.0.1",
19 | "vue": "^2.5.21"
20 | },
21 | "devDependencies": {
22 | "@vue/cli-plugin-babel": "^3.3.0",
23 | "@vue/cli-plugin-eslint": "^3.3.0",
24 | "@vue/cli-service": "^3.3.0",
25 | "babel-eslint": "^10.0.1",
26 | "copy-webpack-plugin": "^4.6.0",
27 | "eslint": "^5.8.0",
28 | "eslint-plugin-vue": "^5.0.0",
29 | "pug": "^2.0.3",
30 | "pug-plain-loader": "^1.0.0",
31 | "tachyons": "^4.11.1",
32 | "vue-cli-plugin-pug": "^1.0.7",
33 | "vue-template-compiler": "^2.5.21"
34 | },
35 | "eslintConfig": {
36 | "root": true,
37 | "env": {
38 | "node": true
39 | },
40 | "extends": [
41 | "plugin:vue/essential",
42 | "eslint:recommended"
43 | ],
44 | "rules": {
45 | "no-console": 0
46 | },
47 | "parserOptions": {
48 | "parser": "babel-eslint"
49 | }
50 | },
51 | "postcss": {
52 | "plugins": {
53 | "autoprefixer": {}
54 | }
55 | },
56 | "browserslist": [
57 | "> 1%",
58 | "last 2 versions",
59 | "not ie <= 8"
60 | ]
61 | }
62 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevage/which-geocoder/158f0e2260f2ed9a8a564c3fe1ad7881f4648f8c/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | getlon.lat
9 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 | #app.flex.flex-column.vh-100.avenir
3 | #top.bb.b--gray.bg-washed-blue.ph3.pv1
4 | h1.fw5.ma0 getlon.lat
5 | span.fw4 — Help! I need a geocoder.
6 | h2.tag.i.fw1.f4 {{ planCount }} geocoding service plans to choose from.
7 | a(href="https://github.com/stevage/which-geocoder") More information
8 | |
9 | #middle.flex.flex-auto
10 | #sidebar.br.b--light-gray.overflow-auto.w3.w-25-ns.pa2
11 | FilterForm
12 | #results-container.overflow-auto.flex-auto
13 | Results
14 | #bottom.bt.b--gray.flex-none.pa2.bg-washed-blue
15 | | Built by Steve Bennett (@stevage1).
16 | | Source code on Github.
17 | | Disclaimer: Geocoder plans change all the time. Obviously. Use at your own risk.
18 |
19 |
20 |
44 |
45 |
67 |
--------------------------------------------------------------------------------
/src/EventBus.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | export const EventBus = new Vue();
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevage/which-geocoder/158f0e2260f2ed9a8a564c3fe1ad7881f4648f8c/src/assets/logo.png
--------------------------------------------------------------------------------
/src/calcs.js:
--------------------------------------------------------------------------------
1 | export const MONTH = 30.4;
--------------------------------------------------------------------------------
/src/components/FeatureInfo.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | img.image(v-if="imageUrl" :src="imageUrl")
4 | table#FeatureInfo(v-if="feature").bg-white.b--gray.ba.helvetica.ma1
5 | tr(v-for="(value, prop) in p")
6 | template(v-if="ignoreProps.indexOf(prop) === -1")
7 | th.f6 {{ prop }}
8 | td.f6 {{ value }}
9 |
10 |
11 |
31 |
32 |
--------------------------------------------------------------------------------
/src/components/FilterForm.vue:
--------------------------------------------------------------------------------
1 |
2 | #FilterForm
3 | .form.container
4 | h4 I use about
5 | .usage
6 | .form-row
7 | input#monthly-geocodes.form-control(type="number" placeholder="5000" v-model.number="geocodesMonthly")
8 | label(for=monthly-geocodes) per month
9 | .form-row
10 | input#daily-geocodes.form-control(type="number" placeholder="1000" v-model.number="geocodesDaily")
11 | label(for=daily-geocodes) on busy days
12 | .form-row
13 | input#secondly-geocodes.form-control(type="number" placeholder="1" v-model.number="geocodesSecondly")
14 | label(for=secondly-geocodes) per second
15 | h4 My app is:
16 | .form-group
17 | input.form-check-input#public-facing(type="checkbox" v-model="public")
18 | label.form-check-label(for="public-facing") Accessible to the public
19 | .form-group
20 | input.form-check-input#free(type="checkbox" v-model="free")
21 | label.form-check-label(for="free") Free of charge
22 | h4 I need to:
23 | .form-group
24 | input.form-check-input#permanent-geocodes(type="checkbox" v-model="permanent")
25 | label.form-check-label(for="permanent-geocodes") Store geocodes permanently
26 | .form-group
27 | input.form-check-input#bulk-jobs(type="checkbox" v-model="bulkJobs")
28 | label.form-check-label(for="bulk-jobs") Carry out bulk jobs not triggered by users
29 | .form-group
30 | input.form-check-input#third-party(type="checkbox" v-model="thirdParty")
31 | label.form-check-label(for="third-party") Show results on third-party basemaps
32 | .form-group
33 | input.form-check-input#autocomplete(type="checkbox" v-model="autoComplete")
34 | label.form-check-label(for="autocomplete") Auto-complete addresses as they're typed
35 | .form-row.f7.ml3
36 | input.w3#autocomplete-multiplier.form-control(type="number" placeholder="10" v-model.number="autocompleteMultiplier" :disabled="!autoComplete")
37 | label(for=autocomplete-multiplier) autocompletes per geocode.
38 | .form-group
39 | input.form-check-input#reverse-geocode(type="checkbox" v-model="reverseGeocode")
40 | label.form-check-label(for="reverse-geocode") Reverse-geocode (find address from a pin drop)
41 | .form-group
42 | input.form-check-input#location-weighting(type="checkbox" v-model="locationWeighting")
43 | label.form-check-label(for="location-weighting") Prioritise results near a provided location
44 | .form-group
45 | input.form-check-input#mapping-library(type="checkbox" v-model="mappingLibrary")
46 | label.form-check-label(for="mapping-library") Use my own mapping library
(Leaflet, Mapbox-GL-JS, OpenLayers...)
47 | h4 Miscellaneous
48 | .radios
49 | span Open data:
50 | .form-check.form-check-inline
51 | input.form-check-input#open-data-ok(type="radio" name="open-data" v-model="openData")
52 | label.form-check-label(for="open-data-ok") It's ok
53 | .form-check.form-check-inline
54 | input.form-check-input#open-data-love(type="radio" value='true' name="open-data" v-model="openData")
55 | label.form-check-label(for="open-data-love") Love it
56 | .form-check.form-check-inline
57 | input.form-check-input#open-data-hate(type="radio" value='false' name="open-data" v-model="openData")
58 | label.form-check-label(for="open-data-hate") Hate it
59 | .form-group
60 | input.form-check-input#pay-annually(type="checkbox" v-model="payAnnually")
61 | label.form-check-label(for="pay-annually") Happy to pay annually
62 |
63 |
64 | h4#caveats.background-light Caveats
65 | ul.caveats
66 | li Annual-payment discounts are not included.
67 | li No assessment of quality.
68 | li Not all known plans are included.
69 | li Data on Google and Bing is pretty sparse.
70 | li All prices in USD unless noted.
71 |
72 |
73 |
110 |
111 |
--------------------------------------------------------------------------------
/src/components/Map.vue:
--------------------------------------------------------------------------------
1 |
2 | #map.absolute.absolute--fill
3 |
4 |
5 |
49 |
50 |
--------------------------------------------------------------------------------
/src/components/NearestLocations.vue:
--------------------------------------------------------------------------------
1 |
2 | #Sites(v-if="sites").mt2
3 | .nearest(v-if="home")
4 | h3 Nearest groups
5 | .site.pointer.glow.o-70(v-for="site in nearestSites" @click="click(site)" :class="{ selected: selected(site) }")
6 | .name.dib.w-70.pa1 {{ site.properties['Name'] }}
7 | .distance.dib.w-30.ph1.pv1 {{ Math.round(site.distance) }} km
8 | .all(v-else)
9 | h3 All groups
10 | .site.pointer.glow.o-70(v-for="site in alphabetisedSites" @click="click(site)" :class="{ selected: selected(site) }")
11 | .name.dib.w-70.pa1 {{ site.properties['Name'] }}
12 |
13 |
14 |
60 |
61 |
--------------------------------------------------------------------------------
/src/components/Result.vue:
--------------------------------------------------------------------------------
1 |
2 | .Result.w-25-ns.ba.b--gray.ma1.pa3.shadow-4.br2.flex-grow(style="min-width:300px")
3 | h2.card-title.mt0.mb0.fw5 {{ plan.group }}
4 | h3.mb-3.card-subtitle.gray.text-muted.fw4.mt0 {{ plan.name }}
5 | .plan-details
6 | .plan-details-inner
7 | div(v-if="!plan.custom")
8 | .f5
9 | b {{ plan.dollarsMonthly | money(plan.currencySymbol) }}
10 | span(v-if="plan.includedRequestsMonthly !== undefined")
11 | span for
12 | b {{ plan.includedRequestsMonthly | integer }}
13 | span /mo.
14 | span(v-else-if="plan.includedRequestsDaily")
15 | span for
16 | b {{ plan.includedRequestsDaily | integer }}
17 | span /day ({{ plan.includedRequestsDaily * MONTH | integer}} /mo.)
18 | .i.extra(v-if="plan.extra")
19 | div.f7 {{ plan.extra }}
20 | // p {{ plan.bonuses }}
21 | p(v-if="plan.maxRequestsDaily")
22 | span {{ plan.maxRequestsDaily | integer}} requests per day max.
23 | div(v-else)
24 | p Custom plan by negotiation.
25 | div(v-if="plan.requestsPerSecond")
26 | p Rate limit: {{ plan.requestsPerSecond }} per sec
27 | ul.details
28 | li(v-if="plan.openData") ℹ Based on open data
29 | li(v-if="plan.permanent === true") ✅ Storing geocodes ok
30 | li(v-if="typeof plan.permanent === 'string'") 🚫 Storing geocodes: {{ plan.permanent }}
31 | li(v-if="!plan.permanent") 🚫 Must not store geocodes.
32 | li(v-if="plan.thirdParty") ✅ Third-party basemaps ok
33 | li(v-else) 🚫 Must not combine with third-party basemaps
34 | li(v-if="plan.humanOnly") 🚫 No scripted queries
35 | li(v-if="plan.freeRequired") $ Free apps only
36 | li(v-if="plan.publicRequired") App must be public
37 | li.con.red(v-for="con in plan.provider.cons") 👎 {{ con }}
38 | li(v-if="plan.provider.quality") {{ plan.provider.quality }}
39 | li(v-if="plan.autocompleteMultiplier !== undefined") 1 autocomplete = {{ plan.autocompleteMultiplier }} transactions.
40 | li(v-if="plan.termsUrl")
41 | a(:href="plan.termsUrl") Terms and conditions
42 |
43 | div
44 | a(v-if="plan.provider.api.docs" :href="plan.provider.api.docs") API
45 | span(v-else) API
46 |
47 | ul.api
48 | li(v-if="plan.provider.api.autocomplete") ✓ Auto-complete
49 | a(v-if="typeof plan.provider.api.autocomplete === 'string'" :href="plan.provider.api.autocomplete") ℹ
50 | li(v-if="plan.provider.api.autocomplete === undefined") ? Auto-complete unknown
51 | li(v-if="plan.provider.api.autocomplete === false") 𐄂 No auto-complete
52 |
53 | li(v-if="plan.provider.api.reverse") ✓ Reverse-geocode
54 | a(v-if="typeof plan.provider.api.reverse === 'string'" :href="plan.provider.api.reverse") ℹ
55 | li(v-if="plan.provider.api.reverse === undefined") ? Reverse-geocode unknown
56 | li(v-if="plan.provider.api.reverse === false") 𐄂 No reverse-geocode
57 |
58 | li(v-if="plan.provider.api.locationWeighting") ✓ Location-weighting
59 | a(v-if="typeof plan.provider.api.locationWeighting === 'string'" :href="plan.provider.api.locationWeighting") ℹ
60 | li(v-if="plan.provider.api.locationWeighting === undefined") ? Location-weighting unknown
61 | li(v-if="plan.provider.api.locationWeighting === false") 𐄂 No location-weighting
62 | li(v-if="plan.provider.playUrl")
63 | a(:href="plan.provider.playUrl") Test area
64 |
65 |
66 | ul.bg-light-green.bonuses.ba.b--dark-green.alert.alert-success(v-if="plan.bonuses")
67 | li(v-for="bonus in plan.bonuses") {{ bonus }}
68 | ul.bg-light-yellow.ba.b--gold.conditions.alert.alert-warning(v-if="plan.conditions")
69 | li(v-for="condition in plan.conditions")
70 | span(v-html="condition")
71 |
72 | p.spacer
73 | h5
74 | //- a.dark-blue.bg-animate.bg-green.hover-bg-light-blue(v-bind:href="plan.url")
75 | a.db.dark-blue.animate.hover-bg-washed-blue(v-bind:href="plan.url")
76 | .f1.tc.annual-price {{ plan._annualCost | money(plan.currencySymbol) }}/yr
77 |
78 |
79 |
113 |
114 |
--------------------------------------------------------------------------------
/src/components/Results.vue:
--------------------------------------------------------------------------------
1 |
2 | #Results
3 | .flex.flex-wrap
4 | Result(v-for="plan in results" :plan="plan")
5 |
6 |
7 |
8 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/src/components/sheetsToGeoJSON.js:
--------------------------------------------------------------------------------
1 | const d3 = require('d3-fetch');
2 |
3 | export async function sheetsToGeoJSON(sheetsId) {
4 |
5 | const csvSource = `https://docs.google.com/spreadsheets/d/e/${sheetsId}/pub?gid=0&single=true&output=csv`;
6 |
7 |
8 | function toPoints(rows) {
9 | return {
10 | type: 'FeatureCollection',
11 | features: rows.map((row, id) => ({
12 | type: 'Feature',
13 | geometry: {
14 | type: 'Point',
15 | coordinates: [+row.Longitude, +row.Latitude], // These are the column names
16 | },
17 | properties: {
18 | id,
19 | ...row
20 | }
21 | }))
22 | }
23 | }
24 |
25 | return toPoints(await d3.csv(csvSource));
26 | }
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 |
4 | Vue.config.productionTip = false
5 |
6 | new Vue({
7 | render: h => h(App),
8 | }).$mount('#app')
9 |
--------------------------------------------------------------------------------
/src/plans.js:
--------------------------------------------------------------------------------
1 | /*
2 | providers:
3 |
4 | api: {
5 | docs: url to documentation
6 | autocomplete: is there an autocomplete API? (false if no support, true or url to documentation for it)
7 | geocode: is there a geocoder API? (false/true/url)
8 | reverse: is there a reverse geocoder API? (false/true/url)
9 | locationWeighting: does the geocoder API have a mechanism to bias towards a particular location? (false/true/url)
10 | }
11 | quality: string, description of quality of data.
12 |
13 |
14 | Plans:
15 | termsUrl: URL to terms and conditions
16 | group: provider name
17 | name: plan name
18 | thirdParty=false: can combine results with third party maps? Defaults to no.
19 | humanOnly=false: must queries be triggered by human actions? (ie, no bulk queries?) Defaults to no.
20 | humanOnlyNote: string, a text annotation to the above value.
21 | permanent=false: boolean or string, can geocodes be stored indefinitely? Defaults to no.
22 | includedRequestsMonthly: how many requests included in monthly plan (defaults to 30*includedRequestsDaily)
23 | includedRequestsDaily: how many requests per day included in monthly plan.
24 | maxRequestsMonthly: cap on monthly requests, defaults to includedRequestsMonthly
25 | conditions: array of dot points, things to be aware of
26 | bonuses: array of dot points, good things
27 | publicRequired=false: does your app have to be public facing to qualify
28 | freeRequired=false: does your app have to be available at zero cost to qualify
29 | dollarsMonthly: base monthly rate
30 | currencySymbol="$": currencySymbol symbol (just for display)
31 | cacheLimitDays: 30
32 | requestsPerSecond: number, an additional constraint of requests per second (usually in addition to monthly or daily limits)
33 | openData: boolean, is the service based heavily on open data such as OpenStreetMap and OpenAddresses?
34 | extra: string describing how much extra transactions cost. `extra: per(3, 5)` means "$3 per 5000 extra transactions".
35 | extraPer1000: number, dollars per thousand extra transactions. (0.6 in the above case)
36 | autocompleteMultiplier=1: number. 0.1 means that 10 autocomplete requests count as 1 regular geocode request.
37 |
38 | // Don't fill this out unless the default sort is incorrect.
39 | sortDollars: number. Where there is not a precise publicly available dollar figure, this is an approximate annual fee for sorting.
40 |
41 |
42 | */
43 | const MONTH = 30.4;
44 |
45 | // Used for converting strange transaction quantities into 1000s.
46 | // per(3, 5) = "+ $3 per 5k ($0.60/1k)"
47 | function per(dollars, transK) {
48 | return '+ $' + dollars + ' per ' + transK + 'k ($' + (dollars / transK).toFixed(2) + '/1k)';
49 | }
50 | const providers = {
51 | ArcGIS: {
52 | api: {
53 | docs: 'https://developers.arcgis.com/rest/geocode/api-reference/overview-world-geocoding-service.htm',
54 | geocode: 'https://developers.arcgis.com/rest/geocode/api-reference/geocoding-find-address-candidates.htm',
55 | reverse: 'https://developers.arcgis.com/rest/geocode/api-reference/geocoding-reverse-geocode.htm',
56 | autocomplete: 'https://developers.arcgis.com/rest/geocode/api-reference/geocoding-suggest.htm',
57 | batch: 'https://developers.arcgis.com/rest/geocode/api-reference/geocoding-geocode-addresses.htm'
58 | },
59 | termsUrl: 'https://www.esri.com/en-us/legal/terms/full-master-agreement/mla-e204-e300-english',
60 | openData: false
61 | },
62 | Gisgraphy: {
63 | api: {
64 | docs: 'https://www.gisgraphy.com/documentation/index.php',
65 | autocomplete: 'https://www.gisgraphy.com/documentation/user-guide.php#fulltextservice',
66 | geocode: 'https://www.gisgraphy.com/documentation/user-guide.php#geocodingservice',
67 | reverse: 'https://www.gisgraphy.com/documentation/user-guide.php#reversegeocodingservice',
68 | locationWeighting: true, // 'prox'
69 | },
70 | termsUrl: 'https://www.gisgraphy.com/terms.php',
71 | permanent: true,
72 | humanOnly: false,
73 | openData: true,
74 | batch: 'https://premium.gisgraphy.com/products#batch',
75 | quality:'★★☆ : OSM, OpenAddresses, Geonames...'
76 | },
77 | HERE: {
78 | api: {
79 | docs: 'https://developer.here.com/documentation',
80 | autocomplete: 'https://developer.here.com/documentation/geocoder-autocomplete/topics/quick-start.html',
81 | geocode: 'https://developer.here.com/documentation/geocoder/topics/quick-start.html',
82 | reverse: 'https://developer.here.com/documentation/geocoder/topics/resource-reverse-geocode.html',
83 | locationWeighting: true, // 'prox'
84 | },
85 | termsUrl: 'https://developer.here.com/terms-and-conditions',
86 | permanent: '30 days',
87 | humanOnly: true,
88 | humanOnlyNote: "You are not allowed to: ... issue queries (i) not responsive to end user actions; or (ii) that are subsequent or automatic follow-up queries related to an initial query or end user action (such as triggering automatic Request based on an end user's search result); or otherwise modify queries to the HERE Materials; ",
89 |
90 | }, OpenCage: {
91 | api: {
92 | docs: 'https://opencagedata.com/api',
93 | geocode: 'https://opencagedata.com/api#forward-resp',
94 | reverse: 'https://opencagedata.com/api#reverse-resp',
95 | autocomplete: false,
96 | },
97 | termsUrl: 'https://opencagedata.com/terms',
98 | quality: "AU: ★★★ GNAF, elsewhere: ★★☆ OSM + other open data sources"
99 | }, Mapbox: {
100 | api: {
101 | geocode: 'https://www.mapbox.com/api-documentation/#geocoding',
102 | reverse: 'https://www.mapbox.com/api-documentation/#search-for-places',
103 | autocomplete: 'https://www.mapbox.com/api-documentation/#geocoding',
104 | locationWeighting: 'Filtering by bounding box, and 5 mile proximity bias.'
105 | },
106 | termsUrl: 'https://www.mapbox.com/tos/#geocoding',
107 | }, 'Geocode.xyz': {
108 | api: {
109 | geocode: 'https://geocode.xyz/api',
110 | reverse: true,
111 | autocomplete: false,
112 | }
113 | }, 'LocationIQ': {
114 | api: {
115 | geocode: 'https://locationiq.com/docs',
116 | reverse: 'https://locationiq.com/docs',
117 | autocomplete: true,
118 | batch: 'https://locationiq.com/#batch-geocoding',
119 | locationWeighting: true
120 | },
121 | termsUrl: 'https://locationiq.com/tos',
122 | quality: '★★☆ OpenStreetMap, OpenAddresses, WhosonFirst, Polylines & Geonames.'
123 | }, 'Nominatim': {
124 | api: {
125 | docs: 'https://nominatim.org/release-docs/develop/api/Overview/',
126 | geocode: 'https://nominatim.org/release-docs/develop/api/Search/',
127 | reverse: 'hhttps://nominatim.org/release-docs/develop/api/Reverse/',
128 | autocomplete: false,
129 | },
130 | termsUrl: 'https://operations.osmfoundation.org/policies/nominatim/',
131 | quality: "★★☆ OSM"
132 | }, 'Tomtom': {
133 | api: {
134 | docs: 'https://developer.tomtom.com/online-search/online-search-documentation-search',
135 | geocode: 'https://developer.tomtom.com/online-search/online-search-documentation-search/fuzzy-search',
136 | autocomplete: true, // "typeahead"
137 | reverse: 'https://developer.tomtom.com/online-search/online-search-documentation-search/geometry-search',
138 | locationWeighting: true
139 | },
140 | cons: ['Can\'t display on an OSM or "open source" map.'],
141 | termsUrl: 'https://developer.tomtom.com/terms-and-conditions',
142 | permanent: '30 days',
143 |
144 | }, 'Geocode.farm': {
145 | api: {
146 | docs: 'https://geocode.farm/geocoding/free-api-documentation/',
147 | geocode: 'https://geocode.farm/geocoding/free-api-documentation/',
148 | reverse: 'https://geocode.farm/geocoding/free-api-documentation/',
149 | autocomplete: false,
150 | locationWeighting: true
151 | }
152 | }, 'Bing': {
153 | api: {
154 | docs: 'https://msdn.microsoft.com/en-us/library/ff701715.aspx',
155 | geocode: 'https://msdn.microsoft.com/en-us/library/ff701714.aspx',
156 | reverse: 'https://msdn.microsoft.com/en-us/library/ff701710.aspx',
157 | autocomplete: 'https://msdn.microsoft.com/en-us/library/mt712650.aspx',
158 | locationWeighting: 'https://msdn.microsoft.com/en-us/library/ff701704.aspx', // "User context parameters"
159 | playUrl: 'http://www.bing.com/api/maps/sdkrelease/mapcontrol/isdk#autoSuggestUi+JS'
160 | },
161 | cons: ['"Autosuggest" is not exactly autocomplete.', 'Session management code required for cheapest pricing.'],
162 | termsUrl: 'https://www.microsoft.com/en-us/maps/product/terms'
163 | }, 'Mapquest': {
164 | api: {
165 | docs: 'https://developer.mapquest.com/documentation/geocoding-api/',
166 | geocode: 'https://developer.mapquest.com/documentation/geocoding-api/',
167 | reverse: 'https://developer.mapquest.com/documentation/geocoding-api/reverse/get/',
168 | locationWeighting: true, // bounding-box
169 | autocomplete: 'https://developer.mapquest.com/documentation/searchahead-api/', // "Search ahead"
170 | },
171 | quality: 'AU: ★★☆ Unit-level',
172 | playUrl: 'https://developer.mapquest.com/documentation/samples/geocoding/v1/address/',
173 | termsUrl: 'https://developer.mapquest.com/legal'
174 | }, 'Maplarge': {
175 | api: {
176 | docs: 'http://www.maplarge.com/developer/geocoderapi', // wait for it!
177 | geocode: true,
178 | reverse: true,
179 | autocomplete: false,
180 | locationWeighting: false
181 |
182 | },
183 | cons: ['API documentation looks old and broken.']
184 | }, 'Photon': {
185 | api: {
186 | docs: 'http://photon.komoot.de/',
187 | autocomplete: true,
188 | geocode: 'http://photon.komoot.de/',
189 | reverse: 'http://photon.komoot.de/',
190 | locationWeighting: true
191 | }
192 | }, 'Yahoo BOSS PlaceFinder': {
193 | cons: ['Looks out of date and poorly maintained.'],
194 | api: {}
195 | }, 'Pitney-Bowes': {
196 | cons: ['No public plan information'],
197 | api: {
198 | docs: 'https://locate.pitneybowes.com/',
199 | geocode: true, // basic and premium
200 | reverse: true, // basic and premium
201 | autocomplete: 'https://locate.pitneybowes.com/geosearch',
202 |
203 | // can't tell about locationWeighting, don't think I can see full API docs
204 | },
205 | termsUrl: 'https://www.pitneybowes.com/us/developer/subscription-agreement.html?tab2'
206 | }, 'Geocode Earth': {
207 | api: {
208 | geocode: true,
209 | reverse: true,
210 | autocomplete: true,
211 | locationWeighting: true //"Filter results by bounding box, distance from a point, country, and more"
212 | },
213 | quality: "AU: ★★★ GNAF, elsewhere: ★☆☆ OSM + OpenAddresses"
214 | }, 'Google': {
215 | api: {
216 | geocode: true,
217 | reverse: true,
218 | docs: 'https://developers.google.com/maps/documentation/geocoding/intro',
219 | locationWeighting: 'https://developers.google.com/maps/documentation/geocoding/intro#Viewports', // viewport biasing
220 | autocomplete: 'https://developers.google.com/places/web-service/autocomplete',
221 | }, cons: ['Must use a Google Map (not Leaflet/Mapbox-GL-jS/OL)'],
222 | quality: '★★★ Top-notch',
223 | termsUrl: 'https://enterprise.google.com/maps/terms/us/maps_purchase_agreement_emea.html'
224 |
225 | }, 'PSMA': {
226 | quality: 'AU: ★★★ Authoritative',
227 | api: {
228 | geocode: true,
229 | reverse: false,
230 | autocomplete: 'https://developer.psma.com.au/api/predictive-address-verification/get/predictive/address'
231 | },
232 | playUrl: 'https://demo.psma.com.au/predictive-address-verification'
233 | }, 'SmartyStreets': {
234 | api: {
235 | geocode: true,
236 | autocomplete: false, // true for US addresses only
237 | reverse: false,
238 | locationWeighting: false
239 | }
240 | }
241 | };
242 |
243 |
244 |
245 | const plans = [
246 | {
247 | group: 'ArcGIS',
248 | name: 'Geosearch, Not Stored',
249 | dollarsMonthly: 0,
250 | includedRequestsMonthly: 1e6,
251 | permanent: false,
252 | thirdParty: true,
253 | url: 'https://developers.arcgis.com/features/geocoding/',
254 | conditions: [ "must display attribution"]
255 | },
256 | {
257 | group: 'ArcGIS',
258 | name: 'Geocode, Batch or Stored',
259 | dollarsMonthly: 0,
260 | includedRequestsMonthly: 0,
261 | extraPer1000: 4,
262 | permanent: true,
263 | thirdParty: true,
264 | url: 'https://developers.arcgis.com/features/geocoding/',
265 | conditions: [ "must display attribution"]
266 | },
267 | {
268 | group: 'Gisgraphy',
269 | name: 'First',
270 | dollarsMonthly: 93,
271 | includedRequestsMonthly: 1296000,
272 | requestsPerSecond: 0.5, // 30 per 60 seconds
273 | url: 'https://premium.gisgraphy.com/pricing',
274 | thirdParty: true,
275 | publicRequired: false,
276 | bonuses:['Entire SQL database can be downloaded.'],
277 | freeRequired: false,
278 | sortDollars:938,
279 | autocompleteMultiplier:1
280 | },
281 | {
282 | group: 'Gisgraphy',
283 | name: 'Standard',
284 | dollarsMonthly: 235,
285 | includedRequestsMonthly: 5184000,
286 | requestsPerSecond: 2, // 120 per 60 seconds
287 | url: 'https://premium.gisgraphy.com/pricing',
288 | thirdParty: true,
289 | publicRequired: false,
290 | bonuses:['Entire SQL database can be downloaded.'],
291 | freeRequired: false,
292 | sortDollars:2347,
293 | autocompleteMultiplier:1
294 | },
295 | {
296 | group: 'Gisgraphy',
297 | name: 'Business',
298 | dollarsMonthly: 352,
299 | includedRequestsMonthly: 12960000,
300 | requestsPerSecond: 5, // 300 per 60 seconds
301 | url: 'https://premium.gisgraphy.com/pricing',
302 | thirdParty: true,
303 | publicRequired: false,
304 | bonuses:['Entire SQL database can be downloaded.'],
305 | freeRequired: false,
306 | sortDollars:3522,
307 | autocompleteMultiplier:1
308 | },
309 | {
310 | group: 'Gisgraphy',
311 | name: 'Expert',
312 | dollarsMonthly: 586,
313 | includedRequestsMonthly: 21600000,
314 | requestsPerSecond: 9, // 500 per 60 seconds
315 | url: 'https://premium.gisgraphy.com/pricing',
316 | thirdParty: true,
317 | publicRequired: false,
318 | bonuses:['Entire SQL database can be downloaded.'],
319 | freeRequired: false,
320 | sortDollars:5868,
321 | autocompleteMultiplier:1
322 | },
323 | {
324 | group: 'HERE',
325 | name: 'Public Basic',
326 | dollarsMonthly: 0,
327 | includedRequestsMonthly: 15e3,
328 | requestsPerSecond: 1,
329 | extra: per(1, 2),
330 | extraPer1000: 1 / 2,
331 | maxRequestsMonthly: false,
332 | url: 'https://developer.here.com/plans',
333 | thirdParty: false,
334 | publicRequired: true,
335 | },
336 | { group: 'HERE',
337 | name: 'Public Starter',
338 | requestsPerSecond: 1,
339 | dollarsMonthly: 49,
340 | dollarsAnnually: 490,
341 | includedRequestsMonthly: 100e3,
342 | extra: per(1, 2),
343 | extraPer1000: 1 / 2,
344 | maxRequestsMonthly: false,
345 | url: 'https://developer.here.com/plans',
346 | thirdParty: false,
347 | publicRequired: true
348 | },
349 | {
350 | group: 'HERE',
351 | name: 'Public Standard',
352 | includedRequestsMonthly: 250e3,
353 | extra: per(1, 2),
354 | extraPer1000: 1 / 2,
355 | maxRequestsMonthly: false,
356 | requestsPerSecond: 2,
357 | url: 'https://developer.here.com/plans',
358 | dollarsMonthly: 119,
359 | dollarsAnnually: 1190,
360 | thirdParty: false,
361 | publicRequired: true
362 | },
363 | {
364 | group: 'HERE',
365 | name: 'Public Pro',
366 | includedRequestsMonthly: 1e6,
367 | extra: per(1, 2),
368 | extraPer1000: 1 / 2,
369 | maxRequestsMonthly: false,
370 | requestsPerSecond: 3,
371 | url: 'https://developer.here.com/plans',
372 | dollarsMonthly: 449,
373 | dollarsAnnually: 4490,
374 | thirdParty: false,
375 | publicRequired: true
376 | },
377 | {
378 | group: 'HERE',
379 | name: 'Public Custom',
380 | includedRequestsMonthly: undefined,
381 | maxRequestsMonthly: undefined,
382 | url: 'https://developer.here.com/plans',
383 | dollarsMonthly: undefined,
384 | custom: true,
385 | publicRequired: true,
386 | thirdParty: false, //?
387 | sortDollars: 5000
388 | },
389 | { group: 'HERE',
390 | name: 'Business Starter',
391 | includedRequestsMonthly: 50e3,
392 | extra: per(1, 0.2),
393 | extraPer1000: 1 / 0.2, // yep, $1 per 200 trans
394 | maxRequestsMonthly: false,
395 | requestsPerSecond: 1,
396 | url: 'https://developer.here.com/plans',
397 | dollarsMonthly: 199,
398 | dollarsAnnually: 1990,
399 | thirdParty: false,
400 | publicRequired: false
401 | },
402 | {
403 | group: 'HERE',
404 | name: 'Business Standard',
405 | includedRequestsMonthly: 100e3,
406 | extra: per(1, 0.2),
407 | extraPer1000: 1 / 0.2, // yep, $1 per 200 trans
408 | maxRequestsMonthly: false,
409 | requestsPerSecond: 2,
410 | url: 'https://developer.here.com/plans',
411 | dollarsMonthly: 349,
412 | dollarsAnnually: 3490,
413 | publicRequired: false,
414 | thirdParty: false,
415 | },
416 | {
417 | group: 'HERE',
418 | name: 'Business Pro',
419 | includedRequestsMonthly: 150e3,
420 | extra: per(1, 0.2),
421 | extraPer1000: 1 / 0.2, // yep, $1 per 200 trans
422 | maxRequestsMonthly: false,
423 | requestsPerSecond: 3,
424 | url: 'https://developer.here.com/plans',
425 | dollarsMonthly: 499,
426 | dollarsAnnually: 4990,
427 | thirdParty: false,
428 | publicRequired: false
429 | },
430 | {
431 | group: 'HERE',
432 | name: 'Business Custom',
433 | includedRequestsMonthly: undefined,
434 | maxRequestsMonthly: undefined,
435 | url: 'https://developer.here.com/plans',
436 | dollarsMonthly: undefined,
437 | bonuses: ['Permanent storage +$5k/year.'],
438 | custom: true,
439 | publicRequired: false,
440 | permanent: true,
441 | thirdParty: false, // presumably not
442 | sortDollars: 10000 // this should be a formula based on requests...
443 | },
444 | {
445 | group: 'Bing',
446 | name: 'Consumer, Free',
447 | includedRequestsMonthly: 125e3/12,
448 | maxRequestsMonthly: 125e3/12,
449 | dollarsMonthly: 0,
450 | publicRequired: true,
451 | freeRequired: true,
452 | permanent: false, // "except that geocodes may be stored locally only for use with your Company Applications. "
453 | thirdParty: true,
454 | conditions: ['Max 125,000 transactions per year'],
455 | bonuses: ['Local caching of geocodes is allowed "for use with your Company Applications"'],
456 | url: 'https://www.microsoft.com/en-us/maps/licensing/options',
457 | autocompleteMultiplier: 0
458 | }, {
459 | group: 'Bing',
460 | name: 'Non-profit, Free',
461 | includedRequestsDaily: 50000,
462 | maxRequestsMonthly: 50000*MONTH,
463 | dollarsMonthly: 0,
464 | publicRequired: true,
465 | permanent: false, // "except that geocodes may be stored locally only for use with your Company Applications. "
466 | freeRequired: true, // "Applications that qualify for a limited website and consumer application use, which will be free of charge as defined in the SDKs"
467 | conditions: [
468 | 'Must be non-profit.',
469 | 'Less than 50k transactions per 24 hours.'
470 | ],
471 | bonuses: ['Local caching of geocodes is allowed "for use with your Company Applications"'],
472 | thirdParty: true,
473 | url: 'https://www.microsoft.com/en-us/maps/licensing/options',
474 | autocompleteMultiplier: 0
475 |
476 | }, {
477 | group: 'Bing',
478 | name: 'Quote #1',
479 | includedRequestsMonthly: 500e3 / 12, // annually
480 | dollarsMonthly: 4620 / 12,
481 | sortDollars: 3680,
482 | permanent: false, // "except that geocodes may be stored locally only for use with your Company Applications. "
483 | thirdParty: true,
484 | autocompleteMultiplier: 0, // We think, based on the session key thing.
485 | bonuses: ['Local caching of geocodes is allowed "for use with your Company Applications"']
486 | }, {
487 | group: 'Bing',
488 | name: 'Quote #2',
489 | includedRequestsMonthly: 1e6 / 12, // annually
490 | dollarsMonthly: 6050 / 12,
491 | sortDollars: 4818,
492 | permanent: false, // "except that geocodes may be stored locally only for use with your Company Applications. "
493 | thirdParty: true,
494 | autocompleteMultiplier: 0,
495 | bonuses: ['Local caching of geocodes is allowed "for use with your Company Applications"']
496 | }, {
497 | group: 'Mapbox',
498 | name: 'Pay-as-you-go',
499 | includedRequestsMonthly: 50e3,
500 | maxRequestsMonthly: false,
501 | dollarsMonthly: 0,
502 | extra: '+ 50c/1000',
503 | extraPer1000: 0.5,
504 | publicRequired: true,
505 | requestsPerSecond: 600 / 60,
506 | freeRequired: true,
507 | thirdParty: false,
508 | conditions: ['No bulk jobs.', 'Must display on Mapbox map.','May not reveal lat/lon to user.', 'Must not cache at all.'],
509 | // totalMonthly: requests => 0 + 0.50 * (Math.max(requests - 50e3, 0) / 1000),
510 | humanOnly: true,
511 | url: 'https://www.mapbox.com/pricing/'
512 |
513 | }, {
514 | group: 'Mapbox',
515 | name: 'Commercial',
516 | includedRequestsMonthly: 50e3,
517 | maxRequestsMonthly: false,
518 | dollarsMonthly: 499,
519 | publicRequired: false,
520 | thirdParty: false,
521 | requestsPerSecond: 600 / 60,
522 | conditions: ['No bulk jobs.', 'Must display on Mapbox map.','May not reveal lat/lon to user.', 'Must not cache at all.'],
523 | extraPer1000: 0.5,
524 | extra: '+$0.50 per 1000 requests',
525 | // totalMonthly: requests => 499 + 0.50 * (Math.max(requests - 50e3, 0) / 1000),
526 | humanOnly: true,
527 | url: 'https://www.mapbox.com/pricing/',
528 |
529 | }, {
530 | group: 'Mapbox',
531 | name: 'Enterprise',
532 | includedRequestsMonthly: undefined,
533 | maxRequestsMonthly: false,
534 | dollarsMonthly: undefined,
535 | custom:true,
536 | publicRequired: false,
537 | thirdParty: false,
538 | requestsPerSecond: 1200 / 60,
539 | permanent: true,
540 | bonuses: ['50 locations per request'],
541 |
542 | sortDollars: 12500, // I think? Have heard figures of $12.5k and $25k, not sure difference.
543 | humanOnly: false, // "Batch geocoding is only available with an Enterprise plan."
544 | url: 'https://www.mapbox.com/pricing/'
545 |
546 | },
547 | {
548 | group: 'OpenCage',
549 | name: 'Free Trial',
550 | includedRequestsDaily: 2500,
551 | requestsPerSecond: 1,
552 | dollarsMonthly: 0,
553 | permanent: true,
554 | openData: true,
555 | thirdParty: true,
556 | url: 'https://opencagedata.com/pricing',
557 |
558 | },
559 | {
560 | group: 'OpenCage',
561 | name: 'X-Small',
562 | includedRequestsDaily: 10e3,
563 | requestsPerSecond: 10,
564 | dollarsMonthly: 66,
565 | currencySymbol: '$A',
566 | permanent: true,
567 | openData: true,
568 | thirdParty: true,
569 | url: 'https://opencagedata.com/pricing'
570 | },
571 | {
572 | group: 'OpenCage',
573 | name: 'Small',
574 | includedRequestsDaily: 20e3,
575 | requestsPerSecond: 12,
576 | dollarsMonthly: 132,
577 | currencySymbol: '$A',
578 | permanent: true,
579 | openData: true,
580 | thirdParty: true,
581 | url: 'https://opencagedata.com/pricing'
582 | },
583 | {
584 | group: 'OpenCage',
585 | name: 'Medium',
586 | includedRequestsDaily: 100e3,
587 | requestsPerSecond: 15,
588 | dollarsMonthly: 660,
589 | currencySymbol: '$A',
590 | permanent: true,
591 | openData: true,
592 | thirdParty: true,
593 | url: 'https://opencagedata.com/pricing'
594 | },
595 | {
596 | group: 'OpenCage',
597 | name: 'Large',
598 | includedRequestsDaily: 1e6,
599 | // includedRequestsMonthly: 1e6 * MONTH,
600 | requestsPerSecond: 15,
601 | dollarsMonthly: 1320,
602 | currencySymbol: '$A',
603 | permanent: true,
604 | url: 'https://opencagedata.com/pricing',
605 | openData: true,
606 | thirdParty: true,
607 | },
608 | // TODO Google Free plan
609 | {
610 | group: 'Google',
611 | name: 'Standard',
612 | includedRequestsDaily: 2500,
613 | maxRequestsMonthly: 100e3,
614 | freeRequired: true,
615 | publicRequired: true,
616 | totalMonthly: requests => 0 + 0.5 * Math.max(requests - 2500 * MONTH, 0) / 1000,
617 | url: 'https://developers.google.com/maps/pricing-and-plans/#details',
618 | thirdParty: false,
619 | humanOnly: true,
620 | libraryRequired: true,
621 | conditions: [
622 | 'Your ToS and Privacy Policy must reference Google\'s',
623 | 'No bulk downloads' //10.5e No mass downloading. You will not use the Service in a manner that gives you or a third party access to mass downloads or bulk feeds of any Content. For example, you are not permitted to offer a batch geocoding service that uses Content contained in the Maps API(s).
624 | ],
625 | autocompleteMultiplier: 1/2.5, // based on I'm-not-sure-what
626 | bonuses: ['Excellent worldwide quality'],
627 | },
628 | {
629 | group: 'Google',
630 | name: 'Premium',
631 | includedRequestsMonthly: 100e3 * MONTH,
632 | custom: true,
633 | url: 'https://developers.google.com/maps/premium/usage-limits',
634 | sortDollars: 20000,
635 | thirdParty: false,
636 | humanOnly: true,
637 | libraryRequired: true,
638 | conditions: [
639 | 'Your ToS and Privacy Policy must reference Google\'s',
640 | 'No bulk downloads' //10.5e No mass downloading. You will not use the Service in a manner that gives you or a third party access to mass downloads or bulk feeds of any Content. For example, you are not permitted to offer a batch geocoding service that uses Content contained in the Maps API(s).
641 | ],
642 | autocompleteMultiplier: 1/2.5, // based on I'm-not-sure-what
643 | bonuses: ['Excellent worldwide quality'],
644 | // 1 geocoding request=0.25 credits
645 | // maxRequsetsMonthly: 100e3
646 | // totalMonthly: requests => 0 + 0.5 * Math.max(requests - 2500 * MONTH, 0) / 1000
647 | },
648 | {
649 | group: 'Google',
650 | name: 'ONI Group quote',
651 | includedRequestsMonthly: 0,
652 | // "Assume that 500k-1m credits would be ~ $21k", Translating that as 1 million credits for $21k, each credit is 4 geocodes, so 4 million.
653 | dollarsMonthly: 0,
654 | currencySymbol: '$A',
655 | extraPer1000: 21e3 / (4e6 / 1000),
656 | maxRequestsMonthly: false,
657 | url: 'https://developers.google.com/maps/premium/usage-limits',
658 | // sortDollars: 20000,
659 | thirdParty: false,
660 | humanOnly: true,
661 | libraryRequired: true,
662 | conditions: [
663 | 'Your ToS and Privacy Policy must reference Google\'s',
664 | 'No bulk downloads' //10.5e No mass downloading. You will not use the Service in a manner that gives you or a third party access to mass downloads or bulk feeds of any Content. For example, you are not permitted to offer a batch geocoding service that uses Content contained in the Maps API(s).
665 | ],
666 | autocompleteMultiplier: 1/2.5, // based on I'm-not-sure-what
667 | bonuses: ['Excellent worldwide quality'],
668 | // 1 geocoding request=0.25 credits
669 | // maxRequsetsMonthly: 100e3
670 | // totalMonthly: requests => 0 + 0.5 * Math.max(requests - 2500 * MONTH, 0) / 1000
671 | },
672 | {
673 | group: 'Geocode Earth',
674 | name: 'Basic',
675 | includedRequestsMonthly: 200e3,
676 | dollarsMonthly: 200,
677 | requestsPerSecond: 5, //10 for autocomplete or reverse but that's too complicated
678 | openData: true,
679 | thirdParty: true,
680 | permanent: true,
681 | bonuses: ['Made by the Mapzen team'],
682 | url: 'https://geocode.earth/',
683 | },
684 | {
685 | group: 'Geocode Earth',
686 | name: 'Advanced',
687 | includedRequestsMonthly: 2e6,
688 | dollarsMonthly: 500,
689 | requestsPerSecond: 10, //20 for autocomplete or reverse but that's too complicated
690 | openData: true,
691 | thirdParty: true,
692 | permanent: true,
693 | bonuses: ['Made by the Mapzen team'],
694 | url: 'https://geocode.earth/',
695 | },
696 | {
697 | group: 'Geocode Earth',
698 | name: 'Custom',
699 | custom: true,
700 | openData: true,
701 | thirdParty: true,
702 | permanent: true,
703 | bonuses: ['Made by the Mapzen team'],
704 | url: 'https://geocode.earth/',
705 | },
706 | {
707 | group: 'SmartyStreets',
708 | name: 'International 1000',
709 | includedRequestsMonthly: 1e3,
710 | dollarsMonthly: 65,
711 | url: 'https://smartystreets.com/pricing/international',
712 | thirdParty: true,
713 | autocomplete: false
714 | },
715 | {
716 | group: 'SmartyStreets',
717 | name: 'International 10,000',
718 | includedRequestsMonthly: 10e3,
719 | dollarsMonthly: 592,
720 | url: 'https://smartystreets.com/pricing/international',
721 | thirdParty: true,
722 | autocomplete: false
723 | },
724 | {
725 | group: 'SmartyStreets',
726 | name: 'International 100,000',
727 | includedRequestsMonthly: 100e3,
728 | dollarsMonthly: 5400,
729 | url: 'https://smartystreets.com/pricing/international',
730 | thirdParty: true,
731 | autocomplete: false
732 | },
733 | {
734 | group: 'SmartyStreets',
735 | name: 'International 1,000,000',
736 | includedRequestsMonthly: 1e6,
737 | dollarsMonthly: 50000,
738 | url: 'https://smartystreets.com/pricing/international',
739 | thirdParty: true,
740 | autocomplete: false
741 | },
742 | {
743 | group: 'Geocode.xyz',
744 | name: 'Throttled API',
745 | dollarsMonthly: 0,
746 | requestsPerSecond: 1,
747 | maxRequestsDaily: 86400,// in principle...
748 | includedRequestsMonthly: 1e12,
749 | permanent: true,
750 | openData: true,
751 | thirdParty: true,
752 | url: 'https://geocode.xyz/pricing',
753 | },
754 | {
755 | group: 'Geocode.xyz',
756 | name: 'Pay-per-use',
757 | dollarsMonthly: 0,
758 | maxRequestsMonthly: false,
759 | includedRequestsMonthly: 0,
760 | extraPer1000: 2.5,
761 | extra: '+ €2.50/1000 requests',
762 | // totalMonthly: requests => 0 + 0.0025 * requests,
763 | currencySymbol: '€',
764 | permanent: true,
765 | openData: true,
766 | thirdParty: true,
767 | url: 'https://geocode.xyz/pricing',
768 | },
769 | {
770 | group: 'Geocode.xyz',
771 | name: 'Monthly unlimited',
772 | dollarsMonthly: 100,
773 | maxRequestsMonthly: false,
774 | includedRequestsMonthly: 1e12,
775 | // extras: '€2.50/1000 requests',
776 | extras: 'Unlimited requests',
777 | // totalMonthly: requests => 0 + 0.0025 * requests,
778 | currencySymbol: '€',
779 | permanent: true,
780 | openData: true,
781 | thirdParty: true,
782 | url: 'https://geocode.xyz/pricing',
783 | },
784 | {
785 | group: 'LocationIQ',
786 | name: 'Free',
787 | dollarsMonthly: 0,
788 | includedRequestsDaily: 10e3,
789 | requestsPerSecond: 120/60,
790 | freeRequired: false,
791 | url: 'https://locationiq.com/',
792 | openData: true,
793 | permanent: true,
794 | thirdParty: true,
795 | humanOnly: false
796 | },
797 | {
798 | group: 'LocationIQ',
799 | name: 'Developer+',
800 | dollarsMonthly: 50,
801 | includedRequestsDaily: 20e3,
802 | requestsPerSecond: 1200/60,
803 | freeRequired: false,
804 | url: 'https://locationiq.com/',
805 | openData: true,
806 | permanent: true,
807 | thirdParty: true,
808 | humanOnly: false
809 | },
810 | {
811 | group: 'LocationIQ',
812 | name: 'Starter',
813 | dollarsMonthly: 100,
814 | includedRequestsDaily: 50e3,
815 | requestsPerSecond: 1440/60,
816 | freeRequired: false,
817 | url: 'https://locationiq.com/',
818 | openData: true,
819 | permanent: true,
820 | thirdParty: true,
821 | humanOnly: false
822 | },
823 | {
824 | group: 'LocationIQ',
825 | name: 'Business',
826 | dollarsMonthly: 200,
827 | includedRequestsDaily: 100e3,
828 | requestsPerSecond: 1800/60,
829 | freeRequired: false,
830 | url: 'https://locationiq.com/',
831 | openData: true,
832 | permanent: true,
833 | thirdParty: true,
834 | humanOnly: false
835 | },
836 | {
837 | group: 'LocationIQ',
838 | name: 'Business+',
839 | dollarsMonthly: 500,
840 | includedRequestsDaily: 500e3,
841 | requestsPerSecond: 2400/60,
842 | freeRequired: false,
843 | url: 'https://locationiq.com/',
844 | openData: true,
845 | permanent: true,
846 | thirdParty: true,
847 | humanOnly: false
848 | },
849 | {
850 | group: 'LocationIQ',
851 | name: 'Enterprise',
852 | custom:true,
853 | // dollarsMonthly: 0,
854 | // includedRequestsDaily: 10e3,
855 | url: 'https://locationiq.com/',
856 | openData: true,
857 | thirdParty: true,
858 | permanent: true,
859 | humanOnly: false,
860 | sortDollars: 1000 * 12
861 | },
862 | {
863 | group: 'Mapquest',
864 | name: 'Free',
865 | dollarsMonthly: 0,
866 | includedRequestsMonthly: 15e3,
867 | thirdParty: false,
868 | permanent: false,
869 | humanOnly: true,
870 | url: 'https://developer.mapquest.com/plans'
871 | },
872 | {
873 | group: 'Mapquest',
874 | name: 'Basic',
875 | dollarsMonthly: 99,
876 | includedRequestsMonthly: 30e3,
877 | thirdParty: false,
878 | permanent: false,
879 | humanOnly: true,
880 | conditions: ['Excess usage billed as "overage"'],
881 | url: 'https://developer.mapquest.com/plans'
882 | },
883 | {
884 | group: 'Mapquest',
885 | name: 'Plus',
886 | dollarsMonthly: 199,
887 | includedRequestsMonthly: 75e3,
888 | thirdParty: false,
889 | permanent: false,
890 | humanOnly: true,
891 | conditions: ['Excess usage billed as "overage"'],
892 | url: 'https://developer.mapquest.com/plans'
893 | },
894 | {
895 | group: 'Mapquest',
896 | name: 'Business',
897 | dollarsMonthly: 399,
898 | includedRequestsMonthly: 200e3,
899 | thirdParty: false,
900 | permanent: false,
901 | humanOnly: true,
902 | conditions: ['Excess usage billed as "overage"'],
903 | url: 'https://developer.mapquest.com/plans'
904 | },
905 | {
906 | group: 'Mapquest',
907 | name: 'Business Plus',
908 | dollarsMonthly: 799,
909 | includedRequestsMonthly: 500e3,
910 | thirdParty: false,
911 | permanent: false,
912 | humanOnly: true,
913 | conditions: ['Excess usage billed as "overage"'],
914 | url: 'https://developer.mapquest.com/plans'
915 | },
916 | {
917 | group: 'Mapquest',
918 | name: 'Business Enhanced',
919 | dollarsMonthly: 499,
920 | includedRequestsMonthly: 200e3,
921 | bonuses: ['Store results (US+Canada)','Bulk queries, third-party-maps'],
922 | conditions: ['6 month commitment', 'Excess usage billed as "overage"'],
923 | thirdParty: true,
924 | url: 'https://developer.mapquest.com/plans',
925 | permanent: false
926 | },
927 | {
928 | group: 'Mapquest',
929 | name: 'Business Plus Enhanced',
930 | dollarsMonthly: 899,
931 | includedRequestsMonthly: 500e3,
932 | bonuses: ['Store results (US + Canada)','Bulk queries, third-party-maps'],
933 | conditions: ['6 month commitment', 'Excess usage billed as "overage"'],
934 | thirdParty: true,
935 | url: 'https://developer.mapquest.com/plans',
936 | permanent: false
937 | },
938 | {
939 | group: 'Mapquest',
940 | name: 'Enterprise',
941 | custom: true,
942 | thirdParty: true,
943 | conditions: ['Excess usage billed as "overage"'],
944 | // probably these apply:
945 | bonuses: ['Store results (US + Canada)','Bulk queries, third-party-maps'],
946 | url: 'https://developer.mapquest.com/plans',
947 | permanent: false,
948 | sortDollars: 12000
949 | },
950 | {
951 | group: 'Yandex',
952 | name: 'Free',
953 | thirdParty: false,
954 | humanOnly: true,
955 | publicRequired: true,
956 | freeRequired: true,
957 | permanent: false,
958 | includedRequestsMonthly: 25e3,
959 | dollarsMonthly: 0,
960 | url: 'https://tech.yandex.com/maps/doc/jsapi/2.1/terms/index-docpage/?from=geocoder#conditions'
961 | },
962 | {
963 | group: 'Yandex',
964 | name: 'API for Business',
965 | thirdParty: false,
966 | humanOnly: true,
967 | permanent: true,
968 | includedRequestsMonthly: 100000,
969 | conditions: ['Primarily eastern Europe', 'Storing geocodes "On request"', 'Processing without showing "On request"'],
970 | publicRequired: false,
971 | dollarsMonthly: 100000,
972 | sortDollars:1772*12,//USD
973 | currencySymbol: '₽', //rubles!
974 | url: 'https://tech.yandex.com/maps/commercial/?from=geocoder'
975 | },
976 | {
977 | group: 'Pitney-Bowes',
978 | name: 'Quote #1',
979 | includedRequestsMonthly: 0,
980 | dollarsMonthly: 0,
981 | extraPer1000: 18.13,
982 | currencySymbol: '$A',
983 | url: 'https://locate.pitneybowes.com/',
984 | conditions:['"Premium" geocode API uses 3x credits', '3 credits per autocomplete request!'],
985 | permanent: '30 days',
986 | humanOnly: false, // see 3.3 here https://www.pitneybowes.com/us/developer/subscription-agreement.html?tab2
987 | cacheLimitDays: 30,
988 | autocompleteMultiplier: 3,
989 | // custom: true,
990 | // sortDollars:20000, // https://locate.pitneybowes.com/ // wonder how much it is
991 |
992 | },
993 | {
994 | group: 'Geocode.farm',
995 | name: 'Bronze',
996 | includedRequestsDaily: 25e3,
997 | dollarsMonthly: 100,
998 | currencySymbol: '£',
999 | url: 'https://geocode.farm/our-packages/',
1000 | conditions:['Based in Belize','⚠ "No chargebacks ever" policy'],
1001 | permanent: true,
1002 | thirdParty: true
1003 | },
1004 | {
1005 | group: 'Geocode.farm',
1006 | name: 'Silver',
1007 | includedRequestsDaily: 50e3,
1008 | dollarsMonthly: 200,
1009 | currencySymbol: '£',
1010 | url: 'https://geocode.farm/our-packages/',
1011 | conditions:['Based in Belize','⚠"No chargebacks ever" policy'],
1012 | permanent: true,
1013 | thirdParty: true
1014 | },
1015 | {
1016 | group: 'Geocode.farm',
1017 | name: 'Gold',
1018 | includedRequestsDaily: 100e3,
1019 | dollarsMonthly: 300,
1020 | currencySymbol: '£',
1021 | url: 'https://geocode.farm/our-packages/',
1022 | conditions:['Based in Belize','⚠"No chargebacks ever" policy'],
1023 | permanent: true,
1024 | thirdParty: true
1025 | },
1026 | {
1027 | group: 'Geocode.farm',
1028 | name: 'Platinum',
1029 | includedRequestsDaily: 1e6,
1030 | dollarsMonthly: 1000,
1031 | currencySymbol: '£',
1032 | url: 'https://geocode.farm/our-packages/',
1033 | conditions:['£1000 setup fee', 'Based in Belize','⚠"No chargebacks ever" policy'],
1034 | permanent: true,
1035 | thirdParty: true
1036 | },
1037 | {
1038 | group: 'Yahoo BOSS PlaceFinder',
1039 | name: '0-10,000',
1040 | includedRequestsDaily: 0,
1041 | maxRequestsDaily: 10e3,
1042 | dollarsMonthly: 0,
1043 | url: 'https://developer.yahoo.com/boss/geo/#pricing',
1044 | extra: '+ $6/1000',
1045 | extraPer1000: 6,
1046 | totalMonthly: requests => 0 + (requests /1000) * 6
1047 | },
1048 | {
1049 | group: 'Yahoo BOSS PlaceFinder',
1050 | name: '10,0001-35,000',
1051 | includedRequestsDaily: 10000,
1052 | maxRequestsDaily: 35000,
1053 | dollarsMonthly: (10000 / 1000) * 4 * MONTH,
1054 | extra: '+ $4/1000',
1055 | extraPer1000: 4,
1056 | url: 'https://developer.yahoo.com/boss/geo/#pricing',
1057 | totalMonthly: requests => 0 + Math.max(requests, 10001) /1000 * 4
1058 | },
1059 | {
1060 | group: 'Yahoo BOSS PlaceFinder',
1061 | name: '35,000+',
1062 | includedRequestsDaily: 35000,
1063 | maxRequestsDaily: false,
1064 | dollarsMonthly: (35000 / 1000 * 3) * 30,
1065 | extra: '+ $3/1000',
1066 | extraPer1000: 3,
1067 | url: 'https://developer.yahoo.com/boss/geo/#pricing',
1068 | totalMonthly: requests => 0 + Math.max(requests, 35000) /1000 * 3
1069 | },
1070 | {
1071 | group: 'Maplarge',
1072 | name: 'Bulk upload',
1073 | dollarsMonthly: 0,
1074 | extra: '+ $4/1000',
1075 | extraPer1000: 4,
1076 | bonuses: ['Cheaper at higher rates'],
1077 | conditions: ['Pricing of API unknown'],
1078 | url: 'http://www.maplarge.com/geocoder#pricing',
1079 | thirdParty: true, // probably
1080 | // totalMonthly: requests => requests / 1000 * 4
1081 | },
1082 | {
1083 | group: 'Nominatim',
1084 | name: 'Public API',
1085 | dollarsMonthly: 0,
1086 | requestsPerSecond: 1,
1087 | bonuses: ['No hard limits', 'Open source, running own instance is possible'],
1088 | conditions: ['Caching mandatory if possible', 'No big jobs','Attribution required', 'valid HTTP Referer or User-Agent mandatory', 'data is ODbL licensed'],
1089 | permanent: true,
1090 | humanOnly: false,
1091 | openData: true,
1092 | thirdParty: true
1093 | },
1094 | {
1095 | group: 'Photon',
1096 | name: 'Demo instance',
1097 | dollarsMonthly: 0,
1098 | requestsPerSecond: 1, // unspecifed beyond "extensive usage will be throttled" - https://github.com/komoot/photon/issues/479
1099 | termsUrl: 'http://photon.komoot.de/',
1100 | bonuses: ['Open source, running own instance is possible'],
1101 | conditions: ['demo supports only some values of lang parameter', 'Attribution required', 'data is ODbL licensed'], // https://github.com/komoot/photon/issues/313
1102 | permanent: true,
1103 | humanOnly: false,
1104 | openData: true,
1105 | thirdParty: true
1106 | },
1107 | // where are the tomtom terms?
1108 | // https://www.tomtom.com/en_au/legal/terms-and-conditions/ ?
1109 | // https://www.tomtom.com/en_au/legal/terms-of-use/ ?
1110 | // https://developer.tomtom.com/terms-and-conditions ?
1111 | {
1112 | group: 'Tomtom',
1113 | name: 'Free',
1114 | dollarsMonthly: 0,
1115 | requestsPerSecond: 5,
1116 | includedRequestsDaily: 2500,
1117 | maxRequestsDaily: 2500,
1118 | thirdParty: false,
1119 | publicRequired: true,
1120 | url: 'https://developer.tomtom.com/store/maps-api',
1121 | },
1122 | {
1123 | group: 'Tomtom',
1124 | name: '50,000 public',
1125 | dollarsMonthly: 0,
1126 | maxRequestsMonthly: false,
1127 | maxRequestsDaily: false,
1128 | // includedRequestsDaily: 2500,
1129 | includedRequestsMonthly: 2500 * MONTH,
1130 | extra: per(25, 50),
1131 | extraPer1000: 25 / 50,
1132 | thirdParty: false,
1133 | publicRequired: true,
1134 | url: 'https://developer.tomtom.com/store/maps-api',
1135 | bonuses: ['Credits last 12 months', '2500 free per day']
1136 | },
1137 | {
1138 | group: 'Tomtom',
1139 | name: '1,000,000 public',
1140 | // extra: '+ $449 per 1M ($' + 449 / (1e6 / 1000) + '/1k)',
1141 | extra: per(449, 1000),
1142 | dollarsMonthly: 0,//449,
1143 | minDollarsYearly: 449,
1144 | includedRequestsDaily: 2500,
1145 | maxRequestsMonthly: false,
1146 | maxRequestsDaily: false,
1147 | extraPer1000: 449 / 1000,
1148 | thirdParty: false,
1149 | publicRequired: true,
1150 | url: 'https://developer.tomtom.com/store/maps-api',
1151 | bonuses: ['Credits last 12 months', '2500 free per day']
1152 | },
1153 | {
1154 | group: 'Tomtom',
1155 | name: '10,000,000 public',
1156 | dollarsMonthly: 0,
1157 | maxRequestsMonthly: false,
1158 | maxRequestsDaily: false,
1159 | minDollarsYearly: 4199,
1160 | includedRequestsDaily: 2500,// * MONTH + 10e6,
1161 | extraPer1000: 4199 / (10e6 / 1000),
1162 | extra: per(4199, 10e6 / 1000),
1163 | // extra: '+ $4,199 per 1M ($' + 4199 / (10e6 / 1000) + '/1k)',
1164 | thirdParty: false,
1165 | publicRequired: true,
1166 | url: 'https://developer.tomtom.com/store/maps-api',
1167 | bonuses: ['Credits last 12 months', '2500 free per day']
1168 | },
1169 | {
1170 | group: 'Tomtom',
1171 | name: '50,000 private',
1172 | dollarsMonthly: 0,
1173 | maxRequestsMonthly: false,
1174 | maxRequestsDaily: false,
1175 | includedRequestsMonthly: 2500,// * MONTH + 50e3,
1176 | extraPer1000: 199 / 50,
1177 | extra: '+ $199 per 50k ($3.98/1k)',
1178 | // includedRequestsMonthly: 50e3,
1179 | thirdParty: false,
1180 | url: 'https://developer.tomtom.com/store/maps-api',
1181 | bonuses: ['Credits last 12 months', '2500 free per day']
1182 | },
1183 | {
1184 | group: 'Tomtom',
1185 | name: '100,000 private',
1186 | dollarsMonthly: 0,
1187 | maxRequestsMonthly: false,
1188 | maxRequestsDaily: false,
1189 | minDollarsYearly: 379,
1190 | includedRequestsDaily: 2500,
1191 | extraPer1000: 379 / 100,
1192 | extra: '+ $379 per 100k ($3.79/1k)',
1193 | thirdParty: false,
1194 | url: 'https://developer.tomtom.com/store/maps-api',
1195 | bonuses: ['Credits last 12 months', '2500 free per day']
1196 | },
1197 | {
1198 | group: 'Tomtom',
1199 | name: '250,000 private',
1200 | dollarsMonthly: 0,
1201 | maxRequestsMonthly: false,
1202 | maxRequestsDaily: false,
1203 | minDollarsYearly: 909,
1204 | includedRequestsDaily: 2500,
1205 | extraPer1000: 909 / 250,
1206 | extra: '+ $909 per 250k ($3.63/1k)',
1207 | thirdParty: false,
1208 | url: 'https://developer.tomtom.com/store/maps-api',
1209 | bonuses: ['Credits last 12 months', '2500 free per day']
1210 | },
1211 | {
1212 | group: 'Tomtom',
1213 | name: '500,000 private',
1214 | dollarsMonthly: 0,
1215 | maxRequestsMonthly: false,
1216 | maxRequestsDaily: false,
1217 | minDollarsYearly: 1719,
1218 | includedRequestsDaily: 2500,
1219 | extraPer1000: 1719 / 500,
1220 | extra: '+ $1719 per 500k ($3.44/1k)',
1221 | thirdParty: false,
1222 | url: 'https://developer.tomtom.com/store/maps-api',
1223 | bonuses: ['Credits last 12 months', '2500 free per day']
1224 | },
1225 | {
1226 | group: 'Tomtom',
1227 | name: '1,000,000 private',
1228 | dollarsMonthly: 0,
1229 | maxRequestsMonthly: false,
1230 | maxRequestsDaily: false,
1231 | minDollarsYearly: 3249,
1232 | includedRequestsDaily: 2500,
1233 | extraPer1000: 3249 / 1000,
1234 |
1235 | extra: '+ $3249 per 1M ($3.25/1k)',
1236 | thirdParty: false,
1237 | url: 'https://developer.tomtom.com/store/maps-api',
1238 | bonuses: ['Credits last 12 months', '2500 free per day']
1239 | },
1240 | {
1241 | group: 'Tomtom',
1242 | name: '10,000,000 private',
1243 | dollarsMonthly: 0,
1244 | maxRequestsMonthly: false,
1245 | maxRequestsDaily: false,
1246 | minDollarsYearly: 27499,
1247 | includedRequestsDaily: 2500,
1248 | extraPer1000: 27499 / 10e3,
1249 | extra: '+ $27,499 per 10M ($2.75/1k)',
1250 | thirdParty: false,
1251 | url: 'https://developer.tomtom.com/store/maps-api',
1252 | bonuses: ['Credits last 12 months', '2500 free per day']
1253 | },
1254 | {
1255 | group: 'PSMA',
1256 | name: 'Free',
1257 | dollarsMonthly: 0,
1258 | includedRequestsMonthly: 500,
1259 | permanent: true,
1260 | thirdParty: true,
1261 | url: 'https://developer.psma.com.au/pricing',
1262 | bonuses: ['Open data licence applies', 'Free autocomplete'],
1263 | conditions: ['Australia only'],
1264 | autocompleteMultiplier: 0
1265 | },
1266 | {
1267 | group: 'PSMA',
1268 | name: 'Standard',
1269 | dollarsMonthly: 99,
1270 | includedRequestsMonthly: 10e3,
1271 | permanent: true,
1272 | thirdParty: true,
1273 | url: 'https://developer.psma.com.au/pricing',
1274 | bonuses: ['Open data licence applies', 'Free autocomplete'],
1275 | conditions: ['Australia only'],
1276 | currency: 'AUD',
1277 | currencySymbol: '$A',
1278 | autocompleteMultiplier: 0
1279 | },
1280 | {
1281 | group: 'PSMA',
1282 | name: 'Pro',
1283 | dollarsMonthly: 749,
1284 | includedRequestsMonthly: 100e3,
1285 | permanent: true,
1286 | thirdParty: true,
1287 | url: 'https://developer.psma.com.au/pricing',
1288 | bonuses: ['Open data licence applies', 'Free autocomplete'],
1289 | conditions: ['Australia only'],
1290 | currency: 'AUD',
1291 | currencySymbol: '$A',
1292 | autocompleteMultiplier: 0
1293 | },
1294 | {
1295 | group: 'PSMA',
1296 | name: 'Custom',
1297 | permanent: true,
1298 | thirdParty: true,
1299 | url: 'https://developer.psma.com.au/pricing',
1300 | bonuses: ['Open data licence applies', 'Free autocomplete'],
1301 | conditions: ['Australia only'],
1302 | custom: true,
1303 | currency: 'AUD',
1304 | currencySymbol: '$A',
1305 | autocompleteMultiplier: 0
1306 | }
1307 |
1308 |
1309 | ];
1310 | let groups = {};
1311 | plans.forEach(plan => {
1312 | plan.provider = providers[plan.group] || { api: {} };
1313 | ['termsUrl', 'permanent', 'humanOnly', 'humanOnlyNote', 'openData'].forEach(key => {
1314 | if (plan[key] === undefined && plan.provider[key] !== undefined) plan[key] = plan.provider[key];
1315 | });
1316 | groups[plan.group] = true; // just for counting
1317 | });
1318 |
1319 | export default plans;
1320 |
1321 |
1322 | console.log(plans.length + ' plans, from ' + Object.keys(groups).length + ' different providers loaded.');
1323 | console.log('Providers: ' + Object.keys(groups));
1324 |
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | CopyWebpackPlugin = require('copy-webpack-plugin');
2 | module.exports = {
3 | publicPath: '',
4 | devServer: {
5 | historyApiFallback: false,
6 | },
7 | /*configureWebpack: {
8 | plugins: [
9 | new CopyWebpackPlugin([
10 | {
11 | // because the images aren't statically referred to anywhere, they don't bundled by webpack
12 | // so we have to explicitly copy them to where we want them
13 | from: 'src/static',
14 | to: 'static',
15 | transformPath: (targetPath, absolutePath) => targetPath.toLowerCase()
16 | }
17 | ])
18 | ]
19 | },*/
20 | chainWebpack: config => config.resolve.symlinks(false),
21 | };
22 |
--------------------------------------------------------------------------------