diff --git a/.gitignore b/.gitignore index 9cf6fff..79b7bec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules/ .idea +.env +*.DS_Store diff --git a/client/main.js b/client/main.js index bc36c96..f1d7106 100644 --- a/client/main.js +++ b/client/main.js @@ -1,7 +1,7 @@ import { Template } from 'meteor/templating'; import { ReactiveVar } from 'meteor/reactive-var'; // errors in browser consol -// import './main.html'; +// import './main.html'; // Template.hello.onCreated(function helloOnCreated() { // // counter starts at 0 diff --git a/client/stylesheets/feature_discovery.css b/client/stylesheets/feature_discovery.css new file mode 100644 index 0000000..2a65515 --- /dev/null +++ b/client/stylesheets/feature_discovery.css @@ -0,0 +1,9 @@ +/* larger size field for things like text or text options */ +.h-4-large-size-field { + width: 120px; +} + +/* modifying the color of the bootstrap badge to match the focus color of the progress bar */ +.badge { + background-color: #04AA6D; +} \ No newline at end of file diff --git a/client/stylesheets/interactionReflection.css b/client/stylesheets/interactionReflection.css new file mode 100644 index 0000000..f0513f7 --- /dev/null +++ b/client/stylesheets/interactionReflection.css @@ -0,0 +1,25 @@ +.h-4-x-large-size-field { + width: 250px; +} + +.h-4-xx-large-size-field { + width: 500px; +} + + + +.h-4-xx-large-size-field, .h-4-x-large-size-field { + height: 1.5em; + /* color: #040505; */ + background-color: #444; + font-size: 14px; + line-height: 14px; + font-family: FF Mark; + /* text-align: center; */ + margin-left: 7px; + margin-right: 7px; + padding-left: 7px !important; + padding-right: 7px !important; + padding-bottom: 7px !important; + box-sizing: border-box; +} \ No newline at end of file diff --git a/client/stylesheets/monitorVisitations.css b/client/stylesheets/monitorVisitations.css new file mode 100644 index 0000000..0e5b7ac --- /dev/null +++ b/client/stylesheets/monitorVisitations.css @@ -0,0 +1,101 @@ +/* -- REMOVE ARROWS AND SPINNERS (so the story text can look cleaner) */ + +/* Chrome, Safari, Edge, Opera */ +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +/* Firefox */ +input[type=number] { + -moz-appearance: textfield; +} + +.story-form { + display: flex; + /* grid-row-gap: 0; */ + /* align-items: center; */ +} + +.story-content { + font-size: 14px; + letter-spacing: 0; + display: inline-block; + /* font-family: 'FF Mark'; */ +} + +.story-form-text { + +} + +.story-form-input { + /* so its one line */ + display: inline-flex; + /* so the input text is centered with the story-text */ + /* bottom: -1rem; */ + /* so each line has space between them */ + margin-bottom: 1rem; + position: relative; +} + +.blue-line-border { + border: 0 !important; + border-top-color: currentcolor; + border-top-style: none; + border-top-width: 0px; + border-right-color: currentcolor; + border-right-style: none; + border-right-width: 0px; + border-bottom-color: currentcolor; + border-bottom-style: none; + border-bottom-width: 0px; + border-left-color: currentcolor; + border-left-style: none; + border-left-width: 0px; + border-image-outset: 0; + border-image-repeat: stretch; + border-image-slice: 100%; + border-image-source: none; + border-image-width: 1; + border-radius: 0 !important; + border-bottom: 2px solid #145bff !important; +} + +/* small horizontal size for number fields*/ +.h-4-light-age { + width: 70px; +} + +.h-4-large-size-field, .h-4-light-age, .h-4-mid-size-field, .h-4-x-large-size-field { + height: 1.5em; + /* color: #040505; */ + background-color: #444; + font-size: 14px; + line-height: 14px; + font-family: FF Mark; + text-align: center; + margin-left: 7px; + margin-right: 7px; + padding-left: 7px !important; + padding-right: 7px !important; + padding-bottom: 7px !important; + box-sizing: border-box; +} + + /* changing bootstrap progress to have a small margin all around */ +.progress { + margin-top: 5px; + margin-bottom: 5px; +} + +.progress-container-focused { + background-color: #04AA6D; + margin: 2px 2px 2px 2px; +} + +td { + padding-left: 5px; + padding-right: 5px; +} + diff --git a/client/stylesheets/style.css b/client/stylesheets/style.css index b21f013..1f33da3 100644 --- a/client/stylesheets/style.css +++ b/client/stylesheets/style.css @@ -218,6 +218,18 @@ body { .topcontent { grid-area: topcontent; + display: grid; + grid-gap: 5px; + grid-template-columns: 1fr 1fr; + grid-template-areas: "monitorvisitations interactionreflection" +} + +.monitorvisitations { + grid-area: monitorvisitations; +} + +.interactionreflection{ + grid-area: interactionreflection; } .header { @@ -239,9 +251,10 @@ body { grid-gap: 5px; grid-template-columns: 1fr 6fr; /* related to blockly-div and feature-list */ - grid-template-rows: 50vh auto; + grid-template-rows: auto 50vh auto; grid-template-areas: "sidebar topcontent" + "sidebar workspace" "bottomcontent bottomcontent"; background-color: #fff; color: #444; @@ -289,7 +302,7 @@ body { } .feature-list { - height: 46vh; + height: 63vh; overflow: scroll; } diff --git a/client/templates/blockly.js b/client/templates/blockly.js index 256a4c8..3f6613d 100644 --- a/client/templates/blockly.js +++ b/client/templates/blockly.js @@ -1,5 +1,6 @@ import Blockly from 'blockly'; -import {applyDetector} from "../../lib/detectors/detectors"; +import { Concept } from 'pos/lexicon'; +import {applyDetector, setOfContextFeaturesInBlockly, splitVarDeclarationAndRules} from "../../lib/detectors/detectors"; export let WORKSPACE; @@ -21,6 +22,11 @@ Template.blockly.rendered = function() { WORKSPACE.addChangeListener(function (event) { let code = Blockly.JavaScript.workspaceToCode(WORKSPACE); document.getElementById('compiledBlockly').value = code; + + let conceptExpressionDefinition = new ConceptExpressionDefinition(); + conceptExpressionDefinition.update(code); + console.log('after update: ', conceptExpressionDefinition.variableDeclaration); + compiledBlocklyDep.changed(); if (event.element == "comment") { @@ -38,11 +44,35 @@ Template.blockly.rendered = function() { } } }); + + // Initialize a top-level concept variable for the concept expression + let detectorDescription = $('input[name=detectorname]').val() || 'SITUATION' + ReflectAndExpand.createConceptVariable(detectorDescription); }; +export class ConceptExpressionDefinition { + // Singleton-method + constructor() { + if (ConceptExpressionDefinition._instance) { + return ConceptExpressionDefinition._instance; + } + ConceptExpressionDefinition._instance = this; + this.variableDeclaration = null; + this.rules = null; + } + + update(compiledBlocklyValue) { + [this.variableDeclaration, this.rules] = splitVarDeclarationAndRules(compiledBlocklyValue); + + } + allFeatures() { + return setOfContextFeaturesInBlockly(this.variableDeclaration, this.rules); + } +} + export class ReflectAndExpand { static showReflectPrompt(block) { - blockName = ReflectAndExpand.parseBlockName(block); + let blockName = ReflectAndExpand.parseBlockName(block); if (blockName) { let detectorDescription = $('input[name=detectorname]').val() block.setCommentText(ReflectAndExpand.reflectPromptText(blockName, detectorDescription)); @@ -54,7 +84,7 @@ export class ReflectAndExpand { } static parseBlockName(block) { if (block.getField('VAR')) { - blockName = block.getField('VAR').textContent_.data + let blockName = block.getField('VAR').textContent_.data return blockName; } } @@ -64,7 +94,7 @@ export class ReflectAndExpand { return abstractConcept; } static activateExpander(block, commentText) { - abstractConcept = ReflectAndExpand.parseReflect(commentText); + let abstractConcept = ReflectAndExpand.parseReflect(commentText); block.setCommentText(commentText + ReflectAndExpand.expandPromptText(abstractConcept)); ReflectAndExpand.createConceptVariable(abstractConcept); } @@ -102,8 +132,8 @@ export const mockTestDetector = function (userAffordances, varDecl, rules) { export const defaultToolbox = function () { let toolbox = {}; - toolbox["weather"] = defaultToolboxWeather(); - toolbox["time"] = defaultToolboxTimeOfDay() + defaultToolboxTimeOfWeek() + defaultToolboxTimeZone(); + // toolbox["weather"] = defaultToolboxWeather(); + // toolbox["time"] = defaultToolboxTimeOfDay() + defaultToolboxTimeOfWeek() + defaultToolboxTimeZone(); toolbox["operators"] = defaultToolboxOperators(); toolbox["variables"] = defaultToolboxVariables(); return toolbox; @@ -115,11 +145,15 @@ export const stringifyToolboxTree = function(toolboxTree) { string += toolboxTree["discoveries"]; string += ''; } - string += toolboxTree["placeCategories"]; - string += ''; - string += toolboxTree["weather"]; - string += toolboxTree["time"]; - string += ''; + if (toolboxTree.hasOwnProperty("weather")) { + string += toolboxTree["weather"]; + string += ''; + } + if (toolboxTree.hasOwnProperty("time")) { + string += toolboxTree["time"]; + string += ''; + } + // string += toolboxTree["placeCategories"]; string += toolboxTree["operators"]; string += toolboxTree["variables"]; string += ""; @@ -184,6 +218,10 @@ export const createAndBlock = function(a, b) { return createLogicOperationBlock('AND', a, b); } +export const createNotBlock = function(a) { + return `${a}` +} + export const createMultiVarOrBlock = function(abc) { if (abc.length === 1) { return createGetVariable(abc[0]); @@ -337,13 +375,14 @@ const defaultToolboxTimeZone = function() { const defaultToolboxOperators = function() { return wrapBlocksInCategory("and, or, not, =", - createAndBlock("", "") + + createOrBlock(createOrBlock("",""),createOrBlock("","")) + createOrBlock("", "") + - '' + - '' + - createOrBlock(createOrBlock("",""), "") + - createOrBlock(createOrBlock("",""), - createOrBlock("",""))); + createAndBlock("", createNotBlock("")) + + createAndBlock("", "") + + createNotBlock(""), + // '' + + // createOrBlock(createOrBlock("",""), "") + ); }; const defaultToolboxVariables = function() { diff --git a/client/templates/cooccurances/search_cooccurances.html b/client/templates/cooccurances/search_cooccurances.html new file mode 100644 index 0000000..5285b92 --- /dev/null +++ b/client/templates/cooccurances/search_cooccurances.html @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/client/templates/cooccurances/search_cooccurances.js b/client/templates/cooccurances/search_cooccurances.js new file mode 100644 index 0000000..b3e10de --- /dev/null +++ b/client/templates/cooccurances/search_cooccurances.js @@ -0,0 +1,49 @@ +import { Router } from 'meteor/iron:router'; +import Blockly from 'blockly'; +import {getSelectPlaceTag} from '../example_situation_search'; +import {Cooccurances} from '../../../lib/collections/collections' + +import { + WORKSPACE, + addReflectionPromptToBlocks, + createGetVariable, + wrapBlocksInXml, +} from "../blockly"; + +Template.searchCooccurances.onCreated(function() { + this.autorun(() => { + this.subscribe('Cooccurances'); + }); +}); + +Template.searchCooccurances.helpers({ + 'cooccuringCategories'() { + const category = Session.get('placeTagToAnalyze'); + if (category) { + const res = Cooccurances.findOne({category: category}) + return res.cooccurances; + } + }, +}) + +Template.searchCooccurances.events({ + 'submit form#cooccurances': function(e, target) { + e.preventDefault(); + const selectedPlaceTag = getSelectPlaceTag() + Session.set('placeTagToAnalyze', selectedPlaceTag) // form input can get lost + Meteor.call('searchCooccurances', {category: selectedPlaceTag}); + }, + 'click .btn-add-cat': function(e) { + const cat2add = e.target.closest('li').getAttribute('placeCategory'); + + let block = createGetVariable(cat2add); + let blocks = Blockly.Xml.textToDom(wrapBlocksInXml(block)); + if (blocks.firstElementChild) { + Blockly.Xml.appendDomToWorkspace(blocks, WORKSPACE); + } + const baseline = Router.current().params.query.variant == 'B'; + if (!baseline) { + addReflectionPromptToBlocks(); + } + }, +}) diff --git a/client/templates/detectorInputOutput.js b/client/templates/detectorInputOutput.js index 91c9c79..d79f4a9 100644 --- a/client/templates/detectorInputOutput.js +++ b/client/templates/detectorInputOutput.js @@ -1,5 +1,4 @@ import {Detectors} from "../../lib/collections/collections"; -import {addReflectionPromptToBlocks} from "./blockly"; import {splitVarDeclarationAndRules} from "../../lib/detectors/detectors"; Template.detectorInputOutput.onCreated(function() { @@ -39,9 +38,6 @@ Template.detectorInputOutput.helpers({ }); Template.detectorInputOutput.events({ - // 'click #show-abstraction-prompt': function(e) { - // addReflectionPromptToBlocks(); - // }, 'submit form': function(e) { e.preventDefault(); let code = $('#compiledBlockly').val(); diff --git a/client/templates/example_situation_search.html b/client/templates/example_situation_search.html index 9267f46..1c129b9 100644 --- a/client/templates/example_situation_search.html +++ b/client/templates/example_situation_search.html @@ -4,10 +4,10 @@

View Example Places

{{> selectPlaceDropdown}}
- +
@@ -37,22 +37,29 @@

View Example Places

@@ -164,7 +174,7 @@

+ + \ No newline at end of file diff --git a/client/templates/interactionReflection.html b/client/templates/interactionReflection.html new file mode 100644 index 0000000..69b2b0e --- /dev/null +++ b/client/templates/interactionReflection.html @@ -0,0 +1,62 @@ + \ No newline at end of file diff --git a/client/templates/interactionReflection.js b/client/templates/interactionReflection.js new file mode 100644 index 0000000..e78734d --- /dev/null +++ b/client/templates/interactionReflection.js @@ -0,0 +1,69 @@ +import {ReactiveDict} from 'meteor/reactive-dict'; + +const pos = require('pos') +const lexer = new pos.Lexer(); +const tagger = new pos.Tagger(); + +Template.interactionReflection.onCreated(function() { + this.state = new ReactiveDict(); + this.state.setDefault({ + verbs: [], + adjectives: [], + nouns: [], + coreActions: "these core actions", + coreQualities: "these core qualities", + similarActions: "other similar actions", + }) +}); + +Template.interactionReflection.helpers({ + + parsedVerbs() { + const instance = Template.instance(); + return instance.state.get('verbs'); + }, + + coreActions() { + const instance = Template.instance(); + return instance.state.get('coreActions'); + }, + + coreQualities() { + const instance = Template.instance(); + return instance.state.get('coreQualities'); + }, + + similarActions() { + const instance = Template.instance(); + return instance.state.get('similarActions'); + } +}); + +Template.interactionReflection.events({ + 'change #oce-description': function(e) { + const description = e.target.value; + console.log(description); + const words = lexer.lex(description); + const taggedWords = tagger.tag(words); + + const verbs = taggedWords.filter(word => ['VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ'].includes(word[1])); + + const instance = Template.instance(); + instance.state.set('verbs', verbs.map(word => word[0])); + }, + 'change #input-actions': function(e) { + const coreActions = e.target.value; + const instance = Template.instance(); + instance.state.set('coreActions', coreActions); + }, + 'change #input-qualities': function(e) { + const coreQualities = e.target.value; + const instance = Template.instance(); + instance.state.set('coreQualities', coreQualities); + }, + 'change #expand-actions': function(e) { + const similarActions = e.target.value; + const instance = Template.instance(); + instance.state.set('similarActions', similarActions); + } +}) \ No newline at end of file diff --git a/client/templates/visitations/monitorVisitations.html b/client/templates/visitations/monitorVisitations.html new file mode 100644 index 0000000..83519e7 --- /dev/null +++ b/client/templates/visitations/monitorVisitations.html @@ -0,0 +1,114 @@ + + + \ No newline at end of file diff --git a/client/templates/visitations/monitorVisitations.js b/client/templates/visitations/monitorVisitations.js new file mode 100644 index 0000000..77c9d49 --- /dev/null +++ b/client/templates/visitations/monitorVisitations.js @@ -0,0 +1,214 @@ +import { compiledBlocklyDep } from '../blockly' +import { VisitationModelCheckins, VisitationModelUsers } from "../../../lib/collections/collections"; +import { totalCheckins, numFSQUsersPerCity } from "./visitations"; + +Template.monitorVisitations.onCreated(function (){ + // this.autorun(function() { + // if (Session.get('detectorId')) { + // this.subscribe('VisitationModelUsers', Session.get('detectorId')); + // this.subscribe('VisitationModelCheckins'); + // } + // }); +}) + +Template.monitorVisitations.onRendered(function() { + const daysPeriod = Number(document.getElementById('daysPeriod').value); + Session.set('daysPeriod', daysPeriod); + const numUsersInCity = Number(document.getElementById('numUsersInCity').value); + Session.set('numUsersInCity', numUsersInCity); + let probabilityOfVisitationHistory = Object.assign({}, numFSQUsersPerCity); + Object.keys(probabilityOfVisitationHistory).forEach((city) => { + probabilityOfVisitationHistory[city] = null; + }); + Session.set('probabilityOfVisitationHistory', probabilityOfVisitationHistory); + Session.set('probMaxReferenceLimit', 25); +}); + +Template.monitorVisitations.events({ + // city-based model events + 'change #daysPeriod'(event) { + Session.set('daysPeriod', Number(event.target.value)); + }, + 'change #numUsersInCity'(event) { + Session.set('numUsersInCity', Number(event.target.value)); + }, + 'click tr'(event) { + if (event.target.className == "city-label") { + Session.set('cityForSimulation', event.target.innerHTML); + } + }, + 'change #probMaxReferenceLimit'(event) { + limit = event.target.value; + Session.set('probMaxReferenceLimit', limit); + }, + 'click #saveProbabilityHistory'(event) { + // TODO(rlouie): finish function + let probabilityOfVisitationHistory = Session.get('probabilityOfVisitationHistory'); + Object.keys(probabilityOfVisitationHistory).forEach((city) => { + const numTotalCheckins = totalCheckins(city); + const numTotalUsersInCity = numFSQUsersPerCity[city]; + const totalDays = 365 // data collected over 1 - 1.5 years + const daysPeriod = Session.get('daysPeriod'); + const numUsersInCity = Session.get('numUsersInCity'); + const prob = calculateProbabilityOfVisitation(numTotalCheckins, numTotalUsersInCity, totalDays, daysPeriod, numUsersInCity); + const result = prob * 100; + probabilityOfVisitationHistory[city] = result; + }); + console.log(probabilityOfVisitationHistory); + Session.set('probabilityOfVisitationHistory', probabilityOfVisitationHistory); + }, +}); + +export const calculateProbabilityOfVisitation = (numTotalCheckinsInCity, numTotalUsersInCity, totalDays, daysPeriod, numUsersInCity) => { + // e.g., ~2000 checkins at churches + // you have 52 periods (a week) in a year (360 / 7). + // So you have ~40 people visiting a church on any given week, for the entire population in Foursquare. + const expectedNumVisitsForPeriodForAllUsers = numTotalCheckinsInCity / (totalDays / daysPeriod) + + // But imagine we have a user population that is a fraction of FSQ, e.g., 1% + // e.g., 10 people in our deploy population, but FSQ had 1000 people. + // So what is expected number of people from YOUR population to visit churches? + // Well 0.01 * 40 = 0.4 people visiting a church on any given week. + // Or 40% chance someone will visit a church on any given week. + const expectedVisitsForUserSubset = (numUsersInCity / numTotalUsersInCity) * expectedNumVisitsForPeriodForAllUsers; + return Math.min(1, expectedVisitsForUserSubset); +} + +Template.monitorVisitations.helpers({ + // ------ CITY-BASED MODEL HELPERS ------ + cityChoices() { + return Object.keys(numFSQUsersPerCity); + }, + totalCheckinsForCity() { + const city = Session.get('cityForSimulation'); + if (!city) { + return; + } + + return totalCheckins(city); + }, + + probabilityOfVisitation(city) { + const numTotalCheckins = totalCheckins(city); + const numTotalUsersInCity = numFSQUsersPerCity[city]; + const totalDays = 365 // data collected over 1 - 1.5 years + const daysPeriod = Session.get('daysPeriod'); + const numUsersInCity = Session.get('numUsersInCity'); + + const prob = calculateProbabilityOfVisitation(numTotalCheckins, numTotalUsersInCity, totalDays, daysPeriod, numUsersInCity); + const result = prob * 100; + return result.toFixed(1); + }, + + progressContainerClass(city) { + // if its the city in focus + if (Session.get('cityForSimulation') === city) { + return "progress-container-focused"; + } + else { + return "progress-container-unfocused"; + } + }, + + progressBarActiveStyling(city) { + if (Session.get('cityForSimulation') === city) { + return "progress-bar-striped active" + } + else { + return "" + } + }, + + progressBarWidth(prob) { + const referenceValue = Session.get('probMaxReferenceLimit'); + const result = prob / referenceValue * 100; + return result.toFixed(1); + }, + + progressHasRegressed(city) { + // NOTE: for this helper to re-rerun, need to duplicate the compile blockly dependencies + const numTotalCheckins = totalCheckins(city); + const numTotalUsersInCity = numFSQUsersPerCity[city]; + const totalDays = 365 // data collected over 1 - 1.5 years + const daysPeriod = Session.get('daysPeriod'); + const numUsersInCity = Session.get('numUsersInCity'); + const prob = calculateProbabilityOfVisitation(numTotalCheckins, numTotalUsersInCity, totalDays, daysPeriod, numUsersInCity); + const currentProb = prob * 100; + + const probabilityOfVisitationHistory = Session.get('probabilityOfVisitationHistory'); + const oldProb = probabilityOfVisitationHistory[city]; + + return currentProb <= oldProb; + }, + + oldProbability(city) { + const probabilityOfVisitationHistory = Session.get('probabilityOfVisitationHistory'); + if (!probabilityOfVisitationHistory) { + return null; + } + const oldProb = probabilityOfVisitationHistory[city]; + if (!oldProb) { + return null; + } + return oldProb.toFixed(1); + }, + + regressionDifference(currentProb, oldProb) { + const result = oldProb - currentProb; + return result.toFixed(1); + }, + + improvedDifference(currentProb, oldProb) { + const result = currentProb - oldProb; + return result.toFixed(1); + }, +}) + +Template.personBasedMonitor.events({ + // person-based model events + 'click #samplePersonModel'(event) { + const personLimitElement = document.getElementById('personLimit') + const detectorId = Session.get('detectorId') + if (!personLimitElement || !detectorId) { + console.warn("samplePersonModel submission failed") + return; + } + Meteor.call('sampleRandomUsers', { + 'limit': Number(personLimitElement.value), + 'detectorId': detectorId + }); + }, + 'change #uidForSimulation'(event) { + uid = event.target.value; + Session.set('uidForSimulation', uid); + }, +}); + +Template.personBasedMonitor.helpers({ + // ------ PERSON-BASED HELPERS ------- + displayPersonBased() { + // for now, do not focus on person based models + return false; + }, + sampledUserIds() { + const detectorId = Session.get('detectorId') + if (detectorId) { + userObject = VisitationModelUsers.findOne({'_id': detectorId}); + if (userObject) { + return userObject.users; + } + } + }, + uidForSimulation() { + return Session.get('uidForSimulation'); + }, + detectorLikelihood(uid) { + // Get a model of visitations (here based on a single user) + const checkinData = VisitationModelCheckins.findOne({'uid': Number(uid)}); + // Find the location categories in the construction + + // Find the corresponding categories in the model of visitations + + // Output the results + }, +}); \ No newline at end of file diff --git a/client/templates/visitations/visitations.js b/client/templates/visitations/visitations.js new file mode 100644 index 0000000..9b83a33 --- /dev/null +++ b/client/templates/visitations/visitations.js @@ -0,0 +1,46 @@ +import { compiledBlocklyDep, ConceptExpressionDefinition } from '../blockly'; + +export const yelp2foursquare = require('../../../public/yelp2foursquare.json'); +const checkin_by_category_losangeles = require('../../../public/checkins_losangeles_by_category.json'); +const checkin_by_category_chicago = require('../../../public/checkins_chicago_by_category.json'); +const checkin_by_category_phoenix = require('../../../public/checkins_phoenix_by_category.json'); +const checkin_by_category_memphis = require('../../../public/checkins_memphis_by_category.json'); +const checkin_by_category_elpaso = require('../../../public/checkins_elpaso_by_category.json'); +const checkin_by_category_portland = require('../../../public/checkins_portland_by_category.json'); +export const checkin_by_category_city = { + 'Chicago': checkin_by_category_chicago, + 'Los Angeles': checkin_by_category_losangeles, + 'Phoenix': checkin_by_category_phoenix, + 'Memphis': checkin_by_category_memphis, + 'El Paso': checkin_by_category_elpaso, + 'Portland': checkin_by_category_portland, +}; + +export const numFSQUsersPerCity = { + 'Los Angeles': 9136, + 'Phoenix': 3120, + 'Chicago': 6885, + 'Memphis': 1163, + 'El Paso': 575, + 'Portland': 1825, +}; +/** + * + * @param {*} city + * @returns total checkins, by summing up all checkin stats for each of the categories in the concept expression + */ +export const totalCheckins = (city) => { + compiledBlocklyDep.depend(); + let conceptExpressionDefinition = new ConceptExpressionDefinition(); + const placeFeatureNames = conceptExpressionDefinition.allFeatures(); + + const checkin_by_category = checkin_by_category_city[city] + let totalCheckinCount = 0; + // Get corresponding Foursquare checkin data for each place category + placeFeatureNames.forEach(category => { + const fsq_feature = yelp2foursquare[category]; + // get the foursquare data, or set it to default 0 checkins + totalCheckinCount += checkin_by_category[fsq_feature] || 0; + }); + return totalCheckinCount; +}; diff --git a/client/templates/workspace.html b/client/templates/workspace.html index f0bd473..3d7c82b 100644 --- a/client/templates/workspace.html +++ b/client/templates/workspace.html @@ -23,11 +23,20 @@ +
+
+ {{> monitorVisitations}} +
+
+ {{> interactionReflection}} +
+
+ -
+
{{> detectorInputOutput}} {{> blockly}}
@@ -35,6 +44,7 @@
{{> viewExamplePlaces}} +
{{#if baseline}} {{else}} diff --git a/client/templates/workspace.js b/client/templates/workspace.js index 2989b25..27ef32a 100644 --- a/client/templates/workspace.js +++ b/client/templates/workspace.js @@ -1,4 +1,9 @@ import { WORKSPACE } from "./blockly"; + +Template.workspace.onCreated(function() { + Session.set('cityForSimulation') +}); + Template.workspace.helpers({ baseline() { const baseline = Router.current().params.query.variant == 'B'; diff --git a/lib/collections/collections.js b/lib/collections/collections.js index 5c3f70b..fe3f4a8 100644 --- a/lib/collections/collections.js +++ b/lib/collections/collections.js @@ -36,3 +36,7 @@ export const LowLevelDetectors = new Mongo.Collection('LowLevelDetectors'); LowLevelDetectors.SimpleTextSearchResults = new Mongo.Collection('SimpleTextSearchResults'); export const ExampleSituations = new Mongo.Collection('ExampleSituations'); + +export const Cooccurances = new Mongo.Collection('Cooccurances'); +export const VisitationModelUsers = new Mongo.Collection('VisitationModelUsers'); +export const VisitationModelCheckins = new Mongo.Collection('VisitationModelCheckins'); \ No newline at end of file diff --git a/lib/config.js b/lib/config.js index fb7fe9b..4520058 100644 --- a/lib/config.js +++ b/lib/config.js @@ -4,5 +4,7 @@ export const AUTH = { }; export const CONFIG = { + AFFINDER_SEARCH_URL: process.env.AFFINDER_SEARCH_URL || "http://127.0.0.1:8000", + AFFINDER_VISITATION_URL: process.env.AFFINDER_VISITATION_URL || "http://affinder-visitation-model.herokuapp.com", RESET: true -}; \ No newline at end of file +}; diff --git a/lib/detectors/detectors.js b/lib/detectors/detectors.js index e3b9f22..99c16dd 100644 --- a/lib/detectors/detectors.js +++ b/lib/detectors/detectors.js @@ -41,7 +41,7 @@ export const matchAffordancesWithDetector = function (affordances, detectorId) { */ export const applyDetector = function (userAffordances, varDecl, rules) { let affordancesAsJavascriptVars = keyvalues2vardecl(userAffordances); - console.log("affordancesAsJavascriptVars: ", affordancesAsJavascriptVars); + // console.log("affordancesAsJavascriptVars: ", affordancesAsJavascriptVars); if (!Array.isArray(varDecl)) { varDecl = [varDecl]; @@ -50,7 +50,7 @@ export const applyDetector = function (userAffordances, varDecl, rules) { .concat(rules) .join('\n'); - console.log("mergedAffordancesWithRules: ", mergedAffordancesWithRules); + // console.log("mergedAffordancesWithRules: ", mergedAffordancesWithRules); try { return eval(mergedAffordancesWithRules); } catch (err) { @@ -88,7 +88,6 @@ export const keyvalues2vardecl = function (obj) { }; export const isolateConceptVariableDetector = function(varDecl, rules, conceptVariable) { - let variableNames = setOfVariableNames(varDecl); let rulesToExecute = isolateRecursiveHelper(variableNames, rules, conceptVariable, [`${conceptVariable};`]).reverse(); @@ -155,14 +154,14 @@ const filterFunctionalLines = (lines_w_comment) => { } export const getConceptVariables = (rules) => { - console.log("rules: ", rules); + // console.log("rules: ", rules); if (!Array.isArray(rules)) { - console.log("rules is not an array"); + // console.log("rules is not an array"); return [[], []]; } if (rules.length < 1) { - console.log("rules is empty array"); + // console.log("rules is empty array"); return [[], []]; } @@ -200,22 +199,22 @@ export const variablesInRule = (rule) => { /* must read the full set of context features in the blockly workspace */ export const setOfContextFeaturesInBlockly = (varDecl, rules) => { let variableNames = setOfVariableNames(varDecl); - console.log("variableNames: ", variableNames); + // console.log("variableNames: ", variableNames); let [conceptVariableNames, conceptVariableRules] = getConceptVariables(rules); - console.log("concept variables: ", conceptVariableNames); + // console.log("concept variables: ", conceptVariableNames); let contextFeatures = variableNames.filter((variable) => { return !conceptVariableNames.includes(variable) }); - console.log("contextFeatures: ", contextFeatures); + // console.log("contextFeatures: ", contextFeatures); return contextFeatures; } export const setOfVariableNames = (varDecl) => { - console.log("varDecl: ", varDecl); - if (varDecl === undefined) { + // console.log("varDecl: ", varDecl); + if (!varDecl) { return []; } @@ -225,7 +224,7 @@ export const setOfVariableNames = (varDecl) => { varDecl.length - 1 // skip ending ";" ); let variablesSplit = varDeclClean.split(', '); - console.log('variablesSplit: ', variablesSplit); + // console.log('variablesSplit: ', variablesSplit); return variablesSplit; // if (variablesSplit.length == 1) { // return variablesSplit; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index fa92176..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1394 +0,0 @@ -{ - "name": "affinder", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "requires": { - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - } - } - }, - "@tonybadguy/call-me-maybe": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@tonybadguy/call-me-maybe/-/call-me-maybe-2.1.1.tgz", - "integrity": "sha512-Gc7G5o5Wd5I0d3ohzoZmqb1Jowr8sGURcFmGsoqiPk2ydFjwtYXRQTb4eYoJ1dZqdBlQGHRmL5mmbiMm4Kl2/w==", - "requires": { - "caseless": "^0.11.0", - "error": "^7.0.2", - "small-request": "^2.1.0", - "string-template": "^1.0.0" - }, - "dependencies": { - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha512-ODLXH644w9C2fMPAm7bMDQ3GRvipZWZfKc+8As6hIadRIelE0n0xZuN38NS6kiK3KPEVrpymmQD8bvncAHWQkQ==" - } - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - } - } - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==" - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "blockly": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-8.0.3.tgz", - "integrity": "sha512-6sufD+HiKjLk8BtF/mAZagnwr41TQqcj74W1m+qB4pFttXrSWiSsWRsBnJYRMxuAO7iuLcehaQhBbCs3LkoLVw==", - "requires": { - "jsdom": "15.2.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "error": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "requires": { - "string-template": "~0.2.1" - }, - "dependencies": { - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" - } - } - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "message-box": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", - "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", - "requires": { - "lodash.template": "^4.5.0" - } - }, - "meteor-node-stubs": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-0.2.11.tgz", - "integrity": "sha1-cV5Owc6IgkiylgThbQkiVrDLfjQ=", - "requires": { - "assert": "^1.4.1", - "browserify-zlib": "^0.1.4", - "buffer": "^4.9.1", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.7", - "events": "^1.1.1", - "http-browserify": "^1.7.0", - "https-browserify": "0.0.1", - "os-browserify": "^0.2.1", - "path-browserify": "0.0.0", - "process": "^0.11.9", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "readable-stream": "git+https://github.com/meteor/readable-stream.git", - "stream-browserify": "^2.0.1", - "string_decoder": "^1.0.1", - "timers-browserify": "^1.4.2", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "Base64": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=" - }, - "asn1.js": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.0.tgz", - "integrity": "sha1-9xoSQ/PnnUbXsH1/v0gk7nOvBUo=", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "base64-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", - "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" - }, - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "brorand": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.6.tgz", - "integrity": "sha1-QChwa5FfkfezSaLgvzw3YDnSFuU=" - }, - "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "requires": { - "buffer-xor": "^1.0.2", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", - "integrity": "sha1-EHc5EMPCBtVCCkaq2GlPgguFlo8=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "~0.2.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "cipher-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", - "requires": { - "inherits": "^2.0.1" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", - "integrity": "sha1-USEAYte7dHn2xlu0GpIgix1hq60=", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^1.0.0", - "sha.js": "^2.3.6" - } - }, - "create-hmac": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz", - "integrity": "sha1-0/tLolPriz9W456i+8uK90e9MXA=", - "requires": { - "create-hash": "^1.1.0", - "inherits": "^2.0.1" - } - }, - "crypto-browserify": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", - "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" - }, - "elliptic": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz", - "integrity": "sha1-5MgeCCnPCmWrcOmYuCMnI7XBvEg=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "requires": { - "create-hash": "^1.1.1" - } - }, - "hash.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", - "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=", - "requires": { - "inherits": "^2.0.1" - } - }, - "http-browserify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", - "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", - "requires": { - "Base64": "~0.2.0", - "inherits": "~2.0.1" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "parse-asn1": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", - "integrity": "sha1-NQYPbVAV03Yox3D04JGgtaJ4vCM=", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "pbkdf2": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.9.tgz", - "integrity": "sha1-8sSyWmAAWLPDdzwIbDfbvuH/5pM=", - "requires": { - "create-hmac": "^1.1.2" - } - }, - "process": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.9.tgz", - "integrity": "sha1-e9WtIapiU+fahoImTx4R0RwDGME=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "randombytes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", - "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" - }, - "readable-stream": { - "version": "git+https://github.com/meteor/readable-stream.git#2e9112d7d31a2af6e0682db0e18679b1e5fd4694", - "from": "git+https://github.com/meteor/readable-stream.git", - "requires": { - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.0", - "util-deprecate": "~1.0.1" - } - }, - "ripemd160": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz", - "integrity": "sha1-k6S71JQrxXS2mo+lfHHeEOzKfW4=" - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "requires": { - "inherits": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "requires": { - "process": "~0.11.0" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - } - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mongo-object": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", - "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" - }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/request-function/-/request-function-2.0.0.tgz", - "integrity": "sha512-tw6kEYJp+JPLEjcEBFEtAvtDFUHY50LtrSAJHKXaos2+geAXSKjKNdA2wwTsqDq8YKl1i3+TJ60AjUb5exaM8A==", - "requires": { - "error": "^7.0.2" - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "requires": { - "xmlchars": "^2.1.1" - } - }, - "simpl-schema": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.12.2.tgz", - "integrity": "sha512-FaisAjfJEt7Ie7K39wNqb/0F7FQ1q7yXmZcNa5JEBiPA9hIt4MpWMouL9mLqNB89alGpZAEiU7U9BelDxRqCVg==", - "requires": { - "clone": "^2.1.2", - "message-box": "^0.2.7", - "mongo-object": "^0.1.4" - } - }, - "simple-schema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-schema/-/simple-schema-1.1.0.tgz", - "integrity": "sha512-b1RYa+g2yU+jUk8bqs4qeRlX6AgCXrVOhigTGlXeZ0x4zZeEl6m/peyTocTaYlMAhT2d+9D3Cc6iTOXvLeUQCg==" - }, - "small-request": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/small-request/-/small-request-2.1.0.tgz", - "integrity": "sha512-tQlteNci7wsIsmt7KoyZj0izeuY718NBeKVhJdWxTmQHKsJp4INUhWLTJ000EzNu9p41TqbGPOrSl0wroK581Q==", - "requires": { - "request-function": "^2.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==" - }, - "string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "requires": { - "punycode": "^2.1.0" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "yelp-fusion": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/yelp-fusion/-/yelp-fusion-3.0.0.tgz", - "integrity": "sha512-Os4A0+v980W8sm4kurUpK4E0FMS5hvtA0//g7Jb9QI2gS7WfX/1Zw12S792LKt3YM/qJNow7XIR2g3bONlX/fg==", - "requires": { - "@tonybadguy/call-me-maybe": "^2.1.1" - } - } - } -} diff --git a/package.json b/package.json index fd62ba1..6b30558 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "babel-runtime": "^6.20.0", "blockly": "^8.0.3", "meteor-node-stubs": "~0.2.4", - "request": "^2.83.0", - "simpl-schema": "^1.5.5", + "pos": "^0.4.2", + "request": "^2.88.2", + "simpl-schema": "^1.12.0", "simple-schema": "^1.1.0", "yelp-fusion": "^3.0.0" } diff --git a/public/checkins_chicago_by_category.json b/public/checkins_chicago_by_category.json new file mode 100644 index 0000000..5aa000c --- /dev/null +++ b/public/checkins_chicago_by_category.json @@ -0,0 +1 @@ +{"Home (private)": 10853.0, "Bar": 9159.0, "Train Station": 7611.0, "Coffee Shop": 6527.0, "Office": 5815.0, "Gym": 4885.0, "Grocery Store": 4237.0, "American Restaurant": 3897.0, "Residential Building (Apartment / Condo)": 3877.0, "Building": 3376.0, "Hotel": 3217.0, "Department Store": 3201.0, "Mexican Restaurant": 2907.0, "Neighborhood": 2764.0, "Airport": 2456.0, "Sports Bar": 2240.0, "Pizza Place": 2150.0, "Drugstore / Pharmacy": 2113.0, "Fast Food Restaurant": 2047.0, "Sandwich Place": 2031.0, "Gym / Fitness Center": 2029.0, "Park": 2019.0, "Nightclub": 1813.0, "Italian Restaurant": 1707.0, "Gay Bar": 1690.0, "Church": 1649.0, "Pub": 1616.0, "Music Venue": 1576.0, "Burger Joint": 1454.0, "Clothing Store": 1411.0, "Breakfast Spot": 1376.0, "General Entertainment": 1368.0, "Road": 1317.0, "Baseball Stadium": 1278.0, "Salon / Barbershop": 1277.0, "Mall": 1249.0, "Diner": 1216.0, "Lounge": 1201.0, "Bank": 1201.0, "Hospital": 1069.0, "Bus Station": 1059.0, "Gas Station / Garage": 1040.0, "Electronics Store": 1038.0, "Theater": 1020.0, "Convenience Store": 996.0, "Hot Dog Joint": 989.0, "Caf\u001a\u001a": 928.0, "New American Restaurant": 928.0, "Donut Shop": 885.0, "Bakery": 872.0, "Cocktail Bar": 845.0, "Sushi Restaurant": 844.0, "Movie Theater": 840.0, "Taco Place": 833.0, "Other Great Outdoors": 829.0, "General Travel": 826.0, "Bus Line": 811.0, "City": 804.0, "Asian Restaurant": 789.0, "Subway": 739.0, "College Academic Building": 734.0, "Government Building": 732.0, "Steakhouse": 730.0, "University": 718.0, "Restaurant": 718.0, "Chinese Restaurant": 671.0, "Bridge": 650.0, "Stadium": 649.0, "Dive Bar": 641.0, "Beach": 639.0, "Miscellaneous Shop": 632.0, "Multiplex": 616.0, "Seafood Restaurant": 602.0, "Ice Cream Shop": 589.0, "Doctor's Office": 563.0, "Rock Club": 555.0, "Event Space": 554.0, "School": 550.0, "Scenic Lookout": 545.0, "Tech Startup": 516.0, "Automotive Shop": 504.0, "Pier": 503.0, "Plaza": 492.0, "High School": 487.0, "Brewery": 486.0, "BBQ Joint": 480.0, "Coworking Space": 475.0, "Thai Restaurant": 446.0, "Convention Center": 425.0, "Medical Center": 422.0, "Cosmetics Shop": 415.0, "Liquor Store": 413.0, "Hardware Store": 409.0, "Art Gallery": 402.0, "Wine Bar": 402.0, "Zoo": 399.0, "Parking": 390.0, "Football Stadium": 389.0, "Vegetarian / Vegan Restaurant": 388.0, "Sporting Goods Shop": 387.0, "Yoga Studio": 382.0, "Train": 379.0, "Spa / Massage": 370.0, "Deli / Bodega": 368.0, "Shoe Store": 366.0, "French Restaurant": 356.0, "Mediterranean Restaurant": 356.0, "Post Office": 340.0, "Museum": 339.0, "Soccer Stadium": 337.0, "Performing Arts Venue": 331.0, "Beer Garden": 329.0, "Library": 326.0, "Comedy Club": 320.0, "Women's Store": 312.0, "Greek Restaurant": 311.0, "Community College": 308.0, "Platform": 304.0, "Student Center": 304.0, "Tea Room": 304.0, "Elementary School": 299.0, "Furniture / Home Store": 297.0, "History Museum": 296.0, "Speakeasy": 296.0, "Bookstore": 295.0, "Wings Joint": 293.0, "Art Museum": 291.0, "Laundry Service": 289.0, "Latin American Restaurant": 287.0, "Harbor / Marina": 287.0, "Fried Chicken Joint": 282.0, "Moving Target": 281.0, "Tanning Salon": 280.0, "Dessert Shop": 280.0, "Southern / Soul Food Restaurant": 278.0, "Historic Site": 278.0, "Gastropub": 274.0, "College Administrative Building": 268.0, "Dog Run": 267.0, "Sculpture Garden": 260.0, "Japanese Restaurant": 254.0, "Pet Store": 246.0, "Tapas Restaurant": 241.0, "Toy / Game Store": 238.0, "Whisky Bar": 237.0, "Indie Movie Theater": 228.0, "College Residence Hall": 225.0, "Karaoke Bar": 222.0, "Concert Hall": 221.0, "Indian Restaurant": 221.0, "Thrift / Vintage Store": 215.0, "Vietnamese Restaurant": 211.0, "Lake": 211.0, "Paper / Office Supplies Store": 210.0, "Juice Bar": 209.0, "Bagel Shop": 209.0, "Food Truck": 206.0, "Aquarium": 206.0, "College Arts Building": 205.0, "Courthouse": 187.0, "Bowling Alley": 187.0, "Jazz Club": 185.0, "Burrito Place": 184.0, "Boutique": 182.0, "General College & University": 179.0, "Public Art": 178.0, "Men's Store": 177.0, "Fair": 173.0, "Arts & Crafts Store": 172.0, "College Library": 169.0, "Snack Place": 168.0, "Airport Gate": 167.0, "College Gym": 164.0, "Boat or Ferry": 160.0, "Cupcake Shop": 159.0, "Light Rail": 157.0, "Record Shop": 157.0, "Candy Store": 156.0, "Garden": 155.0, "Lingerie Store": 154.0, "Bike Shop": 154.0, "Trail": 153.0, "Korean Restaurant": 152.0, "Food Court": 152.0, "Rest Area": 151.0, "Design Studio": 150.0, "Cuban Restaurant": 147.0, "Gourmet Shop": 145.0, "Pool": 143.0, "Hiking Trail": 141.0, "City Hall": 140.0, "Dentist's Office": 138.0, "Playground": 133.0, "Nail Salon": 132.0, "Law School": 132.0, "Hotel Bar": 132.0, "Middle Eastern Restaurant": 130.0, "Dance Studio": 128.0, "Ramen / Noodle House": 126.0, "Fraternity House": 122.0, "Mac & Cheese Joint": 121.0, "Airport Terminal": 119.0, "Science Museum": 117.0, "Gift Shop": 111.0, "Temple": 110.0, "Salad Place": 109.0, "Jewelry Store": 109.0, "Farmers Market": 108.0, "Monument / Landmark": 108.0, "Veterinarian": 108.0, "Video Game Store": 108.0, "Other Nightlife": 106.0, "German Restaurant": 106.0, "Accessories Store": 104.0, "Spiritual Center": 101.0, "Food & Drink Shop": 97.0, "Hobby Shop": 97.0, "Strip Club": 96.0, "Scandinavian Restaurant": 94.0, "Medical School": 94.0, "College Classroom": 93.0, "Car Wash": 93.0, "Field": 93.0, "Caribbean Restaurant": 92.0, "Professional & Other Places": 91.0, "Falafel Restaurant": 90.0, "Arcade": 90.0, "Factory": 85.0, "Baseball Field": 83.0, "Hostel": 83.0, "Video Store": 82.0, "Tattoo Parlor": 81.0, "Tennis Court": 81.0, "Casino": 80.0, "Smoke Shop": 78.0, "Soccer Field": 77.0, "Trade School": 77.0, "Martial Arts Dojo": 77.0, "Cemetery": 73.0, "Pool Hall": 72.0, "Hookah Bar": 71.0, "Cajun / Creole Restaurant": 71.0, "Racetrack": 70.0, "Basketball Court": 68.0, "Athletic & Sport": 67.0, "Optical Shop": 67.0, "Police Station": 66.0, "College Science Building": 66.0, "College Auditorium": 66.0, "Taxi": 64.0, "Spanish Restaurant": 63.0, "Piano Bar": 63.0, "Military Base": 62.0, "Travel & Transport": 61.0, "Golf Course": 61.0, "College Stadium": 61.0, "Butcher": 59.0, "Brazilian Restaurant": 58.0, "Music Store": 58.0, "College Cafeteria": 56.0, "Planetarium": 55.0, "Rental Car Location": 55.0, "Flea Market": 55.0, "Hockey Arena": 54.0, "Housing Development": 53.0, "Opera House": 52.0, "Hot Spring": 51.0, "College Communications Building": 50.0, "Antique Shop": 48.0, "Theme Park Ride / Attraction": 48.0, "Shop & Service": 48.0, "Flower Shop": 47.0, "Emergency Room": 47.0, "Eastern European Restaurant": 46.0, "Meeting Room": 46.0, "Wine Shop": 46.0, "Auditorium": 45.0, "Food": 44.0, "Dim Sum Restaurant": 44.0, "Outdoors & Recreation": 43.0, "Conference Room": 42.0, "Music School": 39.0, "Soup Place": 38.0, "Middle School": 37.0, "Frozen Yogurt": 37.0, "Mobile Phone Shop": 37.0, "Skating Rink": 36.0, "Non-Profit": 36.0, "Molecular Gastronomy Restaurant": 36.0, "Car Dealership": 35.0, "Roof Deck": 35.0, "Nightlife Spot": 35.0, "Water Park": 35.0, "Financial or Legal Service": 34.0, "Cheese Shop": 33.0, "Daycare": 32.0, "Residence": 31.0, "Animal Shelter": 31.0, "Radio Station": 31.0, "Resort": 30.0, "Embassy / Consulate": 30.0, "African Restaurant": 29.0, "Bed & Breakfast": 28.0, "Ethiopian Restaurant": 28.0, "Athletics & Sports": 28.0, "Motel": 26.0, "Arts & Entertainment": 24.0, "Winery": 24.0, "Plane": 24.0, "River": 24.0, "Voting Booth": 24.0, "College Quad": 24.0, "Assisted Living": 24.0, "Camera Store": 23.0, "College Bookstore": 23.0, "College Rec Center": 21.0, "Farm": 21.0, "Theme Park": 20.0, "College Lab": 20.0, "College Technology Building": 20.0, "Track": 19.0, "Garden Center": 18.0, "Nursery School": 18.0, "Argentinian Restaurant": 18.0, "Fire Station": 18.0, "Gym Pool": 17.0, "Kids Store": 17.0, "Market": 16.0, "Lighthouse": 15.0, "Indie Theater": 15.0, "South American Restaurant": 15.0, "Gluten-free Restaurant": 14.0, "Bridal Shop": 14.0, "Board Shop": 14.0, "Health Food Store": 14.0, "Fish Market": 12.0, "Bike Rental / Bike Share": 12.0, "Skate Park": 12.0, "Tourist Information Center": 11.0, "College Basketball Court": 11.0, "College Track": 10.0, "Storage Facility": 10.0, "Real Estate Office": 10.0, "Synagogue": 8.0, "Funeral Home": 8.0, "Peruvian Restaurant": 7.0, "Portuguese Restaurant": 7.0, "Mosque": 7.0, "Filipino Restaurant": 7.0, "Airport Food Court": 7.0, "College Soccer Field": 6.0, "Pet Service": 6.0, "College Theater": 6.0, "Volleyball Court": 6.0, "Sorority House": 6.0, "Gaming Cafe": 6.0, "Photography Lab": 5.0, "Newsstand": 5.0, "Moroccan Restaurant": 5.0, "Tennis": 5.0, "College & University": 5.0, "Caf\u001a": 5.0, "Swiss Restaurant": 4.0, "Cafeteria": 4.0, "Sake Bar": 4.0, "Travel Lounge": 3.0, "Mountain": 3.0, "Credit Union": 3.0, "Fish & Chips Shop": 3.0, "Ferry": 3.0, "Basketball Stadium": 3.0, "Laboratory": 3.0, "Hotel Pool": 3.0, "Motorcycle Shop": 3.0, "Indonesian Restaurant": 2.0, "Dumpling Restaurant": 2.0, "Ski Area": 2.0, "Campaign Office": 2.0, "College Engineering Building": 2.0, "Distillery": 2.0, "Paella Restaurant": 2.0, "Track Stadium": 2.0, "Surf Spot": 2.0, "Tailor Shop": 2.0, "Recycling Facility": 1.0, "College Math Building": 1.0, "Boarding House": 1.0, "Airport Lounge": 1.0, "Shrine": 1.0, "Castle": 1.0, "Ski Chalet": 1.0, "Campground": 1.0, "Climbing Gym": 1.0, "Turkish Restaurant": 1.0, "Volcanoes": 1.0, "Stables": 1.0, "Stable": 1.0, "College Baseball Diamond": 1.0, "Ski Trail": 1.0} \ No newline at end of file diff --git a/public/checkins_elpaso_by_category.json b/public/checkins_elpaso_by_category.json new file mode 100644 index 0000000..e16844a --- /dev/null +++ b/public/checkins_elpaso_by_category.json @@ -0,0 +1 @@ +{"Home (private)": 2826.0, "Gym": 952.0, "Bar": 740.0, "Mexican Restaurant": 726.0, "Mall": 607.0, "Residential Building (Apartment / Condo)": 587.0, "Fast Food Restaurant": 575.0, "Department Store": 557.0, "High School": 519.0, "Gas Station / Garage": 518.0, "Building": 478.0, "American Restaurant": 451.0, "Grocery Store": 447.0, "Airport": 389.0, "Office": 382.0, "Sports Bar": 353.0, "Pizza Place": 343.0, "Coffee Shop": 302.0, "Burger Joint": 301.0, "Government Building": 300.0, "Coworking Space": 273.0, "Bank": 268.0, "Bridge": 266.0, "Wings Joint": 251.0, "Hospital": 242.0, "School": 235.0, "Miscellaneous Shop": 229.0, "Gym / Fitness Center": 221.0, "Automotive Shop": 220.0, "Movie Theater": 208.0, "Hotel": 200.0, "Church": 200.0, "Clothing Store": 188.0, "Strip Club": 186.0, "Electronics Store": 180.0, "Park": 179.0, "Doctor's Office": 166.0, "Community College": 161.0, "College Classroom": 159.0, "University": 157.0, "Lounge": 156.0, "Sandwich Place": 156.0, "Multiplex": 149.0, "Chinese Restaurant": 146.0, "Gay Bar": 142.0, "Road": 141.0, "Drugstore / Pharmacy": 133.0, "BBQ Joint": 133.0, "Food & Drink Shop": 124.0, "Cocktail Bar": 123.0, "Convenience Store": 122.0, "Nightclub": 120.0, "Salon / Barbershop": 117.0, "Capitol Building": 114.0, "General College & University": 110.0, "Caf\u001a\u001a": 109.0, "Seafood Restaurant": 106.0, "Restaurant": 104.0, "Italian Restaurant": 102.0, "Sporting Goods Shop": 100.0, "Baseball Stadium": 99.0, "Taco Place": 95.0, "Neighborhood": 90.0, "College Administrative Building": 87.0, "Tattoo Parlor": 86.0, "Scenic Lookout": 84.0, "Dive Bar": 77.0, "Post Office": 76.0, "Steakhouse": 68.0, "Breakfast Spot": 68.0, "Hardware Store": 68.0, "College Gym": 64.0, "Asian Restaurant": 63.0, "Cosmetics Shop": 61.0, "College Rec Center": 61.0, "Karaoke Bar": 59.0, "Ice Cream Shop": 59.0, "Sushi Restaurant": 59.0, "College Academic Building": 58.0, "Military Base": 57.0, "College & University": 56.0, "General Entertainment": 55.0, "Rock Club": 55.0, "Historic Site": 54.0, "Shoe Store": 54.0, "Medical Center": 54.0, "Professional & Other Places": 51.0, "Travel Lounge": 51.0, "Soccer Stadium": 50.0, "Other Great Outdoors": 50.0, "Liquor Store": 49.0, "City Hall": 48.0, "General Travel": 48.0, "Baseball Field": 47.0, "Pool": 47.0, "City": 47.0, "College Library": 44.0, "Design Studio": 44.0, "Bus Station": 43.0, "College Lab": 43.0, "Theater": 43.0, "Bakery": 42.0, "Music Venue": 42.0, "New American Restaurant": 38.0, "Donut Shop": 37.0, "Laundry Service": 36.0, "Parking": 34.0, "Dessert Shop": 34.0, "Dentist's Office": 34.0, "Lingerie Store": 33.0, "Bowling Alley": 31.0, "Spa / Massage": 31.0, "Beer Garden": 30.0, "Factory": 30.0, "Arcade": 30.0, "Diner": 29.0, "Deli / Bodega": 29.0, "College Basketball Court": 28.0, "Video Game Store": 28.0, "Police Station": 28.0, "Food Court": 28.0, "Concert Hall": 28.0, "Boutique": 27.0, "Zoo": 27.0, "Medical School": 26.0, "Field": 26.0, "Casino": 26.0, "College Engineering Building": 26.0, "Golf Course": 26.0, "Furniture / Home Store": 25.0, "Campground": 25.0, "Library": 23.0, "Courthouse": 23.0, "Thrift / Vintage Store": 22.0, "Housing Development": 22.0, "Plaza": 22.0, "Video Store": 22.0, "College Football Field": 22.0, "Snack Place": 22.0, "Pet Store": 21.0, "Fried Chicken Joint": 21.0, "Playground": 20.0, "Event Space": 20.0, "Paper / Office Supplies Store": 20.0, "Juice Bar": 20.0, "Sculpture Garden": 20.0, "Elementary School": 20.0, "Brewery": 19.0, "Bike Rental / Bike Share": 19.0, "Basketball Court": 18.0, "Arts & Crafts Store": 18.0, "Cajun / Creole Restaurant": 18.0, "Hookah Bar": 18.0, "Student Center": 17.0, "Vietnamese Restaurant": 16.0, "Latin American Restaurant": 16.0, "Flea Market": 16.0, "Garden": 16.0, "Burrito Place": 15.0, "Cemetery": 14.0, "College Stadium": 14.0, "Airport Gate": 14.0, "Non-Profit": 14.0, "Japanese Restaurant": 14.0, "Salad Place": 13.0, "Bagel Shop": 13.0, "Performing Arts Venue": 13.0, "Whisky Bar": 13.0, "Pool Hall": 13.0, "Gift Shop": 13.0, "Food": 13.0, "Dog Run": 13.0, "Music Store": 13.0, "Hot Dog Joint": 13.0, "Tech Startup": 13.0, "Embassy / Consulate": 12.0, "Art Gallery": 12.0, "Women's Store": 12.0, "Nail Salon": 11.0, "Tourist Information Center": 11.0, "Hiking Trail": 11.0, "Convention Center": 11.0, "Bike Shop": 11.0, "Shop & Service": 10.0, "Yoga Studio": 10.0, "Car Dealership": 10.0, "Toy / Game Store": 10.0, "Wine Bar": 9.0, "Football Stadium": 9.0, "Mountain": 9.0, "Motel": 9.0, "Food Truck": 9.0, "Meeting Room": 9.0, "Martial Arts Dojo": 9.0, "Accessories Store": 8.0, "Other Nightlife": 8.0, "Tanning Salon": 8.0, "Bookstore": 8.0, "Museum": 8.0, "Art Museum": 8.0, "Theme Park": 8.0, "College Cafeteria": 8.0, "Campaign Office": 7.0, "Outdoors & Recreation": 7.0, "Airport Lounge": 7.0, "College Bookstore": 7.0, "Comedy Club": 7.0, "Southern / Soul Food Restaurant": 7.0, "College Technology Building": 7.0, "Veterinarian": 7.0, "History Museum": 7.0, "Motorcycle Shop": 7.0, "Mediterranean Restaurant": 7.0, "College Communications Building": 6.0, "Rental Car Location": 6.0, "Temple": 6.0, "Tapas Restaurant": 6.0, "Winery": 6.0, "Middle School": 6.0, "Thai Restaurant": 6.0, "Jewelry Store": 6.0, "Travel & Transport": 6.0, "Argentinian Restaurant": 5.0, "College Science Building": 5.0, "Gastropub": 5.0, "Filipino Restaurant": 5.0, "Hotel Bar": 5.0, "Surf Spot": 5.0, "Public Art": 5.0, "Resort": 5.0, "Conference Room": 5.0, "Auditorium": 5.0, "Emergency Room": 5.0, "Car Wash": 5.0, "Smoke Shop": 5.0, "Soccer Field": 4.0, "Monument / Landmark": 4.0, "Voting Booth": 4.0, "Men's Store": 4.0, "Bed & Breakfast": 4.0, "Spanish Restaurant": 4.0, "German Restaurant": 4.0, "Board Shop": 4.0, "Optical Shop": 4.0, "Plane": 4.0, "Storage Facility": 3.0, "Athletic & Sport": 3.0, "Antique Shop": 3.0, "Airport Terminal": 3.0, "Skating Rink": 3.0, "Spiritual Center": 3.0, "Light Rail": 3.0, "Financial or Legal Service": 3.0, "Science Museum": 3.0, "Market": 3.0, "Dance Studio": 3.0, "Fire Station": 3.0, "Kids Store": 3.0, "Record Shop": 2.0, "Tennis Court": 2.0, "Tea Room": 2.0, "Greek Restaurant": 2.0, "Hockey Arena": 2.0, "Pub": 2.0, "Mobile Phone Shop": 2.0, "Beach": 2.0, "Bus Line": 2.0, "Animal Shelter": 2.0, "Butcher": 2.0, "College Arts Building": 2.0, "Train Station": 2.0, "Indie Theater": 2.0, "Jazz Club": 2.0, "College Residence Hall": 2.0, "Soup Place": 2.0, "Airport Food Court": 2.0, "Laboratory": 2.0, "Funeral Home": 2.0, "Gaming Cafe": 2.0, "Caribbean Restaurant": 1.0, "Assisted Living": 1.0, "Gym Pool": 1.0, "Track": 1.0, "Vineyard": 1.0, "Indian Restaurant": 1.0, "Korean Restaurant": 1.0, "Trade School": 1.0, "Tennis": 1.0, "Nightlife Spot": 1.0, "Fraternity House": 1.0, "College Auditorium": 1.0, "Candy Store": 1.0, "Sorority House": 1.0, "River": 1.0, "College Soccer Field": 1.0, "Recycling Facility": 1.0, "Camera Store": 1.0, "Caf\u001a": 1.0, "Bridal Shop": 1.0, "Racetrack": 1.0, "College Theater": 1.0, "Credit Union": 1.0, "Farmers Market": 1.0, "Photography Lab": 1.0, "Flower Shop": 1.0, "College History Building": 1.0} \ No newline at end of file diff --git a/public/checkins_losangeles_by_category.json b/public/checkins_losangeles_by_category.json new file mode 100644 index 0000000..da58673 --- /dev/null +++ b/public/checkins_losangeles_by_category.json @@ -0,0 +1 @@ +{"Airport": 8177.0, "Home (private)": 7760.0, "Coffee Shop": 7132.0, "Office": 4970.0, "Grocery Store": 4609.0, "Mall": 4239.0, "Gym / Fitness Center": 4060.0, "Hotel": 3912.0, "Mexican Restaurant": 3800.0, "American Restaurant": 3667.0, "Burger Joint": 3126.0, "Bar": 3081.0, "Road": 2626.0, "Neighborhood": 2615.0, "Fast Food Restaurant": 2424.0, "General Entertainment": 2317.0, "Building": 2225.0, "Gym": 2104.0, "Nightclub": 2082.0, "Residential Building (Apartment / Condo)": 1990.0, "Caf": 1965.0, "Department Store": 1930.0, "Gas Station / Garage": 1831.0, "Park": 1774.0, "Gay Bar": 1742.0, "City": 1695.0, "Multiplex": 1550.0, "Parking": 1515.0, "Automotive Shop": 1484.0, "Bank": 1481.0, "Diner": 1477.0, "Sandwich Place": 1445.0, "Drugstore / Pharmacy": 1379.0, "Italian Restaurant": 1293.0, "Pizza Place": 1278.0, "Sushi Restaurant": 1269.0, "Airport Terminal": 1266.0, "Movie Theater": 1145.0, "Miscellaneous Shop": 1121.0, "Convenience Store": 1113.0, "Chinese Restaurant": 1110.0, "Clothing Store": 1033.0, "Church": 1012.0, "Stadium": 1009.0, "Electronics Store": 1009.0, "Light Rail": 1000.0, "Bus Line": 990.0, "Japanese Restaurant": 953.0, "Train Station": 952.0, "Restaurant": 916.0, "Korean Restaurant": 903.0, "Bakery": 844.0, "Rock Club": 841.0, "Lounge": 839.0, "Salon / Barbershop": 797.0, "Other Great Outdoors": 795.0, "University": 792.0, "Music Venue": 791.0, "Asian Restaurant": 777.0, "Breakfast Spot": 761.0, "Gastropub": 752.0, "Seafood Restaurant": 725.0, "Hospital": 725.0, "Thai Restaurant": 724.0, "Dessert Shop": 718.0, "Ice Cream Shop": 713.0, "Hiking Trail": 711.0, "High School": 681.0, "Plaza": 672.0, "Coworking Space": 670.0, "Airport Gate": 656.0, "Community College": 654.0, "Concert Hall": 645.0, "Scenic Lookout": 639.0, "BBQ Joint": 635.0, "Baseball Stadium": 634.0, "Theater": 629.0, "Juice Bar": 618.0, "Taco Place": 606.0, "General Travel": 590.0, "Pub": 589.0, "Event Space": 586.0, "Doctor's Office": 585.0, "Karaoke Bar": 584.0, "Vegetarian / Vegan Restaurant": 580.0, "French Restaurant": 577.0, "Cosmetics Shop": 574.0, "New American Restaurant": 568.0, "Government Building": 565.0, "Food Truck": 563.0, "Bookstore": 562.0, "Soccer Stadium": 552.0, "Subway": 548.0, "Trail": 540.0, "Post Office": 527.0, "Cocktail Bar": 526.0, "Bus Station": 511.0, "Theme Park": 509.0, "Airport Lounge": 503.0, "Sports Bar": 497.0, "Medical Center": 492.0, "Farmers Market": 484.0, "Tech Startup": 473.0, "Performing Arts Venue": 467.0, "Brewery": 465.0, "Ramen / Noodle House": 454.0, "Steakhouse": 449.0, "Tea Room": 449.0, "College Academic Building": 445.0, "Deli / Bodega": 444.0, "Donut Shop": 433.0, "Liquor Store": 415.0, "Spa / Massage": 405.0, "Furniture / Home Store": 403.0, "Vietnamese Restaurant": 400.0, "Boutique": 399.0, "Dive Bar": 389.0, "General College & University": 388.0, "Museum": 381.0, "Hardware Store": 380.0, "Art Gallery": 375.0, "Sculpture Garden": 372.0, "Theme Park Ride / Attraction": 370.0, "Monument / Landmark": 370.0, "Wings Joint": 360.0, "Pet Store": 357.0, "School": 348.0, "Laundry Service": 348.0, "Convention Center": 331.0, "Beach": 328.0, "Rental Car Location": 324.0, "Hot Dog Joint": 319.0, "Comedy Club": 313.0, "Mediterranean Restaurant": 313.0, "Playground": 309.0, "Other Nightlife": 303.0, "Yoga Studio": 293.0, "Hotel Bar": 292.0, "Planetarium": 284.0, "Toy / Game Store": 279.0, "Paper / Office Supplies Store": 279.0, "Plane": 278.0, "Southern / Soul Food Restaurant": 278.0, "Dog Run": 277.0, "College Library": 271.0, "Salad Place": 269.0, "Record Shop": 269.0, "Fried Chicken Joint": 265.0, "Courthouse": 265.0, "Cupcake Shop": 256.0, "Middle Eastern Restaurant": 253.0, "Factory": 251.0, "Shoe Store": 250.0, "Speakeasy": 248.0, "Strip Club": 247.0, "Cemetery": 246.0, "Food Court": 245.0, "Bowling Alley": 243.0, "Library": 237.0, "College Classroom": 234.0, "Brazilian Restaurant": 234.0, "Art Museum": 229.0, "Trade School": 228.0, "College Administrative Building": 221.0, "Wine Bar": 219.0, "History Museum": 216.0, "Pool": 216.0, "College Football Field": 216.0, "Sporting Goods Shop": 215.0, "Indie Movie Theater": 213.0, "Historic Site": 208.0, "Gift Shop": 207.0, "Professional & Other Places": 202.0, "City Hall": 198.0, "Whisky Bar": 195.0, "Men's Store": 194.0, "Women's Store": 185.0, "Thrift / Vintage Store": 185.0, "Indian Restaurant": 180.0, "Design Studio": 179.0, "Student Center": 178.0, "Lake": 176.0, "Food & Drink Shop": 176.0, "Bagel Shop": 175.0, "Casino": 173.0, "Cuban Restaurant": 168.0, "Arts & Crafts Store": 166.0, "Golf Course": 160.0, "Dance Studio": 159.0, "Conference Room": 155.0, "Snack Place": 150.0, "German Restaurant": 146.0, "Latin American Restaurant": 145.0, "Burrito Place": 145.0, "Beer Garden": 142.0, "Hookah Bar": 141.0, "Gaming Cafe": 137.0, "Dentist's Office": 135.0, "Flea Market": 134.0, "Elementary School": 132.0, "Video Game Store": 131.0, "Motel": 129.0, "Arcade": 127.0, "Skating Rink": 125.0, "Medical School": 122.0, "College Residence Hall": 121.0, "Food": 118.0, "Wine Shop": 115.0, "Fire Station": 115.0, "College Arts Building": 114.0, "Science Museum": 113.0, "Video Store": 113.0, "Bridge": 112.0, "College Gym": 112.0, "Candy Store": 112.0, "Tattoo Parlor": 108.0, "Spiritual Center": 108.0, "Zoo": 108.0, "Dim Sum Restaurant": 106.0, "Arts & Entertainment": 104.0, "Smoke Shop": 101.0, "Garden": 100.0, "Jewelry Store": 98.0, "Martial Arts Dojo": 97.0, "Bike Shop": 97.0, "Nail Salon": 96.0, "Greek Restaurant": 95.0, "College Bookstore": 94.0, "Cajun / Creole Restaurant": 91.0, "Track": 91.0, "Piano Bar": 86.0, "College Engineering Building": 85.0, "Car Wash": 84.0, "Accessories Store": 83.0, "Housing Development": 81.0, "College Lab": 79.0, "Hotel Pool": 77.0, "Gourmet Shop": 77.0, "Lingerie Store": 76.0, "South American Restaurant": 75.0, "Police Station": 75.0, "Racetrack": 75.0, "Baseball Field": 74.0, "Tourist Information Center": 73.0, "Music Store": 73.0, "College Math Building": 72.0, "Hobby Shop": 70.0, "Resort": 70.0, "College Science Building": 69.0, "Platform": 68.0, "Moving Target": 68.0, "Outdoors & Recreation": 68.0, "Tapas Restaurant": 67.0, "Peruvian Restaurant": 66.0, "Temple": 66.0, "Mobile Phone Shop": 65.0, "Market": 65.0, "Pier": 62.0, "Car Dealership": 60.0, "Field": 60.0, "Tennis Court": 57.0, "Mountain": 56.0, "College Basketball Court": 56.0, "Tanning Salon": 54.0, "Jazz Club": 54.0, "Fraternity House": 52.0, "College Cafeteria": 51.0, "Harbor / Marina": 51.0, "Caribbean Restaurant": 50.0, "Cafeteria": 50.0, "Train": 50.0, "Boat or Ferry": 50.0, "Hostel": 49.0, "Veterinarian": 49.0, "Filipino Restaurant": 48.0, "Argentinian Restaurant": 47.0, "Shop & Service": 47.0, "Flower Shop": 47.0, "Spanish Restaurant": 45.0, "Frozen Yogurt": 45.0, "Winery": 44.0, "Embassy / Consulate": 43.0, "Indie Theater": 43.0, "Kids Store": 41.0, "Athletic & Sport": 41.0, "Surf Spot": 40.0, "College Quad": 40.0, "Law School": 40.0, "Soccer Field": 38.0, "Financial or Legal Service": 38.0, "Nursery School": 38.0, "College Auditorium": 36.0, "Emergency Room": 35.0, "Pet Service": 34.0, "Hot Spring": 33.0, "Football Stadium": 33.0, "College Track": 32.0, "Bed & Breakfast": 32.0, "Ethiopian Restaurant": 31.0, "Dumpling Restaurant": 30.0, "Board Shop": 30.0, "Storage Facility": 30.0, "Basketball Court": 29.0, "Butcher": 28.0, "Rest Area": 28.0, "College Theater": 26.0, "Farm": 24.0, "Pool Hall": 23.0, "River": 22.0, "Indonesian Restaurant": 22.0, "Non-Profit": 22.0, "Optical Shop": 22.0, "Athletics & Sports": 21.0, "College Rec Center": 21.0, "Hockey Arena": 20.0, "Taxi": 19.0, "Sake Bar": 19.0, "Synagogue": 18.0, "Camera Store": 17.0, "College & University": 17.0, "Mac & Cheese Joint": 17.0, "Campaign Office": 16.0, "Campground": 16.0, "Funeral Home": 16.0, "Credit Union": 15.0, "Travel Lounge": 15.0, "Mosque": 15.0, "Bridal Shop": 15.0, "Falafel Restaurant": 15.0, "Middle School": 15.0, "Antique Shop": 15.0, "Voting Booth": 14.0, "Photography Lab": 14.0, "Cheese Shop": 14.0, "Skate Park": 13.0, "Eastern European Restaurant": 13.0, "Military Base": 13.0, "College Soccer Field": 12.0, "College Technology Building": 12.0, "Gym Pool": 12.0, "Auditorium": 12.0, "Radio Station": 12.0, "Meeting Room": 11.0, "Basketball Stadium": 10.0, "Gluten-free Restaurant": 10.0, "Sorority House": 10.0, "Roof Deck": 10.0, "College Communications Building": 9.0, "Boarding House": 9.0, "Castle": 9.0, "Volleyball Court": 8.0, "College History Building": 8.0, "Travel & Transport": 8.0, "College Tennis Court": 7.0, "Recycling Facility": 7.0, "Assisted Living": 7.0, "Fair": 7.0, "Public Art": 7.0, "Swiss Restaurant": 7.0, "Nightlife Spot": 6.0, "Internet Cafe": 6.0, "Tailor Shop": 6.0, "Track Stadium": 6.0, "Airport Tram": 6.0, "Animal Shelter": 6.0, "Laboratory": 5.0, "Garden Center": 5.0, "Soup Place": 5.0, "Moroccan Restaurant": 4.0, "Water Park": 4.0, "Capitol Building": 4.0, "Climbing Gym": 4.0, "African Restaurant": 4.0, "Fish Market": 4.0, "Malaysian Restaurant": 3.0, "Fish & Chips Shop": 3.0, "Daycare": 3.0, "Arepa Restaurant": 3.0, "Australian Restaurant": 3.0, "College Stadium": 3.0, "Opera House": 3.0, "Trails": 3.0, "Travel Agency": 2.0, "Real Estate Office": 2.0, "Motorcycle Shop": 2.0, "Shrine": 2.0, "Music School": 2.0, "Molecular Gastronomy Restaurant": 2.0, "Vineyard": 1.0, "Ski Chalet": 1.0, "Ski Chairlift": 1.0, "College Baseball Diamond": 1.0, "Well": 1.0, "Lighthouse": 1.0, "Newsstand": 1.0, "Paella Restaurant": 1.0, "Bike Rental / Bike Share": 1.0, "Scandinavian Restaurant": 1.0, "Rock Climbing Spot": 1.0, "Mongolian Restaurant": 1.0} diff --git a/public/checkins_memphis_by_category.json b/public/checkins_memphis_by_category.json new file mode 100644 index 0000000..83376a6 --- /dev/null +++ b/public/checkins_memphis_by_category.json @@ -0,0 +1 @@ +{"Home (private)": 1418.0, "Residential Building (Apartment / Condo)": 625.0, "Airport": 600.0, "Grocery Store": 591.0, "Gas Station / Garage": 580.0, "Bar": 553.0, "American Restaurant": 535.0, "Office": 530.0, "Coffee Shop": 529.0, "Fast Food Restaurant": 504.0, "Building": 451.0, "Department Store": 386.0, "Gym": 362.0, "Church": 358.0, "BBQ Joint": 352.0, "Hotel": 299.0, "Burger Joint": 269.0, "Sandwich Place": 264.0, "Park": 264.0, "High School": 256.0, "Mexican Restaurant": 241.0, "Basketball Stadium": 232.0, "Drugstore / Pharmacy": 229.0, "Miscellaneous Shop": 217.0, "Pet Store": 212.0, "General Travel": 212.0, "Automotive Shop": 211.0, "Parking": 208.0, "Beer Garden": 206.0, "Historic Site": 190.0, "Other Great Outdoors": 189.0, "Radio Station": 176.0, "City": 175.0, "Bank": 169.0, "College Academic Building": 168.0, "Convenience Store": 168.0, "Hospital": 167.0, "Road": 165.0, "Zoo": 158.0, "Professional & Other Places": 149.0, "Doctor's Office": 148.0, "Pizza Place": 148.0, "Breakfast Spot": 140.0, "Deli / Bodega": 137.0, "Tech Startup": 136.0, "Electronics Store": 134.0, "Italian Restaurant": 127.0, "College Lab": 120.0, "Movie Theater": 118.0, "Student Center": 118.0, "Museum": 113.0, "Music Venue": 109.0, "Gym / Fitness Center": 109.0, "Nightclub": 108.0, "Salon / Barbershop": 106.0, "School": 103.0, "Fried Chicken Joint": 103.0, "Sculpture Garden": 98.0, "Seafood Restaurant": 97.0, "Restaurant": 96.0, "Government Building": 94.0, "College Arts Building": 93.0, "Mall": 90.0, "Lounge": 90.0, "Furniture / Home Store": 88.0, "Wings Joint": 84.0, "Sports Bar": 82.0, "Hardware Store": 78.0, "Ice Cream Shop": 77.0, "Caf\u001a\u001a": 77.0, "Speakeasy": 75.0, "Bridge": 74.0, "General Entertainment": 74.0, "Police Station": 73.0, "Medical Center": 72.0, "Art Gallery": 68.0, "Baseball Stadium": 66.0, "Southern / Soul Food Restaurant": 66.0, "Chinese Restaurant": 65.0, "Bookstore": 65.0, "Steakhouse": 63.0, "Bus Station": 63.0, "College Library": 63.0, "Bagel Shop": 62.0, "Clothing Store": 62.0, "River": 62.0, "Multiplex": 60.0, "Dog Run": 59.0, "Asian Restaurant": 59.0, "Gastropub": 59.0, "Cajun / Creole Restaurant": 58.0, "Music Store": 58.0, "Diner": 58.0, "Coworking Space": 57.0, "Cosmetics Shop": 56.0, "Food & Drink Shop": 55.0, "Sushi Restaurant": 54.0, "University": 53.0, "Airport Gate": 52.0, "Liquor Store": 50.0, "College Science Building": 47.0, "Pub": 46.0, "Scenic Lookout": 41.0, "Playground": 40.0, "Garden": 40.0, "Sporting Goods Shop": 39.0, "Monument / Landmark": 39.0, "Japanese Restaurant": 39.0, "Jazz Club": 39.0, "Bowling Alley": 38.0, "Donut Shop": 37.0, "Theater": 37.0, "Factory": 36.0, "Golf Course": 36.0, "Cocktail Bar": 36.0, "Rock Club": 36.0, "Conference Room": 36.0, "Casino": 34.0, "Post Office": 34.0, "Mobile Phone Shop": 34.0, "Wine Bar": 32.0, "College Residence Hall": 32.0, "Train Station": 32.0, "Convention Center": 32.0, "Elementary School": 32.0, "Light Rail": 32.0, "Neighborhood": 32.0, "Laundry Service": 30.0, "Bakery": 30.0, "Farmers Market": 29.0, "Rental Car Location": 28.0, "Housing Development": 28.0, "Thrift / Vintage Store": 28.0, "Arts & Crafts Store": 28.0, "Event Space": 28.0, "College Cafeteria": 27.0, "Baseball Field": 27.0, "College Gym": 26.0, "Mongolian Restaurant": 25.0, "Dessert Shop": 24.0, "Concert Hall": 24.0, "Strip Club": 22.0, "Airport Terminal": 21.0, "Dive Bar": 21.0, "Smoke Shop": 21.0, "Library": 20.0, "Hobby Shop": 19.0, "Pool": 19.0, "Frozen Yogurt": 19.0, "Tapas Restaurant": 19.0, "Plaza": 19.0, "Gift Shop": 18.0, "College Bookstore": 18.0, "Motel": 18.0, "Food": 18.0, "Hookah Bar": 17.0, "Paper / Office Supplies Store": 17.0, "Middle School": 17.0, "History Museum": 17.0, "College Communications Building": 17.0, "Hiking Trail": 16.0, "Greek Restaurant": 16.0, "Dentist's Office": 16.0, "Spa / Massage": 15.0, "Yoga Studio": 15.0, "Mediterranean Restaurant": 15.0, "Science Museum": 15.0, "Field": 15.0, "Video Store": 14.0, "College Football Field": 14.0, "Lake": 14.0, "Juice Bar": 14.0, "Women's Store": 14.0, "Boutique": 13.0, "College Classroom": 13.0, "Courthouse": 13.0, "Travel & Transport": 12.0, "Arcade": 12.0, "Vietnamese Restaurant": 12.0, "Karaoke Bar": 12.0, "Indian Restaurant": 12.0, "City Hall": 12.0, "Trade School": 11.0, "Cemetery": 11.0, "Shoe Store": 11.0, "Shop & Service": 11.0, "Roof Deck": 11.0, "Food Court": 11.0, "Men's Store": 11.0, "Art Museum": 11.0, "Harbor / Marina": 10.0, "Tattoo Parlor": 10.0, "Thai Restaurant": 10.0, "Racetrack": 10.0, "Other Nightlife": 10.0, "Car Dealership": 10.0, "Gay Bar": 10.0, "Plane": 10.0, "Synagogue": 9.0, "New American Restaurant": 9.0, "Record Shop": 9.0, "German Restaurant": 9.0, "Winery": 9.0, "Financial or Legal Service": 9.0, "Non-Profit": 8.0, "Rest Area": 8.0, "Tanning Salon": 8.0, "Trail": 8.0, "General College & University": 8.0, "Campground": 8.0, "Outdoors & Recreation": 8.0, "Brazilian Restaurant": 8.0, "Aquarium": 7.0, "College Auditorium": 7.0, "Sake Bar": 7.0, "Vineyard": 7.0, "Video Game Store": 7.0, "Emergency Room": 7.0, "Jewelry Store": 6.0, "Ramen / Noodle House": 6.0, "Veterinarian": 6.0, "Flea Market": 6.0, "Apres Ski Bar": 6.0, "Nail Salon": 6.0, "Performing Arts Venue": 6.0, "Hotel Bar": 6.0, "Cupcake Shop": 6.0, "Hunting Supply": 6.0, "Indie Movie Theater": 5.0, "Gourmet Shop": 5.0, "Residence": 5.0, "Car Wash": 5.0, "Candy Store": 5.0, "Football Stadium": 5.0, "Community College": 5.0, "Wine Shop": 5.0, "Camera Store": 5.0, "Animal Shelter": 5.0, "Vegetarian / Vegan Restaurant": 5.0, "Stables": 5.0, "Train": 4.0, "Bike Shop": 4.0, "Track": 4.0, "Toy / Game Store": 4.0, "Bus Line": 4.0, "Spiritual Center": 4.0, "College & University": 4.0, "College Basketball Court": 4.0, "Flower Shop": 4.0, "Design Studio": 4.0, "Comedy Club": 4.0, "Funeral Home": 4.0, "Whisky Bar": 3.0, "Kids Store": 3.0, "Law School": 3.0, "Travel Agency": 3.0, "Skating Rink": 3.0, "Fish & Chips Shop": 3.0, "Meeting Room": 3.0, "Tourist Information Center": 3.0, "Middle Eastern Restaurant": 3.0, "Gaming Cafe": 3.0, "Athletic & Sport": 3.0, "Boat or Ferry": 3.0, "Credit Union": 3.0, "Moving Target": 3.0, "Accessories Store": 3.0, "Caribbean Restaurant": 3.0, "Optical Shop": 2.0, "Public Art": 2.0, "Airport Lounge": 2.0, "Resort": 2.0, "Laboratory": 2.0, "Fraternity House": 2.0, "Pool Hall": 2.0, "Travel Lounge": 2.0, "College Baseball Diamond": 2.0, "Antique Shop": 2.0, "Platform": 2.0, "Fire Station": 2.0, "Farm": 2.0, "Distillery": 2.0, "Butcher": 2.0, "College Quad": 2.0, "Arts & Entertainment": 2.0, "College Theater": 2.0, "Nursery School": 2.0, "Recycling Facility": 2.0, "Mosque": 1.0, "Lighthouse": 1.0, "Gym Pool": 1.0, "Hostel": 1.0, "Brewery": 1.0, "Snack Place": 1.0, "Soccer Field": 1.0, "Airport Tram": 1.0, "African Restaurant": 1.0, "Voting Booth": 1.0, "French Restaurant": 1.0, "College Administrative Building": 1.0, "Sorority House": 1.0, "Opera House": 1.0, "College Rec Center": 1.0, "Food Truck": 1.0, "Nightlife Spot": 1.0, "Embassy / Consulate": 1.0, "Capitol Building": 1.0, "Assisted Living": 1.0, "Arepa Restaurant": 1.0, "Market": 1.0, "Martial Arts Dojo": 1.0, "Dance Studio": 1.0, "College Engineering Building": 1.0, "Daycare": 1.0, "Campaign Office": 1.0, "Ski Lodge": 1.0, "Theme Park": 1.0, "Military Base": 1.0, "Stadium": 1.0, "Tennis Court": 1.0, "Burrito Place": 1.0} \ No newline at end of file diff --git a/public/checkins_phoenix_by_category.json b/public/checkins_phoenix_by_category.json new file mode 100644 index 0000000..0636cbd --- /dev/null +++ b/public/checkins_phoenix_by_category.json @@ -0,0 +1 @@ +{"Home (private)": 4589.0, "Airport": 3072.0, "Office": 2531.0, "Coffee Shop": 2091.0, "Bar": 2001.0, "Grocery Store": 1971.0, "Residential Building (Apartment / Condo)": 1555.0, "Mexican Restaurant": 1501.0, "American Restaurant": 1373.0, "Fast Food Restaurant": 1239.0, "Gym / Fitness Center": 1207.0, "Mall": 1124.0, "Department Store": 1063.0, "Pizza Place": 982.0, "Gas Station / Garage": 965.0, "Building": 941.0, "Convenience Store": 938.0, "Hotel": 920.0, "Gym": 794.0, "Sandwich Place": 713.0, "Burger Joint": 701.0, "Road": 665.0, "Electronics Store": 661.0, "Nightclub": 660.0, "Sports Bar": 653.0, "Bank": 609.0, "College Academic Building": 596.0, "Baseball Stadium": 578.0, "Airport Gate": 557.0, "Gay Bar": 554.0, "Airport Terminal": 550.0, "Breakfast Spot": 549.0, "Automotive Shop": 530.0, "Light Rail": 482.0, "Coworking Space": 482.0, "Miscellaneous Shop": 447.0, "City": 446.0, "Drugstore / Pharmacy": 438.0, "Park": 399.0, "Movie Theater": 397.0, "Multiplex": 380.0, "Clothing Store": 366.0, "Bakery": 364.0, "Resort": 331.0, "Italian Restaurant": 320.0, "Church": 314.0, "University": 310.0, "Salon / Barbershop": 290.0, "Chinese Restaurant": 283.0, "Music Venue": 281.0, "Medical Center": 278.0, "Sushi Restaurant": 278.0, "Neighborhood": 270.0, "Doctor's Office": 270.0, "Hospital": 269.0, "General Travel": 261.0, "General Entertainment": 260.0, "New American Restaurant": 258.0, "Caf\u001a\u001a": 253.0, "Parking": 247.0, "Restaurant": 247.0, "Lounge": 244.0, "Pub": 238.0, "Other Great Outdoors": 238.0, "Government Building": 236.0, "School": 233.0, "Gastropub": 231.0, "Asian Restaurant": 224.0, "Wings Joint": 223.0, "Student Center": 222.0, "Hiking Trail": 218.0, "Basketball Stadium": 217.0, "Strip Club": 216.0, "Community College": 212.0, "Train Station": 210.0, "Hardware Store": 210.0, "Ice Cream Shop": 208.0, "Cocktail Bar": 201.0, "Brewery": 201.0, "College Football Field": 191.0, "General College & University": 191.0, "Diner": 189.0, "Dog Run": 185.0, "Bookstore": 182.0, "Cosmetics Shop": 180.0, "Steakhouse": 177.0, "Tanning Salon": 176.0, "Mediterranean Restaurant": 170.0, "College Administrative Building": 167.0, "Pet Store": 163.0, "Housing Development": 161.0, "Tech Startup": 160.0, "Post Office": 157.0, "Bus Line": 156.0, "Wine Bar": 151.0, "Pool": 151.0, "Beer Garden": 148.0, "Burrito Place": 143.0, "High School": 140.0, "Art Gallery": 137.0, "Motel": 136.0, "Rental Car Location": 136.0, "Smoke Shop": 134.0, "College Classroom": 134.0, "Karaoke Bar": 133.0, "Dessert Shop": 130.0, "BBQ Joint": 130.0, "Theater": 129.0, "Bowling Alley": 126.0, "Performing Arts Venue": 126.0, "College Gym": 126.0, "Field": 122.0, "Rock Club": 121.0, "Bridge": 121.0, "College Cafeteria": 119.0, "College Library": 118.0, "Dance Studio": 114.0, "Japanese Restaurant": 113.0, "Fried Chicken Joint": 112.0, "Jewelry Store": 110.0, "Bagel Shop": 110.0, "Zoo": 109.0, "Sporting Goods Shop": 109.0, "Trade School": 108.0, "Seafood Restaurant": 106.0, "Library": 106.0, "Event Space": 106.0, "Arts & Crafts Store": 105.0, "College Residence Hall": 103.0, "Garden": 103.0, "Record Shop": 101.0, "Furniture / Home Store": 99.0, "Thai Restaurant": 99.0, "Deli / Bodega": 99.0, "Vegetarian / Vegan Restaurant": 97.0, "Convention Center": 96.0, "Hockey Arena": 92.0, "Police Station": 92.0, "Mobile Phone Shop": 91.0, "Professional & Other Places": 90.0, "Food & Drink Shop": 90.0, "Golf Course": 88.0, "Paper / Office Supplies Store": 88.0, "Juice Bar": 88.0, "Bus Station": 85.0, "Farmers Market": 85.0, "Greek Restaurant": 84.0, "Spa / Massage": 83.0, "Food Court": 82.0, "Donut Shop": 80.0, "Boutique": 79.0, "Car Wash": 78.0, "Thrift / Vintage Store": 78.0, "Dive Bar": 76.0, "College Stadium": 74.0, "Airport Lounge": 72.0, "Taco Place": 71.0, "Playground": 69.0, "Speakeasy": 69.0, "Liquor Store": 67.0, "Casino": 64.0, "Lingerie Store": 64.0, "Salad Place": 63.0, "Shrine": 62.0, "Lake": 61.0, "Wine Shop": 61.0, "Comedy Club": 60.0, "Southern / Soul Food Restaurant": 60.0, "College Science Building": 58.0, "Baseball Field": 57.0, "Toy / Game Store": 57.0, "Hobby Shop": 56.0, "Shoe Store": 55.0, "Video Game Store": 55.0, "Design Studio": 54.0, "Arcade": 53.0, "Dentist's Office": 53.0, "Food Truck": 50.0, "Vietnamese Restaurant": 50.0, "Conference Room": 49.0, "College Arts Building": 47.0, "Antique Shop": 46.0, "Plaza": 45.0, "Women's Store": 45.0, "French Restaurant": 45.0, "Car Dealership": 44.0, "Hot Dog Joint": 42.0, "Moving Target": 42.0, "Airport Tram": 42.0, "Gift Shop": 42.0, "Mountain": 41.0, "Fire Station": 41.0, "Factory": 39.0, "Laundry Service": 38.0, "Elementary School": 38.0, "Courthouse": 37.0, "College Bookstore": 37.0, "Caribbean Restaurant": 37.0, "Fair": 36.0, "Theme Park": 36.0, "Candy Store": 35.0, "Indie Movie Theater": 35.0, "Cupcake Shop": 35.0, "Tattoo Parlor": 34.0, "Scenic Lookout": 34.0, "Medical School": 34.0, "Plane": 33.0, "Indian Restaurant": 32.0, "Platform": 32.0, "College Math Building": 32.0, "Yoga Studio": 32.0, "Athletic & Sport": 30.0, "Train": 30.0, "Museum": 29.0, "Hookah Bar": 29.0, "Cajun / Creole Restaurant": 29.0, "Emergency Room": 28.0, "Middle Eastern Restaurant": 28.0, "College Quad": 28.0, "Other Nightlife": 27.0, "Veterinarian": 26.0, "College Lab": 26.0, "Travel & Transport": 26.0, "Bike Shop": 26.0, "Taxi": 26.0, "Science Museum": 25.0, "German Restaurant": 25.0, "Nail Salon": 24.0, "Hotel Pool": 24.0, "Capitol Building": 22.0, "Concert Hall": 20.0, "Financial or Legal Service": 20.0, "Fraternity House": 20.0, "Campground": 19.0, "Hotel Bar": 19.0, "Football Stadium": 19.0, "City Hall": 19.0, "Sorority House": 19.0, "Men's Store": 19.0, "Accessories Store": 19.0, "College & University": 17.0, "Latin American Restaurant": 17.0, "Racetrack": 16.0, "History Museum": 16.0, "Nightlife Spot": 16.0, "Winery": 16.0, "Tea Room": 15.0, "Castle": 15.0, "Spiritual Center": 15.0, "Whisky Bar": 15.0, "Planetarium": 15.0, "College Engineering Building": 15.0, "Music Store": 15.0, "Mongolian Restaurant": 15.0, "Historic Site": 14.0, "College Rec Center": 14.0, "Aquarium": 14.0, "Art Museum": 14.0, "College Auditorium": 14.0, "Outdoors & Recreation": 13.0, "Recycling Facility": 13.0, "Video Store": 13.0, "Flower Shop": 13.0, "Shop & Service": 13.0, "Cemetery": 13.0, "Radio Station": 12.0, "Brazilian Restaurant": 12.0, "Falafel Restaurant": 12.0, "Food": 12.0, "College Baseball Diamond": 12.0, "Gourmet Shop": 12.0, "Pool Hall": 11.0, "Flea Market": 11.0, "Snack Place": 11.0, "Ethiopian Restaurant": 10.0, "Meeting Room": 10.0, "College Theater": 10.0, "Board Shop": 10.0, "Animal Shelter": 10.0, "Health Food Store": 10.0, "Farm": 10.0, "Beach": 9.0, "College Communications Building": 9.0, "Laboratory": 9.0, "Skate Park": 9.0, "Gluten-free Restaurant": 9.0, "Kids Store": 8.0, "Opera House": 8.0, "Basketball Court": 7.0, "Nursery School": 7.0, "Optical Shop": 7.0, "Spanish Restaurant": 7.0, "College Track": 7.0, "Butcher": 7.0, "Bridal Shop": 7.0, "Market": 7.0, "Embassy / Consulate": 7.0, "Funeral Home": 6.0, "Bed & Breakfast": 6.0, "Hot Spring": 6.0, "Tailor Shop": 6.0, "Rest Area": 6.0, "Pet Service": 6.0, "Travel Lounge": 5.0, "Martial Arts Dojo": 5.0, "Tennis Court": 5.0, "Military Base": 5.0, "College Soccer Field": 5.0, "Water Park": 5.0, "Harbor / Marina": 5.0, "Stadium": 4.0, "Hostel": 4.0, "Cuban Restaurant": 4.0, "Volcanoes": 4.0, "Boat or Ferry": 4.0, "College Technology Building": 4.0, "Airport Food Court": 4.0, "Jazz Club": 4.0, "Caf\u001a": 4.0, "Internet Cafe": 3.0, "Campaign Office": 3.0, "Mosque": 3.0, "Temple": 3.0, "Sculpture Garden": 3.0, "Credit Union": 3.0, "Arts & Entertainment": 3.0, "Korean Restaurant": 3.0, "Voting Booth": 3.0, "Newsstand": 3.0, "Eastern European Restaurant": 3.0, "Soccer Field": 3.0, "Skating Rink": 3.0, "Assisted Living": 3.0, "Garden Center": 2.0, "African Restaurant": 2.0, "Gym Pool": 2.0, "Track": 2.0, "Bike Rental / Bike Share": 2.0, "Tourist Information Center": 2.0, "Photography Lab": 2.0, "Stables": 2.0, "Australian Restaurant": 2.0, "Surf Spot": 2.0, "Athletics & Sports": 2.0, "Tapas Restaurant": 1.0, "Cafeteria": 1.0, "Daycare": 1.0, "Soccer Stadium": 1.0, "Filipino Restaurant": 1.0, "South American Restaurant": 1.0, "Real Estate Office": 1.0, "Roof Deck": 1.0, "River": 1.0, "Moroccan Restaurant": 1.0, "Storage Facility": 1.0, "Volcano": 1.0, "Theme Park Ride / Attraction": 1.0, "Synagogue": 1.0, "Gaming Cafe": 1.0, "Monument / Landmark": 1.0, "Island": 1.0, "Peruvian Restaurant": 1.0, "Auditorium": 1.0} \ No newline at end of file diff --git a/public/checkins_portland_by_category.json b/public/checkins_portland_by_category.json new file mode 100644 index 0000000..29de930 --- /dev/null +++ b/public/checkins_portland_by_category.json @@ -0,0 +1 @@ +{"Home (private)": 3050.0, "Coffee Shop": 1618.0, "Grocery Store": 1425.0, "Office": 1300.0, "Airport": 1234.0, "Brewery": 971.0, "Bar": 926.0, "American Restaurant": 855.0, "Hotel": 776.0, "Neighborhood": 760.0, "Light Rail": 721.0, "Building": 666.0, "Bridge": 630.0, "Gym / Fitness Center": 629.0, "Department Store": 628.0, "Mexican Restaurant": 521.0, "Fast Food Restaurant": 503.0, "Residential Building (Apartment / Condo)": 490.0, "Pub": 489.0, "Road": 466.0, "Food Truck": 466.0, "Pizza Place": 456.0, "Mall": 427.0, "Gas Station / Garage": 411.0, "Other Great Outdoors": 409.0, "Park": 396.0, "Sandwich Place": 372.0, "Caf\u001a\u001a": 368.0, "Electronics Store": 368.0, "Movie Theater": 348.0, "Burger Joint": 346.0, "Bank": 334.0, "Doctor's Office": 328.0, "Donut Shop": 292.0, "City": 282.0, "Soccer Stadium": 275.0, "Breakfast Spot": 259.0, "Gym": 246.0, "Sushi Restaurant": 231.0, "Lounge": 230.0, "Convenience Store": 228.0, "Church": 223.0, "Gay Bar": 214.0, "Bakery": 213.0, "Italian Restaurant": 212.0, "Automotive Shop": 203.0, "Sports Bar": 200.0, "Rock Club": 197.0, "Cocktail Bar": 194.0, "Diner": 193.0, "Post Office": 192.0, "Bookstore": 189.0, "College Academic Building": 189.0, "Clothing Store": 185.0, "Bus Line": 182.0, "Train Station": 180.0, "Bus Station": 178.0, "Ice Cream Shop": 176.0, "Plaza": 173.0, "General Travel": 173.0, "Furniture / Home Store": 170.0, "Asian Restaurant": 168.0, "Thai Restaurant": 163.0, "BBQ Joint": 162.0, "Steakhouse": 158.0, "Wings Joint": 154.0, "Coworking Space": 153.0, "Chinese Restaurant": 152.0, "Drugstore / Pharmacy": 148.0, "Community College": 144.0, "Convention Center": 142.0, "Stadium": 141.0, "Miscellaneous Shop": 141.0, "Boutique": 139.0, "Hospital": 138.0, "Dive Bar": 129.0, "School": 127.0, "Strip Club": 127.0, "Hardware Store": 126.0, "Sporting Goods Shop": 125.0, "Vietnamese Restaurant": 121.0, "Seafood Restaurant": 121.0, "Nightclub": 120.0, "Government Building": 119.0, "Dessert Shop": 113.0, "Garden": 111.0, "Restaurant": 111.0, "Cosmetics Shop": 111.0, "Salon / Barbershop": 105.0, "University": 104.0, "Japanese Restaurant": 100.0, "Beer Garden": 100.0, "College Administrative Building": 99.0, "Burrito Place": 98.0, "Zoo": 97.0, "Real Estate Office": 96.0, "Medical Center": 92.0, "Event Space": 90.0, "Soccer Field": 88.0, "Karaoke Bar": 85.0, "Library": 84.0, "High School": 84.0, "General Entertainment": 83.0, "Airport Gate": 83.0, "Deli / Bodega": 82.0, "Men's Store": 80.0, "Vegetarian / Vegan Restaurant": 79.0, "Arcade": 79.0, "Wine Bar": 79.0, "Southern / Soul Food Restaurant": 79.0, "Dentist's Office": 78.0, "Pet Store": 78.0, "College Classroom": 77.0, "Indie Movie Theater": 76.0, "Airport Terminal": 76.0, "Shoe Store": 72.0, "Playground": 71.0, "Farmers Market": 71.0, "Liquor Store": 70.0, "Juice Bar": 67.0, "Performing Arts Venue": 65.0, "French Restaurant": 64.0, "Parking": 64.0, "Theater": 64.0, "Toy / Game Store": 64.0, "Thrift / Vintage Store": 63.0, "Professional & Other Places": 60.0, "Bowling Alley": 59.0, "Golf Course": 58.0, "Market": 57.0, "Cajun / Creole Restaurant": 57.0, "Arts & Crafts Store": 57.0, "Concert Hall": 57.0, "Spa / Massage": 56.0, "Factory": 56.0, "Whisky Bar": 56.0, "German Restaurant": 55.0, "Paper / Office Supplies Store": 53.0, "Hiking Trail": 53.0, "Bike Shop": 52.0, "Korean Restaurant": 50.0, "Train": 50.0, "Military Base": 48.0, "Tech Startup": 48.0, "Science Museum": 47.0, "College Library": 47.0, "Laundry Service": 46.0, "Middle Eastern Restaurant": 45.0, "Student Center": 44.0, "College Football Field": 43.0, "Lingerie Store": 43.0, "Hockey Arena": 43.0, "New American Restaurant": 43.0, "Hot Dog Joint": 42.0, "Comedy Club": 41.0, "Tennis Court": 41.0, "Art Museum": 40.0, "River": 40.0, "Conference Room": 40.0, "Salad Place": 39.0, "Theme Park": 39.0, "Dog Run": 39.0, "Dance Studio": 39.0, "Trade School": 39.0, "Art Gallery": 38.0, "Women's Store": 38.0, "Car Wash": 37.0, "Bagel Shop": 36.0, "Music Venue": 36.0, "Nursery School": 35.0, "Taco Place": 35.0, "Museum": 34.0, "Indian Restaurant": 33.0, "Scenic Lookout": 33.0, "Yoga Studio": 33.0, "Food Court": 33.0, "Pool": 32.0, "Spiritual Center": 32.0, "Fried Chicken Joint": 31.0, "Housing Development": 31.0, "Gift Shop": 31.0, "Record Shop": 31.0, "Tea Room": 30.0, "Historic Site": 30.0, "Tattoo Parlor": 28.0, "Meeting Room": 28.0, "Hobby Shop": 28.0, "Mediterranean Restaurant": 27.0, "Car Dealership": 27.0, "College Cafeteria": 27.0, "Racetrack": 27.0, "Elementary School": 26.0, "Ramen / Noodle House": 26.0, "College Communications Building": 25.0, "Video Game Store": 25.0, "Non-Profit": 25.0, "Tanning Salon": 25.0, "Optical Shop": 25.0, "Laboratory": 25.0, "Pool Hall": 24.0, "Mobile Phone Shop": 24.0, "Moving Target": 24.0, "Antique Shop": 24.0, "Hookah Bar": 23.0, "Multiplex": 23.0, "Snack Place": 22.0, "Rental Car Location": 22.0, "City Hall": 22.0, "Peruvian Restaurant": 22.0, "Animal Shelter": 21.0, "Harbor / Marina": 21.0, "Video Store": 21.0, "Medical School": 20.0, "Motel": 19.0, "Plane": 19.0, "Airport Lounge": 19.0, "Wine Shop": 19.0, "Other Nightlife": 18.0, "Accessories Store": 18.0, "Gourmet Shop": 18.0, "Gastropub": 18.0, "Middle School": 17.0, "College Residence Hall": 17.0, "College Bookstore": 17.0, "Casino": 16.0, "Hostel": 16.0, "Jewelry Store": 15.0, "Speakeasy": 15.0, "Monument / Landmark": 14.0, "Skating Rink": 14.0, "Sculpture Garden": 14.0, "Assisted Living": 14.0, "Greek Restaurant": 14.0, "Cemetery": 14.0, "Winery": 14.0, "Athletics & Sports": 14.0, "Latin American Restaurant": 13.0, "College Rec Center": 13.0, "College Science Building": 13.0, "History Museum": 13.0, "Baseball Field": 13.0, "Emergency Room": 13.0, "Athletic & Sport": 13.0, "Veterinarian": 13.0, "Resort": 12.0, "Lake": 12.0, "Health Food Store": 12.0, "Financial or Legal Service": 12.0, "Radio Station": 12.0, "Food": 12.0, "Smoke Shop": 11.0, "General College & University": 11.0, "Food & Drink Shop": 11.0, "Tapas Restaurant": 11.0, "Boat or Ferry": 11.0, "Skate Park": 10.0, "Kids Store": 10.0, "Nail Salon": 10.0, "Design Studio": 10.0, "College & University": 10.0, "Shop & Service": 9.0, "Cafeteria": 9.0, "Mac & Cheese Joint": 9.0, "Garden Center": 9.0, "Courthouse": 9.0, "Piano Bar": 9.0, "Jazz Club": 8.0, "Gym Pool": 8.0, "Martial Arts Dojo": 8.0, "Bridal Shop": 8.0, "College Technology Building": 8.0, "Music Store": 8.0, "Temple": 7.0, "Butcher": 7.0, "Track": 7.0, "Basketball Stadium": 7.0, "Campground": 7.0, "Scandinavian Restaurant": 7.0, "Flower Shop": 6.0, "Arts & Entertainment": 6.0, "Cupcake Shop": 6.0, "Hotel Bar": 6.0, "Falafel Restaurant": 6.0, "Dim Sum Restaurant": 6.0, "Storage Facility": 6.0, "Basketball Court": 6.0, "Aquarium": 5.0, "Argentinian Restaurant": 5.0, "Farm": 5.0, "Cuban Restaurant": 5.0, "Mountain": 5.0, "Bed & Breakfast": 5.0, "Camera Store": 5.0, "College Quad": 5.0, "Voting Booth": 5.0, "Climbing Gym": 4.0, "Fire Station": 4.0, "Travel Lounge": 4.0, "Ethiopian Restaurant": 4.0, "Moroccan Restaurant": 4.0, "Spanish Restaurant": 4.0, "Nightlife Spot": 4.0, "Gaming Cafe": 3.0, "Tourist Information Center": 3.0, "Sake Bar": 3.0, "Candy Store": 3.0, "College Arts Building": 3.0, "South American Restaurant": 3.0, "Flea Market": 3.0, "Police Station": 3.0, "Field": 3.0, "Eastern European Restaurant": 3.0, "College Theater": 2.0, "Credit Union": 2.0, "Mosque": 2.0, "Baseball Stadium": 2.0, "Opera House": 2.0, "Fish Market": 2.0, "Photography Lab": 2.0, "Roof Deck": 2.0, "College Basketball Court": 2.0, "Hotel Pool": 2.0, "Swiss Restaurant": 2.0, "Brazilian Restaurant": 1.0, "Caf\u001a": 1.0, "Law School": 1.0, "Indie Theater": 1.0, "Outdoors & Recreation": 1.0, "Board Shop": 1.0, "Pet Service": 1.0, "Volcano": 1.0, "Distillery": 1.0, "Motorcycle Shop": 1.0, "Island": 1.0, "Taxi": 1.0, "Airport Tram": 1.0, "Planetarium": 1.0, "Caribbean Restaurant": 1.0, "Beach": 1.0, "Trail": 1.0, "Dumpling Restaurant": 1.0, "Track Stadium": 1.0, "Public Art": 1.0, "Rest Area": 1.0, "Embassy / Consulate": 1.0, "Football Stadium": 1.0, "Stables": 1.0, "Tennis": 1.0, "College Lab": 1.0, "College Auditorium": 1.0} \ No newline at end of file diff --git a/public/yelp2foursquare.json b/public/yelp2foursquare.json new file mode 100644 index 0000000..fe26468 --- /dev/null +++ b/public/yelp2foursquare.json @@ -0,0 +1,305 @@ +{ + "shoppingcenters": "Mall", + "food": "Food", + "soulfood": "Southern / Soul Food Restaurant", + "convenience": "Convenience Store", + "coffee": "Coffee Shop", + "professional": "Professional & Other Places", + "sandwiches": "Sandwich Place", + "tobaccoshops": "Smoke Shop", + "health": "Medical Center", + "auto": "Automotive Shop", + "oilchange": "Gas Station / Garage", + "carwash": "Car Wash", + "appraisalservices": "Financial or Legal Service", + "jewelry": "Jewelry Store", + "bowling": "Bowling Alley", + "barbers": "Salon / Barbershop", + "menshair": "Salon / Barbershop", + "hair": "Salon / Barbershop", + "flowers": "Flower Shop", + "bakeries": "Bakery", + "grocery": "Grocery Store", + "florists": "Flower Shop", + "homeandgarden": "Garden Center", + "burgers": "Burger Joint", + "bars": "Bar", + "sportsbars": "Sports Bar", + "nightlife": "Nightlife Spot", + "tradamerican": "American Restaurant", + "chinese": "Chinese Restaurant", + "financialservices": "Financial or Legal Service", + "banks": "Credit Union", + "italian": "Italian Restaurant", + "diners": "Diner", + "breakfast_brunch": "Breakfast Spot", + "mexican": "Mexican Restaurant", + "chicken_wings": "Wings Joint", + "physicians": "Doctor's Office", + "pubs": "Pub", + "arts": "Arts & Entertainment", + "theater": "Performing Arts Venue", + "toys": "Toy / Game Store", + "hobbyshops": "Hobby Shop", + "seafood": "Seafood Restaurant", + "nonprofit": "Non-Profit", + "hiking": "Hiking Trail", + "shoes": "Shoe Store", + "accessories": "Accessories Store", + "womenscloth": "Women's Store", + "menscloth": "Men's Store", + "deptstores": "Department Store", + "massage": "Spa / Massage", + "publicservicesgovt": "Government Building", + "postoffices": "Post Office", + "pizza": "Pizza Place", + "car_dealers": "Car Dealership", + "hardware": "Hardware Store", + "homedecor": "Furniture / Home Store", + "motorcyclerepair": "Motorcycle Shop", + "othersalons": "Nail Salon", + "asianfusion": "Asian Restaurant", + "sushi": "Sushi Restaurant", + "french": "French Restaurant", + "beer_and_wine": "Wine Shop", + "realestate": "Real Estate Office", + "hotdogs": "Fast Food Restaurant", + "delis": "Deli / Bodega", + "giftshops": "Gift Shop", + "donuts": "Donut Shop", + "musicvenues": "Music Venue", + "venues": "Event Space", + "lounges": "Lounge", + "hotelstravel": "General Travel", + "carrental": "Rental Car Location", + "tattoo": "Tattoo Parlor", + "newamerican": "New American Restaurant", + "museums": "Museum", + "laundryservices": "Laundry Service", + "laundromat": "Laundry Service", + "icecream": "Ice Cream Shop", + "desserts": "Dessert Shop", + "cupcakes": "Cupcake Shop", + "candy": "Candy Store", + "opticians": "Optical Shop", + "media": "Music Store", + "artsandcrafts": "Arts & Crafts Store", + "galleries": "Art Gallery", + "bridal": "Bridal Shop", + "photographers": "Photography Lab", + "mobilephones": "Mobile Phone Shop", + "sportgoods": "Sporting Goods Shop", + "rock_climbing": "Climbing Gym", + "massage_therapy": "Spa / Massage", + "parks": "Park", + "playgrounds": "Playground", + "gyms": "Gym", + "fitness": "Gym / Fitness Center", + "sports_clubs": "Athletics & Sports", + "tea": "Tea Room", + "usedcardealers": "Car Dealership", + "bikerentals": "Bike Rental / Bike Share", + "bikes": "Bike Shop", + "bike_repair_maintenance": "Bike Shop", + "juicebars": "Juice Bar", + "photographystores": "Photography Lab", + "cosmetics": "Cosmetics Shop", + "drugstores": "Drugstore / Pharmacy", + "vapeshops": "Smoke Shop", + "korean": "Korean Restaurant", + "cosmeticdentists": "Dentist's Office", + "generaldentistry": "Dentist's Office", + "dentists": "Dentist's Office", + "vegetarian": "Vegetarian / Vegan Restaurant", + "wine_bars": "Wine Bar", + "cajun": "Cajun / Creole Restaurant", + "indpak": "Indian Restaurant", + "furniture": "Furniture / Home Store", + "japanese": "Japanese Restaurant", + "cafes": "Caf\u001a\u001a", + "hotdog": "Hot Dog Joint", + "karaoke": "Karaoke Bar", + "comedyclubs": "Comedy Club", + "caribbean": "Caribbean Restaurant", + "electronics": "Electronics Store", + "petservices": "Pet Service", + "petstore": "Pet Store", + "distilleries": "Distillery", + "wineries": "Winery", + "vet": "Veterinarian", + "german": "German Restaurant", + "transport": "Travel & Transport", + "videogamestores": "Video Game Store", + "yoga": "Yoga Studio", + "vietnamese": "Vietnamese Restaurant", + "mediterranean": "Mediterranean Restaurant", + "stadiumsarenas": "Stadium", + "airportlounges": "Airport Lounge", + "gluten_free": "Gluten-free Restaurant", + "medcenters": "Medical Center", + "latin": "Latin American Restaurant", + "chickenshop": "Fried Chicken Joint", + "radiostations": "Radio Station", + "thai": "Thai Restaurant", + "collegeuniv": "College & University", + "bagels": "Bagel Shop", + "funeralservices": "Funeral Home", + "antiques": "Antique Shop", + "divebars": "Dive Bar", + "vintage": "Thrift / Vintage Store", + "foodtrucks": "Food Truck", + "poolhalls": "Pool Hall", + "tanning": "Tanning Salon", + "healthmarkets": "Health Food Store", + "gastropubs": "Gastropub", + "steak": "Steakhouse", + "fishnchips": "Fish & Chips Shop", + "travelservices": "Travel Agency", + "ramen": "Ramen / Noodle House", + "arcades": "Arcade", + "salad": "Salad Place", + "soup": "Soup Place", + "tapas": "Tapas Restaurant", + "hotels": "Hotel", + "tapasmallplates": "Tapas Restaurant", + "breweries": "Brewery", + "bookstores": "Bookstore", + "cafeteria": "Cafeteria", + "realestateagents": "Real Estate Office", + "greek": "Greek Restaurant", + "climbing": "Climbing Gym", + "filipino": "Filipino Restaurant", + "taxis": "Taxi", + "airport_shuttles": "Airport Tram", + "bedbreakfast": "Bed & Breakfast", + "mideastern": "Middle Eastern Restaurant", + "thrift_stores": "Thrift / Vintage Store", + "golf": "Golf Course", + "financialadvising": "Financial or Legal Service", + "spanish": "Spanish Restaurant", + "selfstorage": "Storage Facility", + "resorts": "Resort", + "publictransport": "Travel & Transport", + "trainstations": "Train Station", + "hookah_bars": "Hookah Bar", + "motorcycledealers": "Motorcycle Shop", + "beergardens": "Beer Garden", + "hospitals": "Hospital", + "noodles": "Ramen / Noodle House", + "portuguese": "Portuguese Restaurant", + "realestatesvcs": "Real Estate Office", + "martialarts": "Martial Arts Dojo", + "servicestations": "Gas Station / Garage", + "indonesian": "Indonesian Restaurant", + "tacos": "Taco Place", + "parking": "Parking", + "farmersmarket": "Farmers Market", + "food_court": "Food Court", + "lingerie": "Lingerie Store", + "preschools": "Nursery School", + "southern": "Southern / Soul Food Restaurant", + "paintball": "Paintball Field", + "visitorcenters": "Tourist Information Center", + "recyclingcenter": "Recycling Facility", + "racetracks": "Racetrack", + "musicvideo": "Music Store", + "vinyl_records": "Record Shop", + "vegan": "Vegetarian / Vegan Restaurant", + "cuban": "Cuban Restaurant", + "campgrounds": "Campground", + "dance_schools": "Dance Studio", + "dancestudio": "Dance Studio", + "cocktailbars": "Cocktail Bar", + "turkish": "Turkish Restaurant", + "dog_parks": "Dog Run", + "airports": "Airport", + "pharmacy": "Drugstore / Pharmacy", + "panasian": "Asian Restaurant", + "highschools": "High School", + "elementaryschools": "Elementary School", + "butcher": "Butcher", + "publicmarkets": "Market", + "guitarstores": "Music Store", + "churches": "Church", + "gaybars": "Gay Bar", + "casinos": "Casino", + "malaysian": "Malaysian Restaurant", + "baseballfields": "Baseball Field", + "mongolian": "Mongolian Restaurant", + "dimsum": "Dim Sum Restaurant", + "beaches": "Beach", + "libraries": "Library", + "basketballcourts": "Basketball Court", + "fleamarkets": "Flea Market", + "hostels": "Hostel", + "university_housing": "Sorority House", + "meditationcenters": "Spiritual Center", + "animalshelters": "Animal Shelter", + "brazilian": "Brazilian Restaurant", + "airportterminals": "Airport Terminal", + "tennis": "Tennis", + "travelagents": "Travel Agency", + "football": "Soccer Field", + "jazzandblues": "Jazz Club", + "lakes": "Lake", + "opera": "Opera House", + "cheese": "Cheese Shop", + "skate_parks": "Skate Park", + "african": "African Restaurant", + "emergencyrooms": "Emergency Room", + "ethiopian": "Ethiopian Restaurant", + "aquariums": "Aquarium", + "moroccan": "Moroccan Restaurant", + "skatingrinks": "Skating Rink", + "poolbilliards": "Pool Hall", + "artmuseums": "Art Museum", + "buddhist_temples": "Temple", + "speakeasies": "Speakeasy", + "falafel": "Falafel Restaurant", + "vocation": "Trade School", + "zoos": "Zoo", + "sharedofficespaces": "Office", + "huntingfishingsupplies": "Hunting Supply", + "afghani": "Afghan Restaurant", + "assistedliving": "Assisted Living", + "tabletopgames": "Toy / Game Store", + "skiresorts": "Ski Area", + "buses": "Bus Line", + "peruvian": "Peruvian Restaurant", + "policedepartments": "Police Station", + "internetcafe": "Internet Cafe", + "bikesharing": "Bike Rental / Bike Share", + "swissfood": "Swiss Restaurant", + "nailtechnicians": "Nail Salon", + "argentine": "Argentinian Restaurant", + "farms": "Farm", + "pianobars": "Piano Bar", + "castles": "Castle", + "australian": "Australian Restaurant", + "hindu_temples": "Temple", + "waterparks": "Water Park", + "scandinavian": "Scandinavian Restaurant", + "eastern_european": "Eastern European Restaurant", + "planetarium": "Planetarium", + "productdesign": "Design Studio", + "chinesemartialarts": "Martial Arts Dojo", + "marinas": "Harbor / Marina", + "skiing": "Ski Trail", + "whiskeybars": "Whisky Bar", + "courthouses": "Courthouse", + "embassy": "Embassy / Consulate", + "synagogues": "Synagogue", + "bikeshop": "Bike Shop", + "beachvolleyball": "Volleyball Court", + "mosques": "Mosque", + "emergencymedicine": "Emergency Room", + "fishmonger": "Fish Market", + "publicart": "Public Art", + "trains": "Train", + "bikerepair": "Bike Shop", + "townhall": "City Hall", + "hotel_bar": "Hotel Bar", + "teachersupplies": "Paper / Office Supplies Store", + "publicplazas": "Plaza", + "evchargingstations": "EV Charging Station" +} diff --git a/server/methods.js b/server/methods.js index 1b34180..cd2006b 100644 --- a/server/methods.js +++ b/server/methods.js @@ -3,8 +3,10 @@ import { Meteor } from 'meteor/meteor'; const yelp = require('yelp-fusion'); import { exec } from 'child_process'; -import {ExampleSituations, Queries} from "../lib/collections/collections"; -import {AUTH} from "../lib/config"; +import {Cooccurances, ExampleSituations, Queries, + VisitationModelCheckins, VisitationModelUsers} from "../lib/collections/collections"; +import {AUTH, CONFIG} from "../lib/config"; +const request = require('request'); Meteor.methods({ @@ -16,7 +18,7 @@ Meteor.methods({ let queryString = queryAttributes.query; let request = require('request'); - let url = process.env.AFFINDER_SEARCH_URL + '/categories/' + queryString; + let url = CONFIG.AFFINDER_SEARCH_URL + '/categories/' + queryString; request(url, Meteor.bindEnvironment(function (error, response, body) { if (!error && response.statusCode == 200) { let res = JSON.parse(body); @@ -34,6 +36,74 @@ Meteor.methods({ } } else { console.warn("Yelp Category Search is not returning 200 status code"); + console.warn(response); + } + })); + }, + + searchCooccurances: function(params) { + check(params, { + category: String, + }) + // check Cache + const category = params.category; + let cachedRes = Cooccurances.findOne({'category': category}) + if (cachedRes) { + return cachedRes; + } + let url = 'http://localhost:8001/cooccurances/' + category; + request(url, Meteor.bindEnvironment(function (error, response, body) { + if (!error && response.statusCode == 200) { + let res = JSON.parse(body); + let arrayOfObjects = res.map(tup => { + return {'feature': tup[0], 'frequency': tup[1]} + }); + console.log(arrayOfObjects); + Cooccurances.insert({ + 'category': category, + 'cooccurances': arrayOfObjects + }); + } + })); + }, + + sampleRandomUsers: function(params) { + check(params, { + limit: Number, + detectorId: String, + }) + const limit = params.limit; + const detectorId = params.detectorId; + let random_users_url = `${CONFIG.AFFINDER_VISITATION_URL}/random_users/?limit=${limit}`; + request(random_users_url, Meteor.bindEnvironment(function (error, response, body) { + if (!error && response.statusCode == 200) { + let res = JSON.parse(body); + const userIds = res.users; + VisitationModelUsers.upsert({ + '_id': detectorId, + }, { + '_id': detectorId, + 'users': userIds + }); + userIds.forEach((uid) => { + const period = 2; // likelihood they will participate every X days? + let user_checkins_url = `${CONFIG.AFFINDER_VISITATION_URL}/user_visitation_probability/${uid}/?period=${period}`; + request(user_checkins_url, Meteor.bindEnvironment(function (error1, response1, body1) { + if (!error1 && response1.statusCode == 200) { + let result = JSON.parse(body1); + VisitationModelCheckins.upsert({ + 'uid': result.uid, + }, { + 'uid': result.uid, + 'checkins_by_category': result.checkins_by_category + }); + }; + })); + }) + } + else { + console.warn(error) + console.warn(response) } })); }, @@ -64,7 +134,8 @@ Meteor.methods({ 'detectorId': detectorId, 'categoriesKey': searchParams.categories, 'locationKey': searchParams.location, - 'numCategories': business['categories'].length + 'numCategories': business['categories'].length, + 'reviewCount': business['review_count'] }); ExampleSituations.insert(document); diff --git a/server/publications.js b/server/publications.js index 9ac0325..13235c9 100644 --- a/server/publications.js +++ b/server/publications.js @@ -1,4 +1,5 @@ -import {Queries, Detectors, ExampleSituations, LowLevelDetectors} from "../lib/collections/collections"; +import {Queries, Detectors, ExampleSituations, + LowLevelDetectors, Cooccurances, VisitationModelUsers, VisitationModelCheckins} from "../lib/collections/collections"; Meteor.publish('Queries', function() { // TODO(rlouie): limit to just the summary contents @@ -53,6 +54,7 @@ const situationHumanReadableFields = { "coordinates": true, "categories": true, "numCategories": true, + "reviewCount": true, "labels": true, "predictions": true }; @@ -91,4 +93,17 @@ Meteor.publish('ExampleSituations.HumanReadable.for.detectorId.and.categoriesKey fields: situationHumanReadableFields }); } +}); + +Meteor.publish('Cooccurances', () => { + return Cooccurances.find({}); +}) + +Meteor.publish('VisitationModelUsers', function(detectorId) { + check(detectorId, String); + return VisitationModelUsers.find({'_id': detectorId}) +}); + +Meteor.publish('VisitationModelCheckins', function() { + return VisitationModelCheckins.find({}); }); \ No newline at end of file