summaryrefslogtreecommitdiff
path: root/app_expo
diff options
context:
space:
mode:
authorKirill Rogovoy <[email protected]>2021-07-20 21:24:52 +0300
committerKirill Rogovoy <[email protected]>2021-07-20 21:24:52 +0300
commit5f4611d65e40eae3ca6191a15f68d69ea5a1c4cb (patch)
tree273dfc086444533d86d580961c92ba8d14781a67 /app_expo
parentf0bf4e7afdcd8b02a62be45ab3e7d047ed865a79 (diff)
WIP
Diffstat (limited to 'app_expo')
-rw-r--r--app_expo/app.tsx81
-rw-r--r--app_expo/components/auto-image/auto-image.story.tsx33
-rw-r--r--app_expo/components/auto-image/auto-image.tsx46
-rw-r--r--app_expo/components/bullet-item/bullet-item.tsx41
-rw-r--r--app_expo/components/button/button.presets.ts58
-rw-r--r--app_expo/components/button/button.props.ts35
-rw-r--r--app_expo/components/button/button.story.tsx33
-rw-r--r--app_expo/components/button/button.tsx36
-rw-r--r--app_expo/components/checkbox/checkbox.props.ts44
-rw-r--r--app_expo/components/checkbox/checkbox.story.tsx121
-rw-r--r--app_expo/components/checkbox/checkbox.tsx53
-rw-r--r--app_expo/components/form-row/form-row.presets.ts71
-rw-r--r--app_expo/components/form-row/form-row.props.tsx23
-rw-r--r--app_expo/components/form-row/form-row.story.tsx107
-rw-r--r--app_expo/components/form-row/form-row.tsx13
-rw-r--r--app_expo/components/graph-ui/graph-ui.story.tsx15
-rw-r--r--app_expo/components/graph-ui/graph-ui.tsx48
-rw-r--r--app_expo/components/graph/graph.story.tsx15
-rw-r--r--app_expo/components/graph/graph.tsx529
-rw-r--r--app_expo/components/graph/graphbak.tsx448
-rw-r--r--app_expo/components/graph/graphgood.tsx440
-rw-r--r--app_expo/components/header/header.props.ts45
-rw-r--r--app_expo/components/header/header.story.tsx43
-rw-r--r--app_expo/components/header/header.tsx61
-rw-r--r--app_expo/components/icon/icon.props.ts21
-rw-r--r--app_expo/components/icon/icon.story.tsx19
-rw-r--r--app_expo/components/icon/icon.tsx19
-rw-r--r--app_expo/components/icon/icons/arrow-left.pngbin0 -> 329 bytes
-rw-r--r--app_expo/components/icon/icons/[email protected]bin0 -> 329 bytes
-rw-r--r--app_expo/components/icon/icons/bullet.pngbin0 -> 204 bytes
-rw-r--r--app_expo/components/icon/icons/[email protected]bin0 -> 204 bytes
-rw-r--r--app_expo/components/icon/icons/index.ts6
-rw-r--r--app_expo/components/index.ts16
-rw-r--r--app_expo/components/local-button/local-button.story.tsx15
-rw-r--r--app_expo/components/local-button/local-button.tsx50
-rw-r--r--app_expo/components/local/local.story.tsx15
-rw-r--r--app_expo/components/local/local.tsx36
-rw-r--r--app_expo/components/screen/screen.presets.ts66
-rw-r--r--app_expo/components/screen/screen.props.ts46
-rw-r--r--app_expo/components/screen/screen.tsx66
-rw-r--r--app_expo/components/switch/switch.props.ts39
-rw-r--r--app_expo/components/switch/switch.story.tsx116
-rw-r--r--app_expo/components/switch/switch.tsx114
-rw-r--r--app_expo/components/text-field/text-field.story.tsx159
-rw-r--r--app_expo/components/text-field/text-field.tsx98
-rw-r--r--app_expo/components/text/text.presets.ts48
-rw-r--r--app_expo/components/text/text.props.ts37
-rw-r--r--app_expo/components/text/text.story.tsx92
-rw-r--r--app_expo/components/text/text.tsx28
-rw-r--r--app_expo/components/tweaks/tweaks.story.tsx15
-rw-r--r--app_expo/components/tweaks/tweaks.tsx617
-rw-r--r--app_expo/components/wallpaper/wallpaper.presets.ts34
-rw-r--r--app_expo/components/wallpaper/wallpaper.props.ts19
-rw-r--r--app_expo/components/wallpaper/wallpaper.story.tsx16
-rw-r--r--app_expo/components/wallpaper/wallpaper.tsx25
-rw-r--r--app_expo/config/env.js1
-rw-r--r--app_expo/data/miserables.json337
-rw-r--r--app_expo/data/pythonserver.py17
-rw-r--r--app_expo/data/rando.json2102
-rw-r--r--app_expo/data/randomdata.js11
-rw-r--r--app_expo/data/randomdata.tsx11
-rw-r--r--app_expo/data/randorev.json1810
-rw-r--r--app_expo/data/randorevog.json4202
-rw-r--r--app_expo/data/roam.json7138
-rw-r--r--app_expo/i18n/en.json34
-rw-r--r--app_expo/i18n/i18n.ts22
-rw-r--r--app_expo/i18n/index.ts3
-rw-r--r--app_expo/i18n/ja.json7
-rw-r--r--app_expo/i18n/translate.ts11
-rw-r--r--app_expo/models/character-store/character-store.test.ts7
-rw-r--r--app_expo/models/character-store/character-store.ts37
-rw-r--r--app_expo/models/character/character.test.ts10
-rw-r--r--app_expo/models/character/character.ts17
-rw-r--r--app_expo/models/environment.ts40
-rw-r--r--app_expo/models/extensions/with-environment.ts17
-rw-r--r--app_expo/models/extensions/with-root-store.ts17
-rw-r--r--app_expo/models/index.ts5
-rw-r--r--app_expo/models/root-store/root-store-context.ts22
-rw-r--r--app_expo/models/root-store/root-store.ts20
-rw-r--r--app_expo/models/root-store/setup-root-store.ts55
-rw-r--r--app_expo/navigators/index.ts4
-rw-r--r--app_expo/navigators/main-navigator.tsx59
-rw-r--r--app_expo/navigators/navigation-utilities.tsx127
-rw-r--r--app_expo/navigators/root-navigator.tsx59
-rw-r--r--app_expo/screens/demo/demo-list-screen.tsx86
-rw-r--r--app_expo/screens/demo/demo-screen.tsx180
-rw-r--r--app_expo/screens/demo/heart.pngbin0 -> 204 bytes
-rw-r--r--app_expo/screens/demo/[email protected]bin0 -> 377 bytes
-rw-r--r--app_expo/screens/demo/logo-ignite.pngbin0 -> 9427 bytes
-rw-r--r--app_expo/screens/demo/[email protected]bin0 -> 20283 bytes
-rw-r--r--app_expo/screens/graph/graph-screen.tsx264
-rw-r--r--app_expo/screens/index.ts5
-rw-r--r--app_expo/screens/welcome/bowser.pngbin0 -> 33502 bytes
-rw-r--r--app_expo/screens/welcome/[email protected]bin0 -> 79259 bytes
-rw-r--r--app_expo/screens/welcome/welcome-screen.tsx118
-rw-r--r--app_expo/services/api/api-config.ts27
-rw-r--r--app_expo/services/api/api-problem.test.ts100
-rw-r--r--app_expo/services/api/api-problem.ts74
-rw-r--r--app_expo/services/api/api.ts102
-rw-r--r--app_expo/services/api/api.types.ts13
-rw-r--r--app_expo/services/api/character-api.ts37
-rw-r--r--app_expo/services/api/index.ts2
-rw-r--r--app_expo/services/reactotron/index.ts1
-rw-r--r--app_expo/services/reactotron/reactotron-config.ts30
-rw-r--r--app_expo/services/reactotron/reactotron.ts185
-rw-r--r--app_expo/services/reactotron/tron.ts2
-rw-r--r--app_expo/services/reactotron/tron.web.ts2
-rw-r--r--app_expo/theme/color.ts64
-rw-r--r--app_expo/theme/fonts/index.ts12
-rw-r--r--app_expo/theme/index.ts4
-rw-r--r--app_expo/theme/palette.ts11
-rw-r--r--app_expo/theme/spacing.ts41
-rw-r--r--app_expo/theme/timing.ts6
-rw-r--r--app_expo/theme/typography.ts31
-rw-r--r--app_expo/utils/delay.ts6
-rw-r--r--app_expo/utils/ignore-warnings.ts10
-rw-r--r--app_expo/utils/keychain.ts63
-rw-r--r--app_expo/utils/storage/index.ts1
-rw-r--r--app_expo/utils/storage/storage.test.ts39
-rw-r--r--app_expo/utils/storage/storage.ts79
-rw-r--r--app_expo/utils/validate.ts77
121 files changed, 22145 insertions, 0 deletions
diff --git a/app_expo/app.tsx b/app_expo/app.tsx
new file mode 100644
index 0000000..8627efd
--- /dev/null
+++ b/app_expo/app.tsx
@@ -0,0 +1,81 @@
+/**
+ * Welcome to the main entry point of the app. In this file, we'll
+ * be kicking off our app.
+ *
+ * Most of this file is boilerplate and you shouldn't need to modify
+ * it very often. But take some time to look through and understand
+ * what is going on here.
+ *
+ * The app navigation resides in ./app/navigators, so head over there
+ * if you're interested in adding screens and navigators.
+ */
+import './i18n'
+import './utils/ignore-warnings'
+import React, { useState, useEffect, useRef } from 'react'
+import { NavigationContainerRef } from '@react-navigation/native'
+import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context'
+import { initFonts } from './theme/fonts' // expo
+import * as storage from './utils/storage'
+import {
+ useBackButtonHandler,
+ RootNavigator,
+ canExit,
+ setRootNavigation,
+ useNavigationPersistence,
+} from './navigators'
+import { RootStore, RootStoreProvider, setupRootStore } from './models'
+import { ToggleStorybook } from '../storybook/toggle-storybook'
+
+// This puts screens in a native ViewController or Activity. If you want fully native
+// stack navigation, use `createNativeStackNavigator` in place of `createStackNavigator`:
+// https://github.com/kmagiera/react-native-screens#using-native-stack-navigator
+import { enableScreens } from 'react-native-screens'
+enableScreens()
+
+export const NAVIGATION_PERSISTENCE_KEY = 'NAVIGATION_STATE'
+
+/**
+ * This is the root component of our app.
+ */
+function App() {
+ const navigationRef = useRef<NavigationContainerRef>(null)
+ const [rootStore, setRootStore] = useState<RootStore | undefined>(undefined)
+
+ setRootNavigation(navigationRef)
+ useBackButtonHandler(navigationRef, canExit)
+ const { initialNavigationState, onNavigationStateChange } = useNavigationPersistence(
+ storage,
+ NAVIGATION_PERSISTENCE_KEY,
+ )
+
+ // Kick off initial async loading actions, like loading fonts and RootStore
+ useEffect(() => {
+ ;(async () => {
+ await initFonts() // expo
+ setupRootStore().then(setRootStore)
+ })()
+ }, [])
+
+ // Before we show the app, we have to wait for our state to be ready.
+ // In the meantime, don't render anything. This will be the background
+ // color set in native by rootView's background color. You can replace
+ // with your own loading component if you wish.
+ if (!rootStore) return null
+
+ // otherwise, we're ready to render the app
+ return (
+ <ToggleStorybook>
+ <RootStoreProvider value={rootStore}>
+ <SafeAreaProvider initialMetrics={initialWindowMetrics}>
+ <RootNavigator
+ ref={navigationRef}
+ initialState={initialNavigationState}
+ onStateChange={onNavigationStateChange}
+ />
+ </SafeAreaProvider>
+ </RootStoreProvider>
+ </ToggleStorybook>
+ )
+}
+
+export default App
diff --git a/app_expo/components/auto-image/auto-image.story.tsx b/app_expo/components/auto-image/auto-image.story.tsx
new file mode 100644
index 0000000..af74efe
--- /dev/null
+++ b/app_expo/components/auto-image/auto-image.story.tsx
@@ -0,0 +1,33 @@
+/* eslint-disable */
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { AutoImage } from './auto-image'
+
+declare let module
+
+const bowser = require('../../screens/welcome/bowser.png')
+const morty = {
+ uri: 'https://rickandmortyapi.com/api/character/avatar/2.jpeg',
+}
+
+storiesOf('AutoImage', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="With require()">
+ <AutoImage source={bowser} />
+ <AutoImage source={bowser} style={{ width: 150 }} />
+ <AutoImage source={bowser} style={{ width: 150, height: 150 }} />
+ <AutoImage source={bowser} style={{ height: 150 }} />
+ <AutoImage source={bowser} style={{ height: 150, resizeMode: 'contain' }} />
+ </UseCase>
+ <UseCase text="With URL">
+ <AutoImage source={morty} />
+ <AutoImage source={morty} style={{ width: 150 }} />
+ <AutoImage source={morty} style={{ width: 150, height: 150 }} />
+ <AutoImage source={morty} style={{ height: 150 }} />
+ <AutoImage source={morty} style={{ height: 150, resizeMode: 'contain' }} />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/auto-image/auto-image.tsx b/app_expo/components/auto-image/auto-image.tsx
new file mode 100644
index 0000000..a8bfe37
--- /dev/null
+++ b/app_expo/components/auto-image/auto-image.tsx
@@ -0,0 +1,46 @@
+import React, { useLayoutEffect, useState } from 'react'
+import {
+ Image as RNImage,
+ ImageProps as DefaultImageProps,
+ ImageURISource,
+ Platform,
+} from 'react-native'
+
+type ImageProps = DefaultImageProps & {
+ source: ImageURISource
+}
+
+/**
+ * An Image wrapper component that autosizes itself to the size of the actual image.
+ * You can always override by passing a width and height in the style.
+ * If passing only one of width/height this image component will use the actual
+ * size of the other dimension.
+ *
+ * This component isn't required, but is provided as a convenience so that
+ * we don't have to remember to explicitly set image sizes on every image instance.
+ *
+ * To use as a stand-in replacement import { AutoImage as Image } and remove the
+ * Image import from react-native. Now all images in that file are handled by this
+ * component and are web-ready if not explicitly sized in the style property.
+ */
+export function AutoImage(props: ImageProps) {
+ const [imageSize, setImageSize] = useState({ width: 0, height: 0 })
+
+ useLayoutEffect(() => {
+ if (props.source?.uri) {
+ RNImage.getSize(props.source.uri as any, (width, height) => {
+ setImageSize({ width, height })
+ })
+ } else if (Platform.OS === 'web') {
+ // web requires a different method to get it's size
+ RNImage.getSize(props.source as any, (width, height) => {
+ setImageSize({ width, height })
+ })
+ } else {
+ const { width, height } = RNImage.resolveAssetSource(props.source)
+ setImageSize({ width, height })
+ }
+ }, [])
+
+ return <RNImage {...props} style={[imageSize, props.style]} />
+}
diff --git a/app_expo/components/bullet-item/bullet-item.tsx b/app_expo/components/bullet-item/bullet-item.tsx
new file mode 100644
index 0000000..f6b2f17
--- /dev/null
+++ b/app_expo/components/bullet-item/bullet-item.tsx
@@ -0,0 +1,41 @@
+import * as React from 'react'
+import { View, ViewStyle, ImageStyle, TextStyle } from 'react-native'
+import { Text } from '../text/text'
+import { Icon } from '../icon/icon'
+import { spacing, typography } from '../../theme'
+
+const BULLET_ITEM: ViewStyle = {
+ flexDirection: 'row',
+ marginTop: spacing[4],
+ paddingBottom: spacing[4],
+ borderBottomWidth: 1,
+ borderBottomColor: '#3A3048',
+}
+const BULLET_CONTAINER: ViewStyle = {
+ marginRight: spacing[4] - 1,
+ marginTop: spacing[2],
+}
+const BULLET: ImageStyle = {
+ width: 8,
+ height: 8,
+}
+const BULLET_TEXT: TextStyle = {
+ flex: 1,
+ fontFamily: typography.primary,
+ color: '#BAB6C8',
+ fontSize: 15,
+ lineHeight: 22,
+}
+
+export interface BulletItemProps {
+ text: string
+}
+
+export function BulletItem(props: BulletItemProps) {
+ return (
+ <View style={BULLET_ITEM}>
+ <Icon icon="bullet" containerStyle={BULLET_CONTAINER} style={BULLET} />
+ <Text style={BULLET_TEXT} text={props.text} />
+ </View>
+ )
+}
diff --git a/app_expo/components/button/button.presets.ts b/app_expo/components/button/button.presets.ts
new file mode 100644
index 0000000..bc0ad3f
--- /dev/null
+++ b/app_expo/components/button/button.presets.ts
@@ -0,0 +1,58 @@
+import { ViewStyle, TextStyle } from 'react-native'
+import { color, spacing } from '../../theme'
+
+/**
+ * All text will start off looking like this.
+ */
+const BASE_VIEW: ViewStyle = {
+ paddingVertical: spacing[2],
+ paddingHorizontal: spacing[2],
+ borderRadius: 4,
+ justifyContent: 'center',
+ alignItems: 'center',
+}
+
+const BASE_TEXT: TextStyle = {
+ paddingHorizontal: spacing[3],
+}
+
+/**
+ * All the variations of text styling within the app.
+ *
+ * You want to customize these to whatever you need in your app.
+ */
+export const viewPresets: Record<string, ViewStyle> = {
+ /**
+ * A smaller piece of secondard information.
+ */
+ primary: { ...BASE_VIEW, backgroundColor: color.palette.orange } as ViewStyle,
+
+ /**
+ * A button without extras.
+ */
+ link: {
+ ...BASE_VIEW,
+ paddingHorizontal: 0,
+ paddingVertical: 0,
+ alignItems: 'flex-start',
+ } as ViewStyle,
+}
+
+export const textPresets: Record<ButtonPresetNames, TextStyle> = {
+ primary: {
+ ...BASE_TEXT,
+ fontSize: 9,
+ color: color.palette.white,
+ } as TextStyle,
+ link: {
+ ...BASE_TEXT,
+ color: color.text,
+ paddingHorizontal: 0,
+ paddingVertical: 0,
+ } as TextStyle,
+}
+
+/**
+ * A list of preset names.
+ */
+export type ButtonPresetNames = keyof typeof viewPresets
diff --git a/app_expo/components/button/button.props.ts b/app_expo/components/button/button.props.ts
new file mode 100644
index 0000000..810e0aa
--- /dev/null
+++ b/app_expo/components/button/button.props.ts
@@ -0,0 +1,35 @@
+import { StyleProp, TextStyle, TouchableOpacityProps, ViewStyle } from 'react-native'
+import { ButtonPresetNames } from './button.presets'
+import { TxKeyPath } from '../../i18n'
+
+export interface ButtonProps extends TouchableOpacityProps {
+ /**
+ * Text which is looked up via i18n.
+ */
+ tx?: TxKeyPath
+
+ /**
+ * The text to display if not using `tx` or nested components.
+ */
+ text?: string
+
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * An optional style override useful for the button text.
+ */
+ textStyle?: StyleProp<TextStyle>
+
+ /**
+ * One of the different types of text presets.
+ */
+ preset?: ButtonPresetNames
+
+ /**
+ * One of the different types of text presets.
+ */
+ children?: React.ReactNode
+}
diff --git a/app_expo/components/button/button.story.tsx b/app_expo/components/button/button.story.tsx
new file mode 100644
index 0000000..54dc2a9
--- /dev/null
+++ b/app_expo/components/button/button.story.tsx
@@ -0,0 +1,33 @@
+import * as React from 'react'
+import { ViewStyle, TextStyle, Alert } from 'react-native'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Button } from './button'
+
+declare let module
+
+const buttonStyleArray: ViewStyle[] = [{ paddingVertical: 100 }, { borderRadius: 0 }]
+
+const buttonTextStyleArray: TextStyle[] = [{ fontSize: 20 }, { color: '#a511dc' }]
+
+storiesOf('Button', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="Primary" usage="The primary button.">
+ <Button text="Click It" preset="primary" onPress={() => Alert.alert('pressed')} />
+ </UseCase>
+ <UseCase text="Disabled" usage="The disabled behaviour of the primary button.">
+ <Button text="Click It" preset="primary" onPress={() => Alert.alert('pressed')} disabled />
+ </UseCase>
+ <UseCase text="Array Style" usage="Button with array style">
+ <Button
+ text="Click It"
+ preset="primary"
+ onPress={() => Alert.alert('pressed')}
+ style={buttonStyleArray}
+ textStyle={buttonTextStyleArray}
+ />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/button/button.tsx b/app_expo/components/button/button.tsx
new file mode 100644
index 0000000..03b8f85
--- /dev/null
+++ b/app_expo/components/button/button.tsx
@@ -0,0 +1,36 @@
+import * as React from 'react'
+import { TouchableOpacity } from 'react-native'
+import { Text } from '../text/text'
+import { viewPresets, textPresets } from './button.presets'
+import { ButtonProps } from './button.props'
+
+/**
+ * For your text displaying needs.
+ *
+ * This component is a HOC over the built-in React Native one.
+ */
+export function Button(props: ButtonProps) {
+ // grab the props
+ const {
+ preset = 'primary',
+ tx,
+ text,
+ style: styleOverride,
+ textStyle: textStyleOverride,
+ children,
+ ...rest
+ } = props
+
+ const viewStyle = viewPresets[preset] || viewPresets.primary
+ const viewStyles = [viewStyle, styleOverride]
+ const textStyle = textPresets[preset] || textPresets.primary
+ const textStyles = [textStyle, textStyleOverride]
+
+ const content = children || <Text tx={tx} text={text} style={textStyles} />
+
+ return (
+ <TouchableOpacity style={viewStyles} {...rest}>
+ {content}
+ </TouchableOpacity>
+ )
+}
diff --git a/app_expo/components/checkbox/checkbox.props.ts b/app_expo/components/checkbox/checkbox.props.ts
new file mode 100644
index 0000000..4a212e3
--- /dev/null
+++ b/app_expo/components/checkbox/checkbox.props.ts
@@ -0,0 +1,44 @@
+import { StyleProp, ViewStyle } from 'react-native'
+import { TxKeyPath } from '../../i18n'
+
+export interface CheckboxProps {
+ /**
+ * Additional container style. Useful for margins.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * Additional outline style.
+ */
+ outlineStyle?: StyleProp<ViewStyle>
+
+ /**
+ * Additional fill style. Only visible when checked.
+ */
+ fillStyle?: StyleProp<ViewStyle>
+
+ /**
+ * Is the checkbox checked?
+ */
+ value?: boolean
+
+ /**
+ * The text to display if there isn't a tx.
+ */
+ text?: string
+
+ /**
+ * The i18n lookup key.
+ */
+ tx?: TxKeyPath
+
+ /**
+ * Multiline or clipped single line?
+ */
+ multiline?: boolean
+
+ /**
+ * Fires when the user tabs to change the value.
+ */
+ onToggle?: (newValue: boolean) => void
+}
diff --git a/app_expo/components/checkbox/checkbox.story.tsx b/app_expo/components/checkbox/checkbox.story.tsx
new file mode 100644
index 0000000..a6dce83
--- /dev/null
+++ b/app_expo/components/checkbox/checkbox.story.tsx
@@ -0,0 +1,121 @@
+/* eslint-disable react-native/no-inline-styles */
+/* eslint-disable react-native/no-color-literals */
+
+import * as React from 'react'
+import { View, ViewStyle } from 'react-native'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Checkbox } from './checkbox'
+import { Toggle } from 'react-powerplug'
+
+declare let module
+
+const arrayStyle: ViewStyle[] = [{ paddingVertical: 40 }, { alignSelf: 'flex-end' }]
+const arrayOutlineStyle: ViewStyle[] = [{ borderColor: '#b443c9' }, { borderWidth: 25 }]
+const arrayFillStyle: ViewStyle[] = [{ backgroundColor: '#55e0ff' }]
+
+storiesOf('Checkbox', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Behaviour', () => (
+ <Story>
+ <UseCase text="The Checkbox" usage="Use the checkbox to represent on/off states.">
+ <Toggle initial={false}>
+ {({ on, toggle }) => <Checkbox value={on} onToggle={toggle} text="Toggle me" />}
+ </Toggle>
+ </UseCase>
+ <UseCase text="value = true" usage="This is permanently on.">
+ <Checkbox value={true} text="Always on" />
+ </UseCase>
+ <UseCase text="value = false" usage="This is permanantly off.">
+ <Checkbox value={false} text="Always off" />
+ </UseCase>
+ </Story>
+ ))
+ .add('Styling', () => (
+ <Story>
+ <UseCase text="multiline = true" usage="For really really long text">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Checkbox
+ text="We’re an App Design & Development Team. Experts in mobile & web technologies. We create beautiful, functional mobile apps and websites."
+ value={on}
+ multiline
+ onToggle={toggle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+ <UseCase text=".style" usage="Override the container style">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Checkbox
+ text="Hello there!"
+ value={on}
+ style={{
+ backgroundColor: 'purple',
+ marginLeft: 40,
+ paddingVertical: 30,
+ paddingLeft: 60,
+ }}
+ onToggle={toggle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+ <UseCase text=".outlineStyle" usage="Override the outline style">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Checkbox
+ text="Outline is the box frame"
+ value={on}
+ outlineStyle={{
+ borderColor: 'green',
+ borderRadius: 10,
+ borderWidth: 4,
+ width: 60,
+ height: 20,
+ }}
+ onToggle={toggle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+ <UseCase text=".fillStyle" usage="Override the fill style">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Checkbox
+ text="Fill er up"
+ value={on}
+ fillStyle={{ backgroundColor: 'red', borderRadius: 8 }}
+ onToggle={toggle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+
+ <UseCase text="Array style" usage="Use array styles">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Checkbox
+ text="Check it twice"
+ value={on}
+ onToggle={toggle}
+ style={arrayStyle}
+ outlineStyle={arrayOutlineStyle}
+ fillStyle={arrayFillStyle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/checkbox/checkbox.tsx b/app_expo/components/checkbox/checkbox.tsx
new file mode 100644
index 0000000..fba748e
--- /dev/null
+++ b/app_expo/components/checkbox/checkbox.tsx
@@ -0,0 +1,53 @@
+import * as React from 'react'
+import { TextStyle, TouchableOpacity, View, ViewStyle } from 'react-native'
+import { Text } from '../text/text'
+import { color, spacing } from '../../theme'
+import { CheckboxProps } from './checkbox.props'
+
+const ROOT: ViewStyle = {
+ flexDirection: 'row',
+ paddingVertical: spacing[1],
+ alignSelf: 'flex-start',
+}
+
+const DIMENSIONS = { width: 16, height: 16 }
+
+const OUTLINE: ViewStyle = {
+ ...DIMENSIONS,
+ marginTop: 2, // finicky and will depend on font/line-height/baseline/weather
+ justifyContent: 'center',
+ alignItems: 'center',
+ borderWidth: 1,
+ borderColor: color.primaryDarker,
+ borderRadius: 1,
+}
+
+const FILL: ViewStyle = {
+ width: DIMENSIONS.width - 4,
+ height: DIMENSIONS.height - 4,
+ backgroundColor: color.primary,
+}
+
+const LABEL: TextStyle = { paddingLeft: spacing[2] }
+
+export function Checkbox(props: CheckboxProps) {
+ const numberOfLines = props.multiline ? 0 : 1
+
+ const rootStyle = [ROOT, props.style]
+ const outlineStyle = [OUTLINE, props.outlineStyle]
+ const fillStyle = [FILL, props.fillStyle]
+
+ const onPress = props.onToggle ? () => props.onToggle && props.onToggle(!props.value) : null
+
+ return (
+ <TouchableOpacity
+ activeOpacity={1}
+ disabled={!props.onToggle}
+ onPress={onPress}
+ style={rootStyle}
+ >
+ <View style={outlineStyle}>{props.value && <View style={fillStyle} />}</View>
+ <Text text={props.text} tx={props.tx} numberOfLines={numberOfLines} style={LABEL} />
+ </TouchableOpacity>
+ )
+}
diff --git a/app_expo/components/form-row/form-row.presets.ts b/app_expo/components/form-row/form-row.presets.ts
new file mode 100644
index 0000000..0c796c2
--- /dev/null
+++ b/app_expo/components/form-row/form-row.presets.ts
@@ -0,0 +1,71 @@
+import { ViewStyle } from 'react-native'
+import { color, spacing } from '../../theme'
+
+/**
+ * The size of the border radius.
+ */
+const RADIUS = 8
+
+/**
+ * The default style of the container.
+ */
+const ROOT: ViewStyle = {
+ borderWidth: 1,
+ borderColor: color.line,
+ padding: spacing[2],
+}
+
+/**
+ * What each of the presets look like.
+ */
+export const PRESETS = {
+ /**
+ * Rounded borders on the the top only.
+ */
+ top: {
+ ...ROOT,
+ borderTopLeftRadius: RADIUS,
+ borderTopRightRadius: RADIUS,
+ borderBottomWidth: 0,
+ },
+ /**
+ * No rounded borders.
+ */
+ middle: {
+ ...ROOT,
+ borderBottomWidth: 0,
+ },
+ /**
+ * Rounded borders on the bottom.
+ */
+ bottom: {
+ ...ROOT,
+ borderBottomLeftRadius: RADIUS,
+ borderBottomRightRadius: RADIUS,
+ },
+ /**
+ * Rounded borders everywhere.
+ */
+ soloRound: {
+ ...ROOT,
+ borderRadius: RADIUS,
+ },
+ /**
+ * Straight borders everywhere.
+ */
+ soloStraight: {
+ ...ROOT,
+ },
+ /**
+ * Transparent borders useful to keep things lined up.
+ */
+ clear: {
+ ...ROOT,
+ borderColor: color.transparent,
+ },
+}
+
+/**
+ * The names of the presets supported by FormRow.
+ */
+export type FormRowPresets = keyof typeof PRESETS
diff --git a/app_expo/components/form-row/form-row.props.tsx b/app_expo/components/form-row/form-row.props.tsx
new file mode 100644
index 0000000..55b632e
--- /dev/null
+++ b/app_expo/components/form-row/form-row.props.tsx
@@ -0,0 +1,23 @@
+import * as React from 'react'
+import { StyleProp, ViewStyle } from 'react-native'
+import { FormRowPresets } from './form-row.presets'
+
+/**
+ * The properties you can pass to FormRow.
+ */
+export interface FormRowProps {
+ /**
+ * Children components.
+ */
+ children?: React.ReactNode
+
+ /**
+ * Override the container style... useful for margins and padding.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * The type of border.
+ */
+ preset: FormRowPresets
+}
diff --git a/app_expo/components/form-row/form-row.story.tsx b/app_expo/components/form-row/form-row.story.tsx
new file mode 100644
index 0000000..ea84e04
--- /dev/null
+++ b/app_expo/components/form-row/form-row.story.tsx
@@ -0,0 +1,107 @@
+/* eslint-disable react-native/no-inline-styles */
+/* eslint-disable react-native/no-color-literals */
+
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Text, FormRow } from '../'
+import { color } from '../../theme/color'
+import { ViewStyle } from 'react-native'
+
+declare let module
+
+const TEXT_STYLE_OVERRIDE = {
+ color: color.storybookTextColor,
+}
+const arrayStyle: ViewStyle[] = [{ borderWidth: 5 }, { borderColor: '#32cd32' }]
+
+storiesOf('FormRow', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Assembled', () => (
+ <Story>
+ <UseCase
+ text="Fully Assembled"
+ usage="FormRow has many parts designed to fit together. Here is what it looks like all assembled."
+ >
+ <FormRow preset="top">
+ <Text preset="fieldLabel" style={TEXT_STYLE_OVERRIDE}>
+ Hello! I am at the top
+ </Text>
+ </FormRow>
+ <FormRow preset="middle">
+ <Text style={TEXT_STYLE_OVERRIDE}>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi officia quo rerum
+ impedit asperiores hic ex quae, quam dolores vel odit doloribus, tempore atque deserunt
+ possimus incidunt, obcaecati numquam officiis.
+ </Text>
+ </FormRow>
+ <FormRow preset="middle">
+ <Text preset="secondary" style={TEXT_STYLE_OVERRIDE}>
+ ...one more thing
+ </Text>
+ </FormRow>
+ <FormRow preset="bottom">
+ <Text style={TEXT_STYLE_OVERRIDE}>🎉 Footers!</Text>
+ </FormRow>
+ </UseCase>
+ <UseCase text="Alternatives" usage="Less commonly used presets.">
+ <FormRow preset="clear">
+ <Text style={TEXT_STYLE_OVERRIDE}>
+ My borders are still there, but they are clear. This causes the text to still align
+ properly due to the box model of flexbox.
+ </Text>
+ </FormRow>
+ <FormRow preset="soloRound">
+ <Text style={TEXT_STYLE_OVERRIDE}>I'm round</Text>
+ </FormRow>
+ <FormRow preset="soloStraight" style={{ marginTop: 10, backgroundColor: '#ffe' }}>
+ <Text style={TEXT_STYLE_OVERRIDE}>I'm square and have a custom style.</Text>
+ </FormRow>
+ </UseCase>
+ </Story>
+ ))
+ .add('Presets', () => (
+ <Story>
+ <UseCase text="top" usage="The top of a form.">
+ <FormRow preset="top">
+ <Text style={TEXT_STYLE_OVERRIDE}>Curved borders at the top.</Text>
+ <Text style={TEXT_STYLE_OVERRIDE}>Nothing below</Text>
+ </FormRow>
+ </UseCase>
+ <UseCase text="middle" usage="A row in the middle of a form.">
+ <FormRow preset="middle">
+ <Text style={TEXT_STYLE_OVERRIDE}>No curves and empty at the bottom.</Text>
+ </FormRow>
+ </UseCase>
+ <UseCase text="bottom" usage="The bottom of a form.">
+ <FormRow preset="bottom">
+ <Text style={TEXT_STYLE_OVERRIDE}>Curved at the bottom</Text>
+ <Text style={TEXT_STYLE_OVERRIDE}>Line at the top.</Text>
+ </FormRow>
+ </UseCase>
+ <UseCase text="soloRound" usage="A standalone curved form row.">
+ <FormRow preset="soloRound">
+ <Text style={TEXT_STYLE_OVERRIDE}>Curves all around.</Text>
+ </FormRow>
+ </UseCase>
+ <UseCase text="soloStraight" usage="A standalone straight form row.">
+ <FormRow preset="soloStraight">
+ <Text style={TEXT_STYLE_OVERRIDE}>Curves nowhere.</Text>
+ </FormRow>
+ </UseCase>
+ <UseCase text="clear" usage="Identical dimensions but transparent edges.">
+ <FormRow preset="clear">
+ <Text style={TEXT_STYLE_OVERRIDE}>Curves nowhere.</Text>
+ </FormRow>
+ </UseCase>
+ </Story>
+ ))
+ .add('Styling', () => (
+ <Story>
+ <UseCase text="Style array" usage="Form row with an array of styles">
+ <FormRow preset="soloStraight" style={arrayStyle}>
+ <Text style={TEXT_STYLE_OVERRIDE}>Array style.</Text>
+ </FormRow>
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/form-row/form-row.tsx b/app_expo/components/form-row/form-row.tsx
new file mode 100644
index 0000000..c6453bc
--- /dev/null
+++ b/app_expo/components/form-row/form-row.tsx
@@ -0,0 +1,13 @@
+import * as React from 'react'
+import { View } from 'react-native'
+import { PRESETS } from './form-row.presets'
+import { FormRowProps } from './form-row.props'
+
+/**
+ * A horizontal container component used to hold a row of a form.
+ */
+export function FormRow(props: FormRowProps) {
+ const viewStyle = [PRESETS[props.preset], props.style]
+
+ return <View style={viewStyle}>{props.children}</View>
+}
diff --git a/app_expo/components/graph-ui/graph-ui.story.tsx b/app_expo/components/graph-ui/graph-ui.story.tsx
new file mode 100644
index 0000000..7564c93
--- /dev/null
+++ b/app_expo/components/graph-ui/graph-ui.story.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { color } from '../../theme'
+import { GraphUi } from './graph-ui'
+
+storiesOf('GraphUi', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="Primary" usage="The primary.">
+ <GraphUi style={{ backgroundColor: color.error }} />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/graph-ui/graph-ui.tsx b/app_expo/components/graph-ui/graph-ui.tsx
new file mode 100644
index 0000000..36a675a
--- /dev/null
+++ b/app_expo/components/graph-ui/graph-ui.tsx
@@ -0,0 +1,48 @@
+import * as React from 'react'
+import { StyleProp, TextStyle, View, ViewStyle } from 'react-native'
+import { observer } from 'mobx-react-lite'
+import { color, typography } from '../../theme'
+import { LocalButton, Text, Tweaks } from '../'
+import { flatten } from 'ramda'
+
+const CONTAINER: ViewStyle = {
+ justifyContent: 'center',
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface GraphUiProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+ physics
+ setPhysics
+}
+
+/**
+ * Describe your component here
+ */
+export const GraphUi = observer(function GraphUi(props: GraphUiProps) {
+ const { style, physics, setPhysics } = props
+ const styles = flatten([CONTAINER, style])
+
+ return (
+ <View
+ style={{
+ height: '100%',
+ width: '100%',
+ borderStyle: 'solid',
+ borderWidth: 5,
+ position: 'relative',
+ }}
+ >
+ <Tweaks physics={physics} setPhysics={setPhysics} />
+ <LocalButton physics={physics} setPhysics={setPhysics} />
+ </View>
+ )
+})
diff --git a/app_expo/components/graph/graph.story.tsx b/app_expo/components/graph/graph.story.tsx
new file mode 100644
index 0000000..3b094d9
--- /dev/null
+++ b/app_expo/components/graph/graph.story.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { color } from '../../theme'
+import { Graph } from './graph'
+
+storiesOf('Graph', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="Primary" usage="The primary.">
+ <Graph style={{ backgroundColor: color.error }} />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/graph/graph.tsx b/app_expo/components/graph/graph.tsx
new file mode 100644
index 0000000..0c959ec
--- /dev/null
+++ b/app_expo/components/graph/graph.tsx
@@ -0,0 +1,529 @@
+import * as React from 'react'
+import { useState, useEffect, useRef, useMemo, useCallback } from 'react'
+import { StyleProp, TextStyle, View, ViewStyle } from 'react-native'
+import { observer } from 'mobx-react-lite'
+import { color, typography } from '../../theme'
+import { Text } from '../'
+import { flatten } from 'ramda'
+
+//import data from "../../data/miserables.json"
+//import genRandomTree from "../../data/randomdata";
+//import gData from "../../data/rando.json"
+
+import { ForceGraph2D, ForceGraph3D, ForceGraphVR, ForceGraphAR } from 'react-force-graph'
+import * as d3 from 'd3-force-3d'
+//import * as three from "three"
+import SpriteText from 'three-spritetext'
+
+const CONTAINER: ViewStyle = {
+ justifyContent: 'center',
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface GraphProps {
+ style?: StyleProp<ViewStyle>
+ physics
+ gData
+ setPhysics
+ nodeIds: string[]
+ threeDim
+ setThreeDim
+ local
+ setLocal
+}
+
+export const Graph = observer(function Graph(props: GraphProps): JSX.Element {
+ const { style, physics, setPhysics, gData, threeDim, setThreeDim, local, setLocal } = props
+ const styles = flatten([CONTAINER, style])
+
+ const fgRef = useRef()
+
+ const GROUPS: number = 12
+ const NODE_R: number = 8
+ //const gData = genRandomTree(200);
+
+ //const [charge, setCharge] = useState(-30);
+ //const [link, setLink] = useState(-30);
+
+ useEffect(() => {
+ const fg = fgRef.current
+ //fg.d3Force('center').strength(0.05);
+ if (physics.gravityOn) {
+ fg.d3Force('x', d3.forceX().strength(physics.gravity))
+ fg.d3Force('y', d3.forceY().strength(physics.gravity))
+ if (threeDim) {
+ if (physics.galaxy) {
+ fg.d3Force('x', d3.forceX().strength(physics.gravity / 5))
+ fg.d3Force('z', d3.forceZ().strength(physics.gravity / 5))
+ } else {
+ fg.d3Force('x', d3.forceX().strength(physics.gravity))
+ fg.d3Force('z', d3.forceZ().strength(physics.gravity))
+ }
+ } else {
+ fg.d3Force('z', null)
+ }
+ } else {
+ fg.d3Force('x', null)
+ fg.d3Force('y', null)
+ threeDim ? fg.d3Force('z', null) : null
+ }
+ fg.d3Force('link').strength(physics.linkStrength)
+ fg.d3Force('link').iterations(physics.linkIts)
+ physics.collision
+ ? fg.d3Force('collide', d3.forceCollide().radius(20))
+ : fg.d3Force('collide', null)
+ fg.d3Force('charge').strength(physics.charge)
+ })
+
+ // For the expandable version of the graph
+
+ /* const nodesById = useMemo(() => {
+ * const nodesById = Object.fromEntries(gData.nodes.map((node) => [node.index, node]))
+ * console.log(nodesById)
+ * // link parent/children
+ * gData.nodes.forEach((node) => {
+ * typeof physics.rootId === "number"
+ * ? (node.collapsed = node.index !== physics.rootId)
+ * : (node.collapsed = node.id !== physics.rootId)
+ * node.childLinks = []
+ * })
+ * gData.links.forEach((link) => nodesById[link.sourceIndex].childLinks.push(link))
+ * return nodesById
+ * }, [gData])
+ * const getPrunedTree = useCallback(() => {
+ * const visibleNodes = []
+ * const visibleLinks = []
+ * ;(function traverseTree(node = nodesById[physics.rootId]) {
+ * visibleNodes.push(node)
+ * if (node.collapsed) return
+ * visibleLinks.push(...node.childLinks)
+ * node.childLinks
+ * .map((link) =>
+ * typeof link.targetIndex === "object" ? link.targetIndex : nodesById[link.targetIndex],
+ * ) // get child node
+ * .forEach(traverseTree)
+ * })()
+
+ * return { nodes: visibleNodes, links: visibleLinks }
+ * }, [nodesById])
+ * const [prunedTree, setPrunedTree] = useState(getPrunedTree())
+ */
+ const handleNodeClick = useCallback((node) => {
+ node.collapsed = !node.collapsed // toggle collapse state
+ setPrunedTree(getPrunedTree())
+ }, [])
+
+ //highlighting
+ const [highlightNodes, setHighlightNodes] = useState(new Set())
+ const [highlightLinks, setHighlightLinks] = useState(new Set())
+ const [hoverNode, setHoverNode] = useState(null)
+
+ const updateHighlight = () => {
+ setHighlightNodes(highlightNodes)
+ setHighlightLinks(highlightLinks)
+ }
+
+ const handleBackgroundClick = (event) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+
+ setSelectedNode(null)
+ updateHighlight()
+ }
+
+ const handleNodeHover = (node) => {
+ console.log('hover')
+ if (!selectedNode) {
+ highlightNodes.clear()
+ highlightLinks.clear()
+ if (node) {
+ highlightNodes.add(node)
+ node.neighbors.forEach((neighbor) => highlightNodes.add(neighbor))
+ node.links.forEach((link) => highlightLinks.add(link))
+ }
+
+ setHoverNode(node || null)
+ updateHighlight()
+ }
+ }
+
+ const handleLinkHover = (link) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+
+ if (link) {
+ highlightLinks.add(link)
+ highlightNodes.add(link.source)
+ highlightNodes.add(link.target)
+ }
+
+ updateHighlight()
+ }
+
+ // Normally the graph doesn't update when you just change the physics parameters
+ // This forces the graph to make a small update when you do
+ useEffect(() => {
+ fgRef.current.d3ReheatSimulation()
+ }, [physics])
+ /* const paintRing = useCallback((node, ctx) => {
+ * // add ring just for highlighted nodes
+ * ctx.beginPath();
+ * ctx.arc(node.x, node.y, NODE_R * 1.4, 0, 2 * Math.PI, false);
+ * ctx.fillStyle = node === hoverNode ? 'red' : 'orange';
+ * ctx.fill();
+ * }, [hoverNode]);
+ */
+
+ /* autoPauseRedraw={false}
+linkWidth={link => highlightLinks.has(link) ? 5 : 1}
+linkDirectionalParticles={4}
+linkDirectionalParticleWidth={link => highlightLinks.has(link) ? 4 : 0}
+nodeCanvasObjectMode={node => highlightNodes.has(node) ? 'before' : undefined}
+nodeCanvasObject={paintRing}
+onNodeHover={handleNodeHover}
+onLinkHover={handleLinkHover}
+ nodeRelSize={NODE_R} */
+
+ //nodeColor={(node) =>
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ //}
+
+ const [selectedNode, setSelectedNode] = useState({})
+
+ //shitty handler to check for doubleClicks
+ const [doubleClick, setDoubleClick] = useState(0)
+ const [localGraphData, setLocalGraphData] = useState({
+ nodes: [],
+ links: [],
+ })
+
+ useEffect(() => {
+ localGraphData.nodes.length && !local && setLocal(true)
+ }, [localGraphData])
+
+ const getLocalGraphData = (node) => {
+ console.log(localGraphData)
+ localGraphData.nodes.length ? setLocalGraphData({ nodes: [], links: [] }) : null
+ let g = localGraphData
+ console.log(g.nodes)
+ if (!node.local) {
+ g = { nodes: [], links: [] }
+ console.log('length is 0')
+ node.local = true //keep track of these boys
+ g.nodes.push(node) //only add the clicked node if its the first
+ }
+ node.links.length &&
+ node.links.forEach((neighborLink) => {
+ if (!neighborLink.local) {
+ console.log('0')
+ neighborLink.local = true
+ g.links.push(neighborLink)
+ console.log(neighborLink)
+ const targetNode = gData.nodes[neighborLink.targetIndex]
+ const sourceNode = gData.nodes[neighborLink.sourceIndex]
+ if (targetNode.id !== sourceNode.id) {
+ if (targetNode.id === node.id) {
+ console.log('1. I am the target, the source is ')
+ console.log(sourceNode)
+ if (!sourceNode.local) {
+ console.log('2. The source is not local')
+ sourceNode.local = true
+ g.nodes.push(sourceNode)
+ } else {
+ console.log('2.5 The source is already local')
+ }
+ } else {
+ console.log('3. I am the source')
+ if (!targetNode.local) {
+ console.log('4. The target is not local.')
+ targetNode.local = true
+ g.nodes.push(targetNode)
+ } else {
+ console.log('The target is already local')
+ }
+ }
+ }
+ }
+ })
+ setLocalGraphData(g)
+ }
+
+ const selectClick = (node, event) => {
+ window.open('org-protocol://roam-node?node=' + node.id, '_self')
+ highlightNodes.clear()
+ highlightLinks.clear()
+ console.log(localGraphData)
+ if (event.timeStamp - doubleClick < 400) {
+ getLocalGraphData(node)
+ }
+ if (node) {
+ highlightNodes.add(node)
+ node.neighbors.forEach((neighbor) => highlightNodes.add(neighbor))
+ node.links.forEach((link) => highlightLinks.add(link))
+ }
+
+ setSelectedNode(node || null)
+ updateHighlight()
+ setDoubleClick(event.timeStamp)
+ }
+
+ useEffect(() => {
+ if (local && selectedNode) {
+ getLocalGraphData(selectedNode)
+ }
+ }, [local])
+ return (
+ <View style={style}>
+ {!threeDim ? (
+ <ForceGraph2D
+ ref={fgRef}
+ //autoPauseRedraw={false}
+ //graphData={gData}
+ graphData={local ? localGraphData : gData}
+ //nodeAutoColorBy={physics.colorful ? (node)=>node.index%GROUPS : undefined}
+ nodeColor={
+ !physics.colorful
+ ? (node) => {
+ if (highlightNodes.size === 0) {
+ return 'rgb(100, 100, 100, 1)'
+ } else {
+ return highlightNodes.has(node) ? '#a991f1' : 'rgb(50, 50, 50, 0.5)'
+ }
+ }
+ : (node) => {
+ if (node.neighbors.length === 1 || node.neighbors.length === 2) {
+ return [
+ '#ff665c',
+ '#e69055',
+ '#7bc275',
+ '#4db5bd',
+ '#FCCE7B',
+ '#51afef',
+ '#1f5582',
+ '#C57BDB',
+ '#a991f1',
+ '#5cEfFF',
+ '#6A8FBF',
+ ][node.neighbors[0].index % 11]
+ } else {
+ return [
+ '#ff665c',
+ '#e69055',
+ '#7bc275',
+ '#4db5bd',
+ '#FCCE7B',
+ '#51afef',
+ '#1f5582',
+ '#C57BDB',
+ '#a991f1',
+ '#5cEfFF',
+ '#6A8FBF',
+ ][node.index % 11]
+ }
+ }
+ }
+ //linkAutoColorBy={physics.colorful ? ((d) => gData.nodes[d.sourceIndex].id % GROUPS) : undefined}
+ linkColor={
+ !physics.colorful
+ ? (link) => {
+ if (highlightLinks.size === 0) {
+ return 'rgb(50, 50, 50, 0.8)'
+ } else {
+ return highlightLinks.has(link) ? '#a991f1' : 'rgb(50, 50, 50, 0.2)'
+ }
+ }
+ : (link) =>
+ [
+ '#ff665c',
+ '#e69055',
+ '#7bc275',
+ '#4db5bd',
+ '#FCCE7B',
+ '#51afef',
+ '#1f5582',
+ '#C57BDB',
+ '#a991f1',
+ '#5cEfFF',
+ '#6A8FBF',
+ ][gData.nodes[link.sourceIndex].index % 11]
+ }
+ linkDirectionalParticles={physics.particles}
+ onNodeClick={selectClick}
+ nodeLabel={(node) => node.title}
+ linkWidth={(link) =>
+ highlightLinks.has(link) ? 3 * physics.linkWidth : physics.linkWidth
+ }
+ linkOpacity={physics.linkOpacity}
+ nodeRelSize={physics.nodeRel}
+ nodeVal={(node) => {
+ return highlightNodes.has(node) ? node.neighbors.length + 5 : node.neighbors.length + 3
+ }}
+ linkDirectionalParticleWidth={physics.particleWidth}
+ nodeCanvasObject={(node, ctx, globalScale) => {
+ if (physics.labels) {
+ if (globalScale > physics.labelScale || highlightNodes.has(node)) {
+ const label = node.title.substring(0, Math.min(node.title.length, 30))
+ const fontSize = 12 / globalScale
+ ctx.font = `${fontSize}px Sans-Serif`
+ const textWidth = ctx.measureText(label).width
+ const bckgDimensions = [textWidth * 1.1, fontSize].map((n) => n + fontSize * 0.5) // some padding
+ const fadeFactor = Math.min(
+ (3 * (globalScale - physics.labelScale)) / physics.labelScale,
+ 1,
+ )
+
+ ctx.fillStyle =
+ 'rgba(20, 20, 20, ' +
+ (highlightNodes.size === 0
+ ? 0.5 * fadeFactor
+ : highlightNodes.has(node)
+ ? 0.5
+ : 0.15 * fadeFactor) +
+ ')'
+ ctx.fillRect(
+ node.x - bckgDimensions[0] / 2,
+ node.y - bckgDimensions[1] / 2,
+ ...bckgDimensions,
+ )
+
+ ctx.textAlign = 'center'
+ ctx.textBaseline = 'middle'
+ ctx.fillStyle =
+ 'rgb(255, 255, 255, ' +
+ (highlightNodes.size === 0
+ ? fadeFactor
+ : highlightNodes.has(node)
+ ? 1
+ : 0.3 * fadeFactor) +
+ ')'
+ ctx.fillText(label, node.x, node.y)
+
+ node.__bckgDimensions = bckgDimensions // to re-use in nodePointerAreaPaint
+ }
+ }
+ }}
+ nodeCanvasObjectMode={() => 'after'}
+ onNodeHover={physics.hover ? handleNodeHover : null}
+ //onLinkHover={physics.hover ? handleLinkHover : null}
+ d3AlphaDecay={physics.alphaDecay}
+ d3AlphaMin={physics.alphaTarget}
+ d3VelocityDecay={physics.velocityDecay}
+ onBackgroundClick={handleBackgroundClick}
+ backgroundColor={'#242730'}
+ />
+ ) : (
+ <ForceGraph3D
+ ref={fgRef}
+ graphData={!local ? gData : localGraphData}
+ //graphData={gData}
+ nodeColor={
+ !physics.colorful
+ ? (node) => {
+ if (highlightNodes.size === 0) {
+ return 'rgb(100, 100, 100, 1)'
+ } else {
+ return highlightNodes.has(node) ? 'purple' : 'rgb(50, 50, 50, 0.5)'
+ }
+ }
+ : (node) => {
+ if (node.neighbors.length === 1 || node.neighbors.length === 2) {
+ return [
+ '#ff665c',
+ '#e69055',
+ '#7bc275',
+ '#4db5bd',
+ '#FCCE7B',
+ '#51afef',
+ '#1f5582',
+ '#C57BDB',
+ '#a991f1',
+ '#5cEfFF',
+ '#6A8FBF',
+ ][node.neighbors[0].index % 11]
+ } else {
+ return [
+ '#ff665c',
+ '#e69055',
+ '#7bc275',
+ '#4db5bd',
+ '#FCCE7B',
+ '#51afef',
+ '#1f5582',
+ '#C57BDB',
+ '#a991f1',
+ '#5cEfFF',
+ '#6A8FBF',
+ ][node.index % 11]
+ }
+ }
+ }
+ //linkAutoColorBy={physics.colorful ? ((d) => gData.nodes[d.sourceIndex].id % GROUPS) : undefined}
+ linkColor={
+ !physics.colorful
+ ? (link) => {
+ if (highlightLinks.size === 0) {
+ return 'rgb(50, 50, 50, 0.8)'
+ } else {
+ return highlightLinks.has(link) ? 'purple' : 'rgb(50, 50, 50, 0.2)'
+ }
+ }
+ : (link) =>
+ [
+ '#ff665c',
+ '#e69055',
+ '#7bc275',
+ '#4db5bd',
+ '#FCCE7B',
+ '#51afef',
+ '#1f5582',
+ '#C57BDB',
+ '#a991f1',
+ '#5cEfFF',
+ '#6A8FBF',
+ ][gData.nodes[link.sourceIndex].index % 11]
+ }
+ linkDirectionalParticles={physics.particles}
+ nodeLabel={(node) => node.title}
+ linkWidth={(link) =>
+ highlightLinks.has(link) ? 3 * physics.linkWidth : physics.linkWidth
+ }
+ linkOpacity={physics.linkOpacity}
+ nodeRelSize={physics.nodeRel}
+ nodeVal={(node) =>
+ highlightNodes.has(node) ? node.neighbors.length * 3 : node.neighbors.length * 2
+ }
+ linkDirectionalParticleWidth={physics.particleWidth}
+ onNodeHover={physics.hover ? handleNodeHover : null}
+ d3AlphaDecay={physics.alphaDecay}
+ d3AlphaMin={physics.alphaTarget}
+ d3VelocityDecay={physics.velocityDecay}
+ nodeThreeObject={
+ !physics.labels
+ ? undefined
+ : (node) => {
+ if (highlightNodes.has(node)) {
+ console.log(node.title)
+ const sprite = new SpriteText(node.title.substring(0, 30))
+ console.log('didnt crash here 2')
+ sprite.color = '#ffffff'
+ sprite.textHeight = 8
+ return sprite
+ } else {
+ return undefined
+ }
+ }
+ }
+ nodeThreeObjectExtend={true}
+ onNodeClick={selectClick}
+ onBackgroundClick={handleBackgroundClick}
+ backgroundColor={'#242730'}
+ />
+ )}
+ </View>
+ )
+})
diff --git a/app_expo/components/graph/graphbak.tsx b/app_expo/components/graph/graphbak.tsx
new file mode 100644
index 0000000..5291678
--- /dev/null
+++ b/app_expo/components/graph/graphbak.tsx
@@ -0,0 +1,448 @@
+
+import * as React from "react"
+import { useState, useEffect, useRef, useMemo, useCallback } from "react"
+import { StyleProp, TextStyle, View, ViewStyle } from "react-native"
+import { observer } from "mobx-react-lite"
+import { color, typography } from "../../theme"
+import { Text } from "../"
+import { flatten } from "ramda"
+
+//import data from "../../data/miserables.json"
+//import genRandomTree from "../../data/randomdata";
+//import rando from "../../data/rando.json"
+
+import { ForceGraph2D, ForceGraph3D, ForceGraphVR, ForceGraphAR } from "react-force-graph"
+import * as d3 from "d3-force-3d"
+import * as three from "three"
+import SpriteText from "three-spritetext"
+
+const CONTAINER: ViewStyle = {
+ justifyContent: "center",
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface GraphProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+ physics
+ gData
+ setPhysics
+ nodeIds: string[]
+}
+
+/**
+ * Describe your component here
+ */
+export const Graph = observer(function Graph(props: GraphProps): JSX.Element {
+ const { style, physics, setPhysics, gData, nodeIds } = props
+ const styles = flatten([CONTAINER, style])
+
+ const fgRef = useRef()
+
+ const GROUPS: number = 12
+ const NODE_R: number = 8
+ //const gData = genRandomTree(200);
+
+ //const [charge, setCharge] = useState(-30);
+ //const [link, setLink] = useState(-30);
+
+ useEffect(() => {
+ const fg = fgRef.current
+ //fg.d3Force('center').strength(0.05);
+ if (physics.gravityOn) {
+ fg.d3Force("x", d3.forceX().strength(physics.gravity))
+ fg.d3Force("y", d3.forceY().strength(physics.gravity))
+ if (physics.threedim) {
+ if (physics.galaxy) {
+ fg.d3Force("y", d3.forceY().strength(physics.gravity / 5))
+ fg.d3Force("z", d3.forceZ().strength(physics.gravity / 5))
+ } else {
+ fg.d3Force("y", d3.forceY().strength(physics.gravity))
+ fg.d3Force("z", d3.forceZ().strength(physics.gravity))
+ }
+ } else {
+ fg.d3Force("z", null)
+ }
+ } else {
+ fg.d3Force("x", null)
+ fg.d3Force("y", null)
+ physics.threedim ? fg.d3Force("z", null) : null
+ }
+ fg.d3Force("link").strength(physics.linkStrength)
+ fg.d3Force("link").iterations(physics.linkIts)
+ physics.collision
+ ? fg.d3Force("collide", d3.forceCollide().radius(20))
+ : fg.d3Force("collide", null)
+ fg.d3Force("charge").strength(physics.charge)
+ })
+
+ // For the expandable version of the graph
+
+ const nodesById = useMemo(() => {
+ const nodesById = Object.fromEntries(gData.nodes.map((node) => [node.index, node]))
+ console.log(nodesById)
+ // link parent/children
+ gData.nodes.forEach((node) => {
+ typeof physics.rootId === "number"
+ ? (node.collapsed = node.index !== physics.rootId)
+ : (node.collapsed = node.id !== physics.rootId)
+ node.childLinks = []
+ })
+ gData.links.forEach((link) => nodesById[link.sourceIndex].childLinks.push(link))
+ return nodesById
+ }, [gData])
+
+ const getPrunedTree = useCallback(() => {
+ const visibleNodes = []
+ const visibleLinks = []
+ ;(function traverseTree(node = nodesById[physics.rootId]) {
+ visibleNodes.push(node)
+ if (node.collapsed) return
+ visibleLinks.push(...node.childLinks)
+ node.childLinks
+ .map((link) =>
+ typeof link.targetIndex === "object" ? link.targetIndex : nodesById[link.targetIndex],
+ ) // get child node
+ .forEach(traverseTree)
+ })()
+
+ return { nodes: visibleNodes, links: visibleLinks }
+ }, [nodesById])
+
+ const [prunedTree, setPrunedTree] = useState(getPrunedTree())
+
+ const handleNodeClick = useCallback((node) => {
+ node.collapsed = !node.collapsed // toggle collapse state
+ setPrunedTree(getPrunedTree())
+ }, [])
+
+ //highlighting
+ const [highlightNodes, setHighlightNodes] = useState(new Set())
+ const [highlightLinks, setHighlightLinks] = useState(new Set())
+ const [hoverNode, setHoverNode] = useState(null)
+
+ const updateHighlight = () => {
+ setHighlightNodes(highlightNodes)
+ setHighlightLinks(highlightLinks)
+ }
+
+ const handleBackgroundClick = (event) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+
+ setSelectedNode(null)
+ updateHighlight()
+ }
+
+ const handleNodeHover = (node) => {
+ console.log("hover")
+ if (!selectedNode) {
+ highlightNodes.clear()
+ highlightLinks.clear()
+ if (node) {
+ highlightNodes.add(node)
+ node.neighbors.forEach((neighbor) => highlightNodes.add(neighbor))
+ node.links.forEach((link) => highlightLinks.add(link))
+ }
+
+ setHoverNode(node || null)
+ updateHighlight()
+ }
+ }
+
+ const handleLinkHover = (link) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+
+ if (link) {
+ highlightLinks.add(link)
+ highlightNodes.add(link.source)
+ highlightNodes.add(link.target)
+ }
+
+ updateHighlight()
+ }
+
+ // Normally the graph doesn't update when you just change the physics parameters
+ // This forces the graph to make a small update when you do
+ useEffect(() => {
+ fgRef.current.d3ReheatSimulation()
+ }, [physics])
+ /* const paintRing = useCallback((node, ctx) => {
+ * // add ring just for highlighted nodes
+ * ctx.beginPath();
+ * ctx.arc(node.x, node.y, NODE_R * 1.4, 0, 2 * Math.PI, false);
+ * ctx.fillStyle = node === hoverNode ? 'red' : 'orange';
+ * ctx.fill();
+ * }, [hoverNode]);
+ */
+
+ /* autoPauseRedraw={false}
+linkWidth={link => highlightLinks.has(link) ? 5 : 1}
+linkDirectionalParticles={4}
+linkDirectionalParticleWidth={link => highlightLinks.has(link) ? 4 : 0}
+nodeCanvasObjectMode={node => highlightNodes.has(node) ? 'before' : undefined}
+nodeCanvasObject={paintRing}
+onNodeHover={handleNodeHover}
+onLinkHover={handleLinkHover}
+ nodeRelSize={NODE_R} */
+
+ //nodeColor={(node) =>
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ //}
+
+ const [selectedNode, setSelectedNode] = useState({})
+
+ //shitty handler to check for doubleClicks
+ const [doubleClick, setDoubleClick] = useState(0)
+ const [localGraphData, setLocalGraphData] = useState({ nodes: [], links: [] })
+
+ useEffect(() => {
+ !physics.local && setPhysics({ ...physics, local: true })
+ }, [localGraphData])
+
+ const getLocalGraphData = (node) {
+ console.log(localGraphData)
+ localGraphData.nodes.length ? setLocalGraphData({nodes: [], links: []}) : null;
+ let g = localGraphData
+ console.log(g.nodes)
+ if (g.nodes.length === 0) {
+ console.log("length is 0")
+ node.local = true //keep track of these boys
+ g.nodes.push(node) //only add the clicked node if its the first
+ }
+ node.links.forEach((neighborLink) => {
+ if (!neighborLink.local) {
+ console.log("0")
+ neighborLink.local = true
+ g.links.push(neighborLink)
+ const targetNode = gData.nodes[neighborLink.targetIndex]
+ const sourceNode = gData.nodes[neighborLink.sourceIndex]
+ if (targetNode.id === node.id) {
+ console.log("1. I am the target, the source is ")
+ console.log(sourceNode)
+ if (!sourceNode.local) {
+ console.log("2. The source is not local")
+ sourceNode.local = true
+ g.nodes.push(sourceNode)
+ } else {
+ console.log("2.5 The source is already local")
+ }
+ } else {
+ console.log("3. I am the source")
+ if (!targetNode.local) {
+ console.log("4. The target is not local.")
+ targetNode.local = true
+ g.nodes.push(targetNode)
+ } else {
+ console.log("The target is already local")
+ }
+ }
+ }
+ })
+ setLocalGraphData(g)
+ };
+
+ const selectClick = (node, event) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+ console.log(localGraphData)
+ if (event.timeStamp - doubleClick < 400) {
+ getLocalGraphData(node);
+ }
+ if (node) {
+ highlightNodes.add(node)
+ node.neighbors.forEach((neighbor) => highlightNodes.add(neighbor))
+ node.links.forEach((link) => highlightLinks.add(link))
+ }
+
+ setSelectedNode(node || null)
+ updateHighlight()
+ setDoubleClick(event.timeStamp)
+ }
+
+ return (
+ <View>
+ {!physics.threedim ? (
+ <ForceGraph2D
+ ref={fgRef}
+ autoPauseRedraw={false}
+ //graphData={gData}
+ graphData={physics.local ? localGraphData : (physics.collapse ? prunedTree : gData)}
+ nodeAutoColorBy={physics.colorful ? "id" : undefined}
+ nodeColor={
+ !physics.colorful
+ ? (node) => {
+ if (highlightNodes.size === 0) {
+ return "rgb(100, 100, 100, 1)"
+ } else {
+ return highlightNodes.has(node) ? "purple" : "rgb(50, 50, 50, 0.5)"
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ }
+ linkAutoColorBy={physics.colorful ? "target" : undefined}
+ //linkAutoColorBy={(d) => gData.nodes[d.source].id % GROUPS}
+ linkColor={
+ !physics.colorful
+ ? (link) => {
+ if (highlightLinks.size === 0) {
+ return "rgb(50, 50, 50, 0.8)"
+ } else {
+ return highlightLinks.has(link) ? "purple" : "rgb(50, 50, 50, 0.2)"
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ //highlightLinks.has(link) ? "purple" : "grey"
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ linkDirectionalParticles={physics.particles}
+ onNodeClick={!physics.collapse ? selectClick : handleNodeClick}
+ nodeLabel={(node) => node.title}
+ //nodeVal ={(node)=> node.childLinks.length * 0.5 + 1}
+ //d3VelocityDecay={visco}
+ linkWidth={(link) =>
+ highlightLinks.has(link) ? 3 * physics.linkWidth : physics.linkWidth
+ }
+ linkOpacity={physics.linkOpacity}
+ nodeRelSize={physics.nodeRel}
+ nodeVal={(node) =>
+ highlightNodes.has(node) ? node.neighbors.length + 5 : node.neighbors.length + 3
+ }
+ linkDirectionalParticleWidth={physics.particleWidth}
+ nodeCanvasObject={(node, ctx, globalScale) => {
+ if (physics.labels) {
+ if (globalScale > physics.labelScale || highlightNodes.has(node)) {
+ const label = node.title.substring(0, Math.min(node.title.length, 30))
+ const fontSize = 12 / globalScale
+ ctx.font = `${fontSize}px Sans-Serif`
+ const textWidth = ctx.measureText(label).width
+ const bckgDimensions = [textWidth * 1.1, fontSize].map((n) => n + fontSize * 0.5) // some padding
+ const fadeFactor = Math.min(
+ (3 * (globalScale - physics.labelScale)) / physics.labelScale,
+ 1,
+ )
+
+ ctx.fillStyle =
+ "rgba(20, 20, 20, " +
+ (highlightNodes.size === 0
+ ? 0.5 * fadeFactor
+ : highlightNodes.has(node)
+ ? 0.5
+ : 0.15 * fadeFactor) +
+ ")"
+ ctx.fillRect(
+ node.x - bckgDimensions[0] / 2,
+ node.y - bckgDimensions[1] / 2,
+ ...bckgDimensions,
+ )
+
+ ctx.textAlign = "center"
+ ctx.textBaseline = "middle"
+ ctx.fillStyle =
+ "rgb(255, 255, 255, " +
+ (highlightNodes.size === 0
+ ? fadeFactor
+ : highlightNodes.has(node)
+ ? 1
+ : 0.3 * fadeFactor) +
+ ")"
+ ctx.fillText(label, node.x, node.y)
+
+ node.__bckgDimensions = bckgDimensions // to re-use in nodePointerAreaPaint
+ }
+ }
+ }}
+ nodeCanvasObjectMode={() => "after"}
+ onNodeHover={physics.hover ? handleNodeHover : null}
+ //onLinkHover={physics.hover ? handleLinkHover : null}
+ d3AlphaDecay={physics.alphaDecay}
+ d3AlphaMin={physics.alphaTarget}
+ d3VelocityDecay={physics.velocityDecay}
+ onBackgroundClick={handleBackgroundClick}
+ />
+ ) : (
+ <ForceGraph3D
+ ref={fgRef}
+ autoPauseRedraw={false}
+ graphData={gData}
+ //graphData={physics.collapse ? prunedTree : gData}
+ nodeAutoColorBy={physics.colorful ? "id" : undefined}
+ nodeColor={
+ !physics.colorful
+ ? (node) => {
+ if (highlightNodes.size === 0) {
+ return "rgb(100, 100, 100, 1)"
+ } else {
+ return highlightNodes.has(node) ? "purple" : "rgb(50, 50, 50, 0.5)"
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ }
+ linkAutoColorBy={physics.colorful ? "target" : undefined}
+ //linkAutoColorBy={(d) => gData.nodes[d.source].id % GROUPS}
+ linkColor={
+ !physics.colorful
+ ? (link) => {
+ if (highlightLinks.size === 0) {
+ return "rgb(50, 50, 50, 0.8)"
+ } else {
+ return highlightLinks.has(link) ? "purple" : "rgb(50, 50, 50, 0.2)"
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ //highlightLinks.has(link) ? "purple" : "grey"
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ linkDirectionalParticles={physics.particles}
+ //onNodeClick={!physics.collapse ? null : handleNodeClick}
+ nodeLabel={(node) => node.title}
+ //nodeVal ={(node)=> node.childLinks.length * 0.5 + 1}
+ //d3VelocityDecay={visco}
+ linkWidth={(link) =>
+ highlightLinks.has(link) ? 3 * physics.linkWidth : physics.linkWidth
+ }
+ linkOpacity={physics.linkOpacity}
+ nodeRelSize={physics.nodeRel}
+ nodeVal={(node) =>
+ highlightNodes.has(node) ? node.neighbors.length + 5 : node.neighbors.length + 3
+ }
+ linkDirectionalParticleWidth={physics.particleWidth}
+ onNodeHover={physics.hover ? handleNodeHover : null}
+ //onLinkHover={physics.hover ? handleLinkHover : null}
+ d3AlphaDecay={physics.alphaDecay}
+ d3AlphaMin={physics.alphaTarget}
+ d3VelocityDecay={physics.velocityDecay}
+ nodeThreeObject={
+ !physics.labels
+ ? undefined
+ : (node) => {
+ if (highlightNodes.has(node)) {
+ console.log(node.title)
+ const sprite = new SpriteText(node.title.substring(0, 30))
+ console.log("didnt crash here 2")
+ sprite.color = "#ffffff"
+ sprite.textHeight = 8
+ return sprite
+ } else {
+ return undefined
+ }
+ }
+ }
+ nodeThreeObjectExtend={true}
+ />
+ )}
+ </View>
+ )
+})
diff --git a/app_expo/components/graph/graphgood.tsx b/app_expo/components/graph/graphgood.tsx
new file mode 100644
index 0000000..4d70e25
--- /dev/null
+++ b/app_expo/components/graph/graphgood.tsx
@@ -0,0 +1,440 @@
+import * as React from 'react'
+import { useState, useEffect, useRef, useMemo, useCallback } from 'react'
+import { StyleProp, TextStyle, View, ViewStyle } from 'react-native'
+import { observer } from 'mobx-react-lite'
+import { color, typography } from '../../theme'
+import { Text } from '../'
+import { flatten } from 'ramda'
+
+//import data from "../../data/miserables.json"
+//import genRandomTree from "../../data/randomdata";
+//import rando from "../../data/rando.json"
+
+import { ForceGraph2D, ForceGraph3D, ForceGraphVR, ForceGraphAR } from 'react-force-graph'
+import * as d3 from 'd3-force-3d'
+import * as three from 'three'
+import SpriteText from 'three-spritetext'
+
+const CONTAINER: ViewStyle = {
+ justifyContent: 'center',
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface GraphProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+ physics
+ setPhysics
+ gData
+ nodeIds: string[]
+}
+
+/**
+ * Describe your component here
+ */
+export const Graph = observer(function Graph(props: GraphProps): JSX.Element {
+ const { style, physics, setPhysics, gData, nodeIds } = props
+ const styles = flatten([CONTAINER, style])
+
+ const fgRef = useRef()
+
+ const GROUPS: number = 12
+ const NODE_R: number = 8
+ //const gData = genRandomTree(200);
+
+ //const [charge, setCharge] = useState(-30);
+ //const [link, setLink] = useState(-30);
+
+ useEffect(() => {
+ const fg = fgRef.current
+ //fg.d3Force('center').strength(0.05);
+ if (physics.gravityOn) {
+ fg.d3Force('x', d3.forceX().strength(physics.gravity))
+ fg.d3Force('y', d3.forceY().strength(physics.gravity))
+ if (physics.threedim) {
+ if (physics.galaxy) {
+ fg.d3Force('y', d3.forceY().strength(physics.gravity / 5))
+ fg.d3Force('z', d3.forceZ().strength(physics.gravity / 5))
+ } else {
+ fg.d3Force('y', d3.forceY().strength(physics.gravity))
+ fg.d3Force('z', d3.forceZ().strength(physics.gravity))
+ }
+ } else {
+ fg.d3Force('z', null)
+ }
+ } else {
+ fg.d3Force('x', null)
+ fg.d3Force('y', null)
+ physics.threedim ? fg.d3Force('z', null) : null
+ }
+ fg.d3Force('link').strength(physics.linkStrength)
+ fg.d3Force('link').iterations(physics.linkIts)
+ physics.collision
+ ? fg.d3Force('collide', d3.forceCollide().radius(20))
+ : fg.d3Force('collide', null)
+ fg.d3Force('charge').strength(physics.charge)
+ })
+
+ // For the expandable version of the graph
+
+ const nodesById = useMemo(() => {
+ const nodesById = Object.fromEntries(gData.nodes.map((node) => [node.index, node]))
+ console.log(nodesById)
+ // link parent/children
+ gData.nodes.forEach((node) => {
+ typeof physics.rootId === 'number'
+ ? (node.collapsed = node.index !== physics.rootId)
+ : (node.collapsed = node.id !== physics.rootId)
+ node.childLinks = []
+ })
+ gData.links.forEach((link) => nodesById[link.sourceIndex].childLinks.push(link))
+ return nodesById
+ }, [gData])
+ const getPrunedTree = useCallback(() => {
+ const visibleNodes = []
+ const visibleLinks = []
+ ;(function traverseTree(node = nodesById[physics.rootId]) {
+ visibleNodes.push(node)
+ if (node.collapsed) return
+ visibleLinks.push(...node.childLinks)
+ node.childLinks
+ .map((link) =>
+ typeof link.targetIndex === 'object' ? link.targetIndex : nodesById[link.targetIndex],
+ ) // get child node
+ .forEach(traverseTree)
+ })()
+
+ return { nodes: visibleNodes, links: visibleLinks }
+ }, [nodesById])
+
+ const [prunedTree, setPrunedTree] = useState(getPrunedTree())
+
+ const handleNodeClick = useCallback((node) => {
+ node.collapsed = !node.collapsed // toggle collapse state
+ setPrunedTree(getPrunedTree())
+ }, [])
+
+ //highlighting
+ const [highlightNodes, setHighlightNodes] = useState(new Set())
+ const [highlightLinks, setHighlightLinks] = useState(new Set())
+ const [hoverNode, setHoverNode] = useState(null)
+
+ const updateHighlight = () => {
+ setHighlightNodes(highlightNodes)
+ setHighlightLinks(highlightLinks)
+ }
+
+ const handleBackgroundClick = (event) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+
+ setSelectedNode(null)
+ updateHighlight()
+ }
+
+ const handleNodeHover = (node) => {
+ console.log('hover')
+ if (!selectedNode) {
+ highlightNodes.clear()
+ highlightLinks.clear()
+ if (node) {
+ highlightNodes.add(node)
+ node.neighbors.forEach((neighbor) => highlightNodes.add(neighbor))
+ node.links.forEach((link) => highlightLinks.add(link))
+ }
+
+ setHoverNode(node || null)
+ updateHighlight()
+ }
+ }
+
+ const handleLinkHover = (link) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+
+ if (link) {
+ highlightLinks.add(link)
+ highlightNodes.add(link.source)
+ highlightNodes.add(link.target)
+ }
+
+ updateHighlight()
+ }
+
+ // Normally the graph doesn't update when you just change the physics parameters
+ // This forces the graph to make a small update when you do
+ useEffect(() => {
+ fgRef.current.d3ReheatSimulation()
+ }, [physics])
+ /* const paintRing = useCallback((node, ctx) => {
+ * // add ring just for highlighted nodes
+ * ctx.beginPath();
+ * ctx.arc(node.x, node.y, NODE_R * 1.4, 0, 2 * Math.PI, false);
+ * ctx.fillStyle = node === hoverNode ? 'red' : 'orange';
+ * ctx.fill();
+ * }, [hoverNode]);
+ */
+
+ /* autoPauseRedraw={false}
+linkWidth={link => highlightLinks.has(link) ? 5 : 1}
+linkDirectionalParticles={4}
+linkDirectionalParticleWidth={link => highlightLinks.has(link) ? 4 : 0}
+nodeCanvasObjectMode={node => highlightNodes.has(node) ? 'before' : undefined}
+nodeCanvasObject={paintRing}
+onNodeHover={handleNodeHover}
+onLinkHover={handleLinkHover}
+ nodeRelSize={NODE_R} */
+
+ //nodeColor={(node) =>
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ //}
+
+ const [selectedNode, setSelectedNode] = useState({})
+
+ //shitty handler to check for doubleClicks
+ const [doubleClick, setDoubleClick] = useState(0)
+ const [localGraphData, setLocalGraphData] = useState({
+ nodes: [],
+ links: [],
+ })
+
+ const updateLocalGraph = (node) => {
+ console.log(localGraphData)
+ // localGraphData.nodes.length ? setLocalGraphData({ nodes: [], links: [] }) : null
+ let g = localGraphData
+ if (!node.local) {
+ node.local = true
+ g.nodes.push(node)
+ }
+ node.neighbors.forEach((neighbor) => {
+ if (neighbor !== node || !neighbor.local) {
+ const newNode: boolean = g.nodes.every((existingNode) => {
+ if (existingNode === neighbor) {
+ return false
+ } else {
+ return true
+ }
+ })
+ if (newNode) {
+ neighbor.local = true
+ g.nodes.push(neighbor)
+ }
+ }
+ })
+
+ node.links.forEach((neighborLink) => {
+ const newLink: boolean = g.links.every((existingLink) => {
+ if (existingLink === neighborLink) {
+ return false
+ } else {
+ return true
+ }
+ })
+ newLink && g.links.push(neighborLink)
+ })
+ setLocalGraphData(g)
+ setPhysics({ ...physics, local: true })
+ }
+
+ const selectClick = (node, event) => {
+ highlightNodes.clear()
+ highlightLinks.clear()
+ console.log(localGraphData)
+ if (event.timeStamp - doubleClick < 400) {
+ updateLocalGraph(node)
+ }
+ if (node) {
+ highlightNodes.add(node)
+ node.neighbors.forEach((neighbor) => highlightNodes.add(neighbor))
+ node.links.forEach((link) => highlightLinks.add(link))
+ }
+ setSelectedNode(node || null)
+ updateHighlight()
+ setDoubleClick(event.timeStamp)
+ }
+
+ return (
+ <View>
+ {!physics.threedim ? (
+ <ForceGraph2D
+ ref={fgRef}
+ autoPauseRedraw={false}
+ //graphData={gData}
+ graphData={physics.local ? localGraphData : physics.collapse ? prunedTree : gData}
+ nodeAutoColorBy={physics.colorful ? 'id' : undefined}
+ nodeColor={
+ !physics.colorful
+ ? (node) => {
+ if (highlightNodes.size === 0) {
+ return 'rgb(100, 100, 100, 1)'
+ } else {
+ return highlightNodes.has(node) ? 'purple' : 'rgb(50, 50, 50, 0.5)'
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ }
+ linkAutoColorBy={physics.colorful ? 'target' : undefined}
+ //linkAutoColorBy={(d) => gData.nodes[d.source].id % GROUPS}
+ linkColor={
+ !physics.colorful
+ ? (link) => {
+ if (highlightLinks.size === 0) {
+ return 'rgb(50, 50, 50, 0.8)'
+ } else {
+ return highlightLinks.has(link) ? 'purple' : 'rgb(50, 50, 50, 0.2)'
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ //highlightLinks.has(link) ? "purple" : "grey"
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ linkDirectionalParticles={physics.particles}
+ onNodeClick={!physics.collapse ? selectClick : handleNodeClick}
+ nodeLabel={(node) => node.title}
+ //nodeVal ={(node)=> node.childLinks.length * 0.5 + 1}
+ //d3VelocityDecay={visco}
+ linkWidth={(link) =>
+ highlightLinks.has(link) ? 3 * physics.linkWidth : physics.linkWidth
+ }
+ linkOpacity={physics.linkOpacity}
+ nodeRelSize={physics.nodeRel}
+ nodeVal={(node) =>
+ highlightNodes.has(node) ? node.neighbors.length + 5 : node.neighbors.length + 3
+ }
+ linkDirectionalParticleWidth={physics.particleWidth}
+ nodeCanvasObject={(node, ctx, globalScale) => {
+ if (physics.labels) {
+ if (globalScale > physics.labelScale || highlightNodes.has(node)) {
+ const label = node.title.substring(0, Math.min(node.title.length, 30))
+ const fontSize = 12 / globalScale
+ ctx.font = `${fontSize}px Sans-Serif`
+ const textWidth = ctx.measureText(label).width
+ const bckgDimensions = [textWidth * 1.1, fontSize].map((n) => n + fontSize * 0.5) // some padding
+ const fadeFactor = Math.min(
+ (3 * (globalScale - physics.labelScale)) / physics.labelScale,
+ 1,
+ )
+
+ ctx.fillStyle =
+ 'rgba(20, 20, 20, ' +
+ (highlightNodes.size === 0
+ ? 0.5 * fadeFactor
+ : highlightNodes.has(node)
+ ? 0.5
+ : 0.15 * fadeFactor) +
+ ')'
+ ctx.fillRect(
+ node.x - bckgDimensions[0] / 2,
+ node.y - bckgDimensions[1] / 2,
+ ...bckgDimensions,
+ )
+
+ ctx.textAlign = 'center'
+ ctx.textBaseline = 'middle'
+ ctx.fillStyle =
+ 'rgb(255, 255, 255, ' +
+ (highlightNodes.size === 0
+ ? fadeFactor
+ : highlightNodes.has(node)
+ ? 1
+ : 0.3 * fadeFactor) +
+ ')'
+ ctx.fillText(label, node.x, node.y)
+
+ node.__bckgDimensions = bckgDimensions // to re-use in nodePointerAreaPaint
+ }
+ }
+ }}
+ nodeCanvasObjectMode={() => 'after'}
+ onNodeHover={physics.hover ? handleNodeHover : null}
+ //onLinkHover={physics.hover ? handleLinkHover : null}
+ d3AlphaDecay={physics.alphaDecay}
+ d3AlphaMin={physics.alphaTarget}
+ d3VelocityDecay={physics.velocityDecay}
+ onBackgroundClick={handleBackgroundClick}
+ />
+ ) : (
+ <ForceGraph3D
+ ref={fgRef}
+ autoPauseRedraw={false}
+ graphData={gData}
+ //graphData={physics.collapse ? prunedTree : gData}
+ nodeAutoColorBy={physics.colorful ? 'id' : undefined}
+ nodeColor={
+ !physics.colorful
+ ? (node) => {
+ if (highlightNodes.size === 0) {
+ return 'rgb(100, 100, 100, 1)'
+ } else {
+ return highlightNodes.has(node) ? 'purple' : 'rgb(50, 50, 50, 0.5)'
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ }
+ linkAutoColorBy={physics.colorful ? 'target' : undefined}
+ //linkAutoColorBy={(d) => gData.nodes[d.source].id % GROUPS}
+ linkColor={
+ !physics.colorful
+ ? (link) => {
+ if (highlightLinks.size === 0) {
+ return 'rgb(50, 50, 50, 0.8)'
+ } else {
+ return highlightLinks.has(link) ? 'purple' : 'rgb(50, 50, 50, 0.2)'
+ }
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ : undefined
+ //highlightLinks.has(link) ? "purple" : "grey"
+ // !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
+ }
+ linkDirectionalParticles={physics.particles}
+ //onNodeClick={!physics.collapse ? null : handleNodeClick}
+ nodeLabel={(node) => node.title}
+ //nodeVal ={(node)=> node.childLinks.length * 0.5 + 1}
+ //d3VelocityDecay={visco}
+ linkWidth={(link) =>
+ highlightLinks.has(link) ? 3 * physics.linkWidth : physics.linkWidth
+ }
+ linkOpacity={physics.linkOpacity}
+ nodeRelSize={physics.nodeRel}
+ nodeVal={(node) =>
+ highlightNodes.has(node) ? node.neighbors.length + 5 : node.neighbors.length + 3
+ }
+ linkDirectionalParticleWidth={physics.particleWidth}
+ onNodeHover={physics.hover ? handleNodeHover : null}
+ //onLinkHover={physics.hover ? handleLinkHover : null}
+ d3AlphaDecay={physics.alphaDecay}
+ d3AlphaMin={physics.alphaTarget}
+ d3VelocityDecay={physics.velocityDecay}
+ nodeThreeObject={
+ !physics.labels
+ ? undefined
+ : (node) => {
+ if (highlightNodes.has(node)) {
+ console.log(node.title)
+ const sprite = new SpriteText(node.title.substring(0, 30))
+ console.log('didnt crash here 2')
+ sprite.color = '#ffffff'
+ sprite.textHeight = 8
+ return sprite
+ } else {
+ return undefined
+ }
+ }
+ }
+ nodeThreeObjectExtend={true}
+ />
+ )}
+ </View>
+ )
+})
diff --git a/app_expo/components/header/header.props.ts b/app_expo/components/header/header.props.ts
new file mode 100644
index 0000000..f142656
--- /dev/null
+++ b/app_expo/components/header/header.props.ts
@@ -0,0 +1,45 @@
+import { StyleProp, TextStyle, ViewStyle } from 'react-native'
+import { IconTypes } from '../icon/icons'
+import { TxKeyPath } from '../../i18n'
+
+export interface HeaderProps {
+ /**
+ * Main header, e.g. POWERED BY IGNITE
+ */
+ headerTx?: TxKeyPath
+
+ /**
+ * header non-i18n
+ */
+ headerText?: string
+
+ /**
+ * Icon that should appear on the left
+ */
+ leftIcon?: IconTypes
+
+ /**
+ * What happens when you press the left icon
+ */
+ onLeftPress?(): void
+
+ /**
+ * Icon that should appear on the right
+ */
+ rightIcon?: IconTypes
+
+ /**
+ * What happens when you press the right icon
+ */
+ onRightPress?(): void
+
+ /**
+ * Container style overrides.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * Title style overrides.
+ */
+ titleStyle?: StyleProp<TextStyle>
+}
diff --git a/app_expo/components/header/header.story.tsx b/app_expo/components/header/header.story.tsx
new file mode 100644
index 0000000..db87b89
--- /dev/null
+++ b/app_expo/components/header/header.story.tsx
@@ -0,0 +1,43 @@
+import * as React from 'react'
+import { View, Alert } from 'react-native'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Header } from './header'
+import { color } from '../../theme'
+
+declare let module
+
+const VIEWSTYLE = {
+ flex: 1,
+ backgroundColor: color.storybookDarkBg,
+}
+
+storiesOf('Header', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Behavior', () => (
+ <Story>
+ <UseCase noPad text="default" usage="The default usage">
+ <View style={VIEWSTYLE}>
+ <Header headerTx="demoScreen.howTo" />
+ </View>
+ </UseCase>
+ <UseCase noPad text="leftIcon" usage="A left nav icon">
+ <View style={VIEWSTYLE}>
+ <Header
+ headerTx="demoScreen.howTo"
+ leftIcon="back"
+ onLeftPress={() => Alert.alert('left nav')}
+ />
+ </View>
+ </UseCase>
+ <UseCase noPad text="rightIcon" usage="A right nav icon">
+ <View style={VIEWSTYLE}>
+ <Header
+ headerTx="demoScreen.howTo"
+ rightIcon="bullet"
+ onRightPress={() => Alert.alert('right nav')}
+ />
+ </View>
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/header/header.tsx b/app_expo/components/header/header.tsx
new file mode 100644
index 0000000..25e0914
--- /dev/null
+++ b/app_expo/components/header/header.tsx
@@ -0,0 +1,61 @@
+import React from 'react'
+import { View, ViewStyle, TextStyle } from 'react-native'
+import { HeaderProps } from './header.props'
+import { Button } from '../button/button'
+import { Text } from '../text/text'
+import { Icon } from '../icon/icon'
+import { spacing } from '../../theme'
+import { translate } from '../../i18n/'
+
+// static styles
+const ROOT: ViewStyle = {
+ flexDirection: 'row',
+ paddingHorizontal: spacing[4],
+ alignItems: 'center',
+ paddingTop: spacing[5],
+ paddingBottom: spacing[5],
+ justifyContent: 'flex-start',
+}
+const TITLE: TextStyle = { textAlign: 'center' }
+const TITLE_MIDDLE: ViewStyle = { flex: 1, justifyContent: 'center' }
+const LEFT: ViewStyle = { width: 32 }
+const RIGHT: ViewStyle = { width: 32 }
+
+/**
+ * Header that appears on many screens. Will hold navigation buttons and screen title.
+ */
+export function Header(props: HeaderProps) {
+ const {
+ onLeftPress,
+ onRightPress,
+ rightIcon,
+ leftIcon,
+ headerText,
+ headerTx,
+ style,
+ titleStyle,
+ } = props
+ const header = headerText || (headerTx && translate(headerTx)) || ''
+
+ return (
+ <View style={[ROOT, style]}>
+ {leftIcon ? (
+ <Button preset="link" onPress={onLeftPress}>
+ <Icon icon={leftIcon} />
+ </Button>
+ ) : (
+ <View style={LEFT} />
+ )}
+ <View style={TITLE_MIDDLE}>
+ <Text style={[TITLE, titleStyle]} text={header} />
+ </View>
+ {rightIcon ? (
+ <Button preset="link" onPress={onRightPress}>
+ <Icon icon={rightIcon} />
+ </Button>
+ ) : (
+ <View style={RIGHT} />
+ )}
+ </View>
+ )
+}
diff --git a/app_expo/components/icon/icon.props.ts b/app_expo/components/icon/icon.props.ts
new file mode 100644
index 0000000..1f3ed2e
--- /dev/null
+++ b/app_expo/components/icon/icon.props.ts
@@ -0,0 +1,21 @@
+import { ImageStyle, StyleProp, ViewStyle } from 'react-native'
+import { IconTypes } from './icons'
+
+export interface IconProps {
+ /**
+ * Style overrides for the icon image
+ */
+ style?: StyleProp<ImageStyle>
+
+ /**
+ * Style overrides for the icon container
+ */
+
+ containerStyle?: StyleProp<ViewStyle>
+
+ /**
+ * The name of the icon
+ */
+
+ icon?: IconTypes
+}
diff --git a/app_expo/components/icon/icon.story.tsx b/app_expo/components/icon/icon.story.tsx
new file mode 100644
index 0000000..31c8499
--- /dev/null
+++ b/app_expo/components/icon/icon.story.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Icon } from './icon'
+
+declare let module
+
+storiesOf('Icon', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Names', () => (
+ <Story>
+ <UseCase text="back" usage="The icon for going back">
+ <Icon icon="back" />
+ </UseCase>
+ <UseCase text="bullet" usage="The icon for a bullet point">
+ <Icon icon="bullet" />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/icon/icon.tsx b/app_expo/components/icon/icon.tsx
new file mode 100644
index 0000000..f596bb2
--- /dev/null
+++ b/app_expo/components/icon/icon.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react'
+import { View, ImageStyle } from 'react-native'
+import { AutoImage as Image } from '../auto-image/auto-image'
+import { IconProps } from './icon.props'
+import { icons } from './icons'
+
+const ROOT: ImageStyle = {
+ resizeMode: 'contain',
+}
+
+export function Icon(props: IconProps) {
+ const { style: styleOverride, icon, containerStyle } = props
+
+ return (
+ <View style={containerStyle}>
+ <Image style={[ROOT, styleOverride]} source={icons[icon]} />
+ </View>
+ )
+}
diff --git a/app_expo/components/icon/icons/arrow-left.png b/app_expo/components/icon/icons/arrow-left.png
new file mode 100644
index 0000000..9d607d7
--- /dev/null
+++ b/app_expo/components/icon/icons/arrow-left.png
Binary files differ
diff --git a/app_expo/components/icon/icons/[email protected] b/app_expo/components/icon/icons/[email protected]
new file mode 100644
index 0000000..9d607d7
--- /dev/null
+++ b/app_expo/components/icon/icons/[email protected]
Binary files differ
diff --git a/app_expo/components/icon/icons/bullet.png b/app_expo/components/icon/icons/bullet.png
new file mode 100644
index 0000000..8fc256f
--- /dev/null
+++ b/app_expo/components/icon/icons/bullet.png
Binary files differ
diff --git a/app_expo/components/icon/icons/[email protected] b/app_expo/components/icon/icons/[email protected]
new file mode 100644
index 0000000..8fc256f
--- /dev/null
+++ b/app_expo/components/icon/icons/[email protected]
Binary files differ
diff --git a/app_expo/components/icon/icons/index.ts b/app_expo/components/icon/icons/index.ts
new file mode 100644
index 0000000..792e408
--- /dev/null
+++ b/app_expo/components/icon/icons/index.ts
@@ -0,0 +1,6 @@
+export const icons = {
+ back: require('./arrow-left.png'),
+ bullet: require('./bullet.png'),
+}
+
+export type IconTypes = keyof typeof icons
diff --git a/app_expo/components/index.ts b/app_expo/components/index.ts
new file mode 100644
index 0000000..d93e972
--- /dev/null
+++ b/app_expo/components/index.ts
@@ -0,0 +1,16 @@
+export * from './bullet-item/bullet-item'
+export * from './button/button'
+export * from './checkbox/checkbox'
+export * from './form-row/form-row'
+export * from './header/header'
+export * from './icon/icon'
+export * from './screen/screen'
+export * from './switch/switch'
+export * from './text/text'
+export * from './text-field/text-field'
+export * from './wallpaper/wallpaper'
+export * from './auto-image/auto-image'
+export * from './graph/graph'
+export * from './tweaks/tweaks'
+export * from './local-button/local-button'
+export * from './graph-ui/graph-ui'
diff --git a/app_expo/components/local-button/local-button.story.tsx b/app_expo/components/local-button/local-button.story.tsx
new file mode 100644
index 0000000..0d35ab2
--- /dev/null
+++ b/app_expo/components/local-button/local-button.story.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { color } from '../../theme'
+import { LocalButton } from './local-button'
+
+storiesOf('LocalButton', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="Primary" usage="The primary.">
+ <LocalButton style={{ backgroundColor: color.error }} />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/local-button/local-button.tsx b/app_expo/components/local-button/local-button.tsx
new file mode 100644
index 0000000..c1021a3
--- /dev/null
+++ b/app_expo/components/local-button/local-button.tsx
@@ -0,0 +1,50 @@
+import * as React from 'react'
+import { StyleProp, TextStyle, View, ViewStyle } from 'react-native'
+import { observer } from 'mobx-react-lite'
+import { color, typography } from '../../theme'
+import { Text } from '../'
+import { flatten } from 'ramda'
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons'
+
+const CONTAINER: ViewStyle = {
+ justifyContent: 'center',
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface LocalButtonProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+ local
+ setLocal
+}
+
+/**
+ * Describe your component here
+ */
+export const LocalButton = observer(function LocalButton(props: LocalButtonProps) {
+ const { style, local, setLocal } = props
+ const styles = flatten([CONTAINER, style])
+
+ return (
+ <View style={[style, { height: 50, width: 150 }]}>
+ <Icon.Button
+ name={!local ? 'graph-outline' : 'graph'}
+ backgroundColor="#a991f1"
+ onPress={() => {
+ setLocal(!local)
+ }}
+ size={30}
+ style={{ textAlign: 'center' }}
+ >
+ {!local ? 'Global Graph' : 'Local Graph'}
+ </Icon.Button>
+ </View>
+ )
+})
diff --git a/app_expo/components/local/local.story.tsx b/app_expo/components/local/local.story.tsx
new file mode 100644
index 0000000..2bfa065
--- /dev/null
+++ b/app_expo/components/local/local.story.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { color } from '../../theme'
+import { Local } from './local'
+
+storiesOf('Local', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="Primary" usage="The primary.">
+ <Local style={{ backgroundColor: color.error }} />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/local/local.tsx b/app_expo/components/local/local.tsx
new file mode 100644
index 0000000..1478057
--- /dev/null
+++ b/app_expo/components/local/local.tsx
@@ -0,0 +1,36 @@
+import * as React from 'react'
+import { StyleProp, TextStyle, TouchableOpacity, View, ViewStyle } from 'react-native'
+import { observer } from 'mobx-react-lite'
+import { color, typography } from '../../theme'
+import { Text } from '../'
+import { flatten } from 'ramda'
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons'
+
+const CONTAINER: ViewStyle = {
+ justifyContent: 'center',
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface LocalProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+}
+
+/**
+ * Describe your component here
+ */
+export const LocalButton = observer(function LocalButton(props: LocalProps): boolean {
+ const { style } = props
+ const styles = flatten([CONTAINER, style])
+
+ return (
+ <Icon color="#a99f1f" name="graph" style={{ position: 'absolute', zIndex: 100, width: 500 }} />
+ )
+})
diff --git a/app_expo/components/screen/screen.presets.ts b/app_expo/components/screen/screen.presets.ts
new file mode 100644
index 0000000..aa8d8cf
--- /dev/null
+++ b/app_expo/components/screen/screen.presets.ts
@@ -0,0 +1,66 @@
+import { ViewStyle } from 'react-native'
+import { color } from '../../theme'
+
+/**
+ * All screen keyboard offsets.
+ */
+export const offsets = {
+ none: 0,
+}
+
+/**
+ * The variations of keyboard offsets.
+ */
+export type KeyboardOffsets = keyof typeof offsets
+
+/**
+ * All the variations of screens.
+ */
+export const presets = {
+ /**
+ * No scrolling. Suitable for full-screen carousels and components
+ * which have built-in scrolling like FlatList.
+ */
+ fixed: {
+ outer: {
+ backgroundColor: color.background,
+ flex: 1,
+ height: '100%',
+ } as ViewStyle,
+ inner: {
+ justifyContent: 'flex-start',
+ alignItems: 'stretch',
+ height: '100%',
+ width: '100%',
+ } as ViewStyle,
+ },
+
+ /**
+ * Scrolls. Suitable for forms or other things requiring a keyboard.
+ *
+ * Pick this one if you don't know which one you want yet.
+ */
+ scroll: {
+ outer: {
+ backgroundColor: color.background,
+ flex: 1,
+ height: '100%',
+ } as ViewStyle,
+ inner: { justifyContent: 'flex-start', alignItems: 'stretch' } as ViewStyle,
+ },
+}
+
+/**
+ * The variations of screens.
+ */
+export type ScreenPresets = keyof typeof presets
+
+/**
+ * Is this preset a non-scrolling one?
+ *
+ * @param preset The preset to check
+ */
+export function isNonScrolling(preset?: ScreenPresets) {
+ // any of these things will make you scroll
+ return !preset || !presets[preset] || preset === 'fixed'
+}
diff --git a/app_expo/components/screen/screen.props.ts b/app_expo/components/screen/screen.props.ts
new file mode 100644
index 0000000..1371c64
--- /dev/null
+++ b/app_expo/components/screen/screen.props.ts
@@ -0,0 +1,46 @@
+import React from 'react'
+import { StyleProp, ViewStyle } from 'react-native'
+import { KeyboardOffsets, ScreenPresets } from './screen.presets'
+
+export interface ScreenProps {
+ /**
+ * Children components.
+ */
+ children?: React.ReactNode
+
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * One of the different types of presets.
+ */
+ preset?: ScreenPresets
+
+ /**
+ * An optional background color
+ */
+ backgroundColor?: string
+
+ /**
+ * An optional status bar setting. Defaults to light-content.
+ */
+ statusBar?: 'light-content' | 'dark-content'
+
+ /**
+ * Should we not wrap in SafeAreaView? Defaults to false.
+ */
+ unsafe?: boolean
+
+ /**
+ * By how much should we offset the keyboard? Defaults to none.
+ */
+ keyboardOffset?: KeyboardOffsets
+
+ /**
+ * Should keyboard persist on screen tap. Defaults to handled.
+ * Only applies to scroll preset.
+ */
+ keyboardShouldPersistTaps?: 'handled' | 'always' | 'never'
+}
diff --git a/app_expo/components/screen/screen.tsx b/app_expo/components/screen/screen.tsx
new file mode 100644
index 0000000..dafe36e
--- /dev/null
+++ b/app_expo/components/screen/screen.tsx
@@ -0,0 +1,66 @@
+import * as React from 'react'
+import { KeyboardAvoidingView, Platform, ScrollView, StatusBar, View } from 'react-native'
+import { useSafeAreaInsets } from 'react-native-safe-area-context'
+import { ScreenProps } from './screen.props'
+import { isNonScrolling, offsets, presets } from './screen.presets'
+
+const isIos = Platform.OS === 'ios'
+
+function ScreenWithoutScrolling(props: ScreenProps) {
+ const insets = useSafeAreaInsets()
+ const preset = presets.fixed
+ const style = props.style || {}
+ const backgroundStyle = props.backgroundColor ? { backgroundColor: props.backgroundColor } : {}
+ const insetStyle = { paddingTop: props.unsafe ? 0 : insets.top }
+
+ return (
+ <KeyboardAvoidingView
+ style={[preset.outer, backgroundStyle]}
+ behavior={isIos ? 'padding' : undefined}
+ keyboardVerticalOffset={offsets[props.keyboardOffset || 'none']}
+ >
+ <StatusBar barStyle={props.statusBar || 'light-content'} />
+ <View style={[preset.inner, style, insetStyle]}>{props.children}</View>
+ </KeyboardAvoidingView>
+ )
+}
+
+function ScreenWithScrolling(props: ScreenProps) {
+ const insets = useSafeAreaInsets()
+ const preset = presets.scroll
+ const style = props.style || {}
+ const backgroundStyle = props.backgroundColor ? { backgroundColor: props.backgroundColor } : {}
+ const insetStyle = { paddingTop: props.unsafe ? 0 : insets.top }
+
+ return (
+ <KeyboardAvoidingView
+ style={[preset.outer, backgroundStyle]}
+ behavior={isIos ? 'padding' : undefined}
+ keyboardVerticalOffset={offsets[props.keyboardOffset || 'none']}
+ >
+ <StatusBar barStyle={props.statusBar || 'light-content'} />
+ <View style={[preset.outer, backgroundStyle, insetStyle]}>
+ <ScrollView
+ style={[preset.outer, backgroundStyle]}
+ contentContainerStyle={[preset.inner, style]}
+ keyboardShouldPersistTaps={props.keyboardShouldPersistTaps || 'handled'}
+ >
+ {props.children}
+ </ScrollView>
+ </View>
+ </KeyboardAvoidingView>
+ )
+}
+
+/**
+ * The starting component on every screen in the app.
+ *
+ * @param props The screen props
+ */
+export function Screen(props: ScreenProps) {
+ if (isNonScrolling(props.preset)) {
+ return <ScreenWithoutScrolling {...props} />
+ } else {
+ return <ScreenWithScrolling {...props} />
+ }
+}
diff --git a/app_expo/components/switch/switch.props.ts b/app_expo/components/switch/switch.props.ts
new file mode 100644
index 0000000..2549a95
--- /dev/null
+++ b/app_expo/components/switch/switch.props.ts
@@ -0,0 +1,39 @@
+import { StyleProp, ViewStyle } from 'react-native'
+
+export interface SwitchProps {
+ /**
+ * On or off.
+ */
+ value?: boolean
+ /**
+ * Fires when the on/off switch triggers.
+ *
+ * @param newValue The new value we're switching to.
+ */
+ onToggle?: (newValue: boolean) => void
+
+ /**
+ * A style override to apply to the container. Useful for margins and paddings.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * Additional track styling when on.
+ */
+ trackOnStyle?: StyleProp<ViewStyle>
+
+ /**
+ * Additional track styling when off.
+ */
+ trackOffStyle?: StyleProp<ViewStyle>
+
+ /**
+ * Additional thumb styling when on.
+ */
+ thumbOnStyle?: StyleProp<ViewStyle>
+
+ /**
+ * Additional thumb styling when off.
+ */
+ thumbOffStyle?: StyleProp<ViewStyle>
+}
diff --git a/app_expo/components/switch/switch.story.tsx b/app_expo/components/switch/switch.story.tsx
new file mode 100644
index 0000000..b10f8c6
--- /dev/null
+++ b/app_expo/components/switch/switch.story.tsx
@@ -0,0 +1,116 @@
+/* eslint-disable react-native/no-inline-styles */
+/* eslint-disable react-native/no-color-literals */
+
+import * as React from 'react'
+import { View, ViewStyle } from 'react-native'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Toggle } from 'react-powerplug'
+import { Switch } from './switch'
+
+declare let module
+
+const styleArray: ViewStyle[] = [{ borderColor: '#686868' }]
+
+const trackOffStyle: ViewStyle[] = [
+ { backgroundColor: '#686868' },
+ {
+ height: 80,
+ borderRadius: 0,
+ },
+]
+const trackOnStyle: ViewStyle[] = [
+ {
+ backgroundColor: '#b1008e',
+ borderColor: '#686868',
+ },
+ {
+ height: 80,
+ borderRadius: 0,
+ },
+]
+const thumbOffStyle: ViewStyle[] = [
+ {
+ backgroundColor: '#b1008e',
+ borderColor: '#686868',
+ },
+ {
+ height: 80,
+ borderRadius: 0,
+ },
+]
+const thumbOnStyle: ViewStyle[] = [
+ { backgroundColor: '#f0c' },
+ {
+ height: 80,
+ borderRadius: 0,
+ borderColor: '#686868',
+ },
+]
+
+storiesOf('Switch', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Behaviour', () => (
+ <Story>
+ <UseCase text="The Toggle Switch" usage="Use the switch to represent on/off states.">
+ <Toggle initial={false}>
+ {({ on, toggle }) => <Switch value={on} onToggle={toggle} />}
+ </Toggle>
+ </UseCase>
+ <UseCase text="value = true" usage="This is permanently on.">
+ <Switch value={true} />
+ </UseCase>
+ <UseCase text="value = false" usage="This is permanantly off.">
+ <Switch value={false} />
+ </UseCase>
+ </Story>
+ ))
+ .add('Styling', () => (
+ <Story>
+ <UseCase text="Custom Styling" usage="Promise me this won't happen.">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Switch
+ trackOnStyle={{
+ backgroundColor: 'green',
+ borderColor: 'black',
+ }}
+ trackOffStyle={{
+ backgroundColor: 'red',
+ borderColor: 'maroon',
+ }}
+ thumbOnStyle={{ backgroundColor: 'cyan' }}
+ thumbOffStyle={{ backgroundColor: 'pink' }}
+ value={on}
+ onToggle={toggle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+
+ <UseCase text="Style array" usage="This either.">
+ <Toggle initial={false}>
+ {({ on, toggle }) => (
+ <View>
+ <Switch
+ style={styleArray}
+ trackOffStyle={trackOffStyle}
+ trackOnStyle={trackOnStyle}
+ thumbOffStyle={thumbOffStyle}
+ thumbOnStyle={thumbOnStyle}
+ // trackOnStyle={{ backgroundColor: "green", borderColor: "black" }}
+ // trackOffStyle={{ backgroundColor: "red", borderColor: "maroon" }}
+ // thumbOnStyle={{ backgroundColor: "cyan" }}
+ // thumbOffStyle={{ backgroundColor: "pink" }}
+
+ value={on}
+ onToggle={toggle}
+ />
+ </View>
+ )}
+ </Toggle>
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/switch/switch.tsx b/app_expo/components/switch/switch.tsx
new file mode 100644
index 0000000..845d964
--- /dev/null
+++ b/app_expo/components/switch/switch.tsx
@@ -0,0 +1,114 @@
+import React from 'react'
+import { ViewStyle, Animated, Easing, TouchableWithoutFeedback } from 'react-native'
+import { color } from '../../theme'
+import { SwitchProps } from './switch.props'
+
+// dimensions
+const THUMB_SIZE = 30
+const WIDTH = 56
+const MARGIN = 2
+const OFF_POSITION = -0.5
+const ON_POSITION = WIDTH - THUMB_SIZE - MARGIN
+const BORDER_RADIUS = (THUMB_SIZE * 3) / 4
+
+// colors
+const ON_COLOR = color.primary
+const OFF_COLOR = color.palette.offWhite
+const BORDER_ON_COLOR = ON_COLOR
+const BORDER_OFF_COLOR = 'rgba(0, 0, 0, 0.1)'
+
+// animation
+const DURATION = 250
+
+// the track always has these props
+const TRACK = {
+ height: THUMB_SIZE + MARGIN,
+ width: WIDTH,
+ borderRadius: BORDER_RADIUS,
+ borderWidth: MARGIN / 2,
+ backgroundColor: color.background,
+}
+
+// the thumb always has these props
+const THUMB: ViewStyle = {
+ position: 'absolute',
+ width: THUMB_SIZE,
+ height: THUMB_SIZE,
+ borderColor: BORDER_OFF_COLOR,
+ borderRadius: THUMB_SIZE / 2,
+ borderWidth: MARGIN / 2,
+ backgroundColor: color.background,
+ shadowColor: BORDER_OFF_COLOR,
+ shadowOffset: { width: 1, height: 2 },
+ shadowOpacity: 1,
+ shadowRadius: 2,
+ elevation: 2,
+}
+
+const makeAnimatedValue = (switchOn) => new Animated.Value(switchOn ? 1 : 0)
+
+export function Switch(props: SwitchProps) {
+ const [timer] = React.useState<Animated.Value>(makeAnimatedValue(props.value))
+ const startAnimation = React.useMemo(
+ () => (newValue: boolean) => {
+ const toValue = newValue ? 1 : 0
+ const easing = Easing.out(Easing.circle)
+ Animated.timing(timer, {
+ toValue,
+ duration: DURATION,
+ easing,
+ useNativeDriver: true,
+ }).start()
+ },
+ [timer],
+ )
+
+ const [previousValue, setPreviousValue] = React.useState<boolean>(props.value)
+ React.useEffect(() => {
+ if (props.value !== previousValue) {
+ startAnimation(props.value)
+ setPreviousValue(props.value)
+ }
+ }, [props.value])
+
+ const handlePress = React.useMemo(
+ () => () => props.onToggle && props.onToggle(!props.value),
+ [props.onToggle, props.value],
+ )
+
+ if (!timer) {
+ return null
+ }
+
+ const translateX = timer.interpolate({
+ inputRange: [0, 1],
+ outputRange: [OFF_POSITION, ON_POSITION],
+ })
+
+ const style = props.style
+
+ const trackStyle = [
+ TRACK,
+ {
+ backgroundColor: props.value ? ON_COLOR : OFF_COLOR,
+ borderColor: props.value ? BORDER_ON_COLOR : BORDER_OFF_COLOR,
+ },
+ props.value ? props.trackOnStyle : props.trackOffStyle,
+ ]
+
+ const thumbStyle = [
+ THUMB,
+ {
+ transform: [{ translateX }],
+ },
+ props.value ? props.thumbOnStyle : props.thumbOffStyle,
+ ]
+
+ return (
+ <TouchableWithoutFeedback onPress={handlePress} style={style}>
+ <Animated.View style={trackStyle}>
+ <Animated.View style={thumbStyle} />
+ </Animated.View>
+ </TouchableWithoutFeedback>
+ )
+}
diff --git a/app_expo/components/text-field/text-field.story.tsx b/app_expo/components/text-field/text-field.story.tsx
new file mode 100644
index 0000000..5f4d408
--- /dev/null
+++ b/app_expo/components/text-field/text-field.story.tsx
@@ -0,0 +1,159 @@
+/* eslint-disable react-native/no-inline-styles */
+/* eslint-disable react-native/no-color-literals */
+
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Text, TextField } from '../'
+import { State } from 'react-powerplug'
+import { ViewStyle, TextStyle, Alert } from 'react-native'
+
+declare let module
+
+const styleArray: ViewStyle[] = [{ paddingHorizontal: 30 }, { borderWidth: 30 }]
+
+const inputStyleArray: TextStyle[] = [
+ {
+ backgroundColor: 'rebeccapurple',
+ color: 'white',
+ padding: 40,
+ },
+ {
+ borderWidth: 10,
+ borderRadius: 4,
+ borderColor: '#7fff00',
+ },
+]
+let alertWhenFocused = true
+
+storiesOf('TextField', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Labelling', () => (
+ <Story>
+ <UseCase text="Normal text" usage="Use placeholder and label to set the text.">
+ <State initial={{ value: '' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ label="Name"
+ placeholder="omg your name"
+ />
+ )}
+ </State>
+ </UseCase>
+
+ <UseCase text="i18n text" usage="Use placeholderTx and labelTx for i18n lookups">
+ <State initial={{ value: '' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ placeholderTx="storybook.placeholder"
+ labelTx="storybook.field"
+ />
+ )}
+ </State>
+ </UseCase>
+ </Story>
+ ))
+ .add('Style Overrides', () => (
+ <Story>
+ <UseCase
+ noPad
+ text="Container Styles"
+ usage="Useful for applying margins when laying out a form to remove padding if the form brings its own."
+ >
+ <State initial={{ value: 'Inigo' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ label="First Name"
+ style={{ paddingTop: 0, paddingHorizontal: 40 }}
+ />
+ )}
+ </State>
+ <State initial={{ value: 'Montoya' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ label="Last Name"
+ style={{ paddingBottom: 0 }}
+ />
+ )}
+ </State>
+ </UseCase>
+ <UseCase
+ text="Input Styles"
+ usage="Useful for 1-off exceptions. Try to steer towards presets for this kind of thing."
+ >
+ <State initial={{ value: 'fancy colour' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ label="Name"
+ inputStyle={{
+ backgroundColor: 'rebeccapurple',
+ color: 'white',
+ padding: 40,
+ borderWidth: 10,
+ borderRadius: 4,
+ borderColor: 'hotpink',
+ }}
+ />
+ )}
+ </State>
+ <Text text="* attention designers: i am so sorry" preset="secondary" />
+ </UseCase>
+
+ <UseCase text="Style array" usage="Useful for 1-off exceptions, but using style arrays.">
+ <State initial={{ value: 'fancy colour' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ label="Name"
+ style={styleArray}
+ inputStyle={inputStyleArray}
+ />
+ )}
+ </State>
+ <Text text="* attention designers: i am so sorry" preset="secondary" />
+ </UseCase>
+ </Story>
+ ))
+ .add('Ref Forwarding', () => (
+ <Story>
+ <UseCase text="Ref Forwarding" usage="">
+ <State initial={{ value: 'fancy colour' }}>
+ {({ state, setState }) => (
+ <TextField
+ onChangeText={(value) => setState({ value })}
+ value={state.value}
+ label="Name"
+ inputStyle={{
+ backgroundColor: 'rebeccapurple',
+ color: 'white',
+ padding: 40,
+ borderWidth: 10,
+ borderRadius: 4,
+ borderColor: 'hotpink',
+ }}
+ forwardedRef={(ref) => ref}
+ onFocus={() => {
+ if (alertWhenFocused) {
+ // Prevent text field focus from being repeatedly triggering alert
+ alertWhenFocused = false
+ Alert.alert('Text field focuesed with forwarded ref!')
+ }
+ }}
+ />
+ )}
+ </State>
+ <Text text="* attention designers: i am so sorry" preset="secondary" />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/text-field/text-field.tsx b/app_expo/components/text-field/text-field.tsx
new file mode 100644
index 0000000..1d56b95
--- /dev/null
+++ b/app_expo/components/text-field/text-field.tsx
@@ -0,0 +1,98 @@
+import React from 'react'
+import { StyleProp, TextInput, TextInputProps, TextStyle, View, ViewStyle } from 'react-native'
+import { color, spacing, typography } from '../../theme'
+import { translate, TxKeyPath } from '../../i18n'
+import { Text } from '../text/text'
+
+// the base styling for the container
+const CONTAINER: ViewStyle = {
+ paddingVertical: spacing[3],
+}
+
+// the base styling for the TextInput
+const INPUT: TextStyle = {
+ fontFamily: typography.primary,
+ color: color.text,
+ minHeight: 44,
+ fontSize: 18,
+ backgroundColor: color.palette.white,
+}
+
+// currently we have no presets, but that changes quickly when you build your app.
+const PRESETS: { [name: string]: ViewStyle } = {
+ default: {},
+}
+
+export interface TextFieldProps extends TextInputProps {
+ /**
+ * The placeholder i18n key.
+ */
+ placeholderTx?: TxKeyPath
+
+ /**
+ * The Placeholder text if no placeholderTx is provided.
+ */
+ placeholder?: string
+
+ /**
+ * The label i18n key.
+ */
+ labelTx?: TxKeyPath
+
+ /**
+ * The label text if no labelTx is provided.
+ */
+ label?: string
+
+ /**
+ * Optional container style overrides useful for margins & padding.
+ */
+ style?: StyleProp<ViewStyle>
+
+ /**
+ * Optional style overrides for the input.
+ */
+ inputStyle?: StyleProp<TextStyle>
+
+ /**
+ * Various look & feels.
+ */
+ preset?: keyof typeof PRESETS
+
+ forwardedRef?: any
+}
+
+/**
+ * A component which has a label and an input together.
+ */
+export function TextField(props: TextFieldProps) {
+ const {
+ placeholderTx,
+ placeholder,
+ labelTx,
+ label,
+ preset = 'default',
+ style: styleOverride,
+ inputStyle: inputStyleOverride,
+ forwardedRef,
+ ...rest
+ } = props
+
+ const containerStyles = [CONTAINER, PRESETS[preset], styleOverride]
+ const inputStyles = [INPUT, inputStyleOverride]
+ const actualPlaceholder = placeholderTx ? translate(placeholderTx) : placeholder
+
+ return (
+ <View style={containerStyles}>
+ <Text preset="fieldLabel" tx={labelTx} text={label} />
+ <TextInput
+ placeholder={actualPlaceholder}
+ placeholderTextColor={color.palette.lighterGrey}
+ underlineColorAndroid={color.transparent}
+ {...rest}
+ style={inputStyles}
+ ref={forwardedRef}
+ />
+ </View>
+ )
+}
diff --git a/app_expo/components/text/text.presets.ts b/app_expo/components/text/text.presets.ts
new file mode 100644
index 0000000..4693417
--- /dev/null
+++ b/app_expo/components/text/text.presets.ts
@@ -0,0 +1,48 @@
+import { TextStyle } from 'react-native'
+import { color, typography } from '../../theme'
+
+/**
+ * All text will start off looking like this.
+ */
+const BASE: TextStyle = {
+ fontFamily: typography.primary,
+ color: color.text,
+ fontSize: 15,
+}
+
+/**
+ * All the variations of text styling within the app.
+ *
+ * You want to customize these to whatever you need in your app.
+ */
+export const presets = {
+ /**
+ * The default text styles.
+ */
+ default: BASE,
+
+ /**
+ * A bold version of the default text.
+ */
+ bold: { ...BASE, fontWeight: 'bold' } as TextStyle,
+
+ /**
+ * Large headers.
+ */
+ header: { ...BASE, fontSize: 24, fontWeight: 'bold' } as TextStyle,
+
+ /**
+ * Field labels that appear on forms above the inputs.
+ */
+ fieldLabel: { ...BASE, fontSize: 13, color: color.dim } as TextStyle,
+
+ /**
+ * A smaller piece of secondard information.
+ */
+ secondary: { ...BASE, fontSize: 9, color: color.dim } as TextStyle,
+}
+
+/**
+ * A list of preset names.
+ */
+export type TextPresets = keyof typeof presets
diff --git a/app_expo/components/text/text.props.ts b/app_expo/components/text/text.props.ts
new file mode 100644
index 0000000..79ee12c
--- /dev/null
+++ b/app_expo/components/text/text.props.ts
@@ -0,0 +1,37 @@
+import { StyleProp, TextProps as TextProperties, TextStyle } from 'react-native'
+import i18n from 'i18n-js'
+import { TextPresets } from './text.presets'
+import { TxKeyPath } from '../../i18n'
+
+export interface TextProps extends TextProperties {
+ /**
+ * Children components.
+ */
+ children?: React.ReactNode
+
+ /**
+ * Text which is looked up via i18n.
+ */
+ tx?: TxKeyPath
+
+ /**
+ * Optional options to pass to i18n. Useful for interpolation
+ * as well as explicitly setting locale or translation fallbacks.
+ */
+ txOptions?: i18n.TranslateOptions
+
+ /**
+ * The text to display if not using `tx` or nested components.
+ */
+ text?: string
+
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<TextStyle>
+
+ /**
+ * One of the different types of text presets.
+ */
+ preset?: TextPresets
+}
diff --git a/app_expo/components/text/text.story.tsx b/app_expo/components/text/text.story.tsx
new file mode 100644
index 0000000..edfe24d
--- /dev/null
+++ b/app_expo/components/text/text.story.tsx
@@ -0,0 +1,92 @@
+/* eslint-disable react-native/no-inline-styles */
+/* eslint-disable react-native/no-color-literals */
+
+import * as React from 'react'
+import { View, ViewStyle } from 'react-native'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { color } from '../../theme'
+import { Text } from './text'
+
+declare let module
+
+const VIEWSTYLE = {
+ flex: 1,
+ backgroundColor: color.storybookDarkBg,
+}
+const viewStyleArray: ViewStyle[] = [VIEWSTYLE, { backgroundColor: '#7fff00' }]
+
+storiesOf('Text', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="default" usage="Used for normal body text.">
+ <View style={VIEWSTYLE}>
+ <Text>Hello!</Text>
+ <Text style={{ paddingTop: 10 }}>
+ Check out{'\n'}
+ my{'\n'}
+ line height
+ </Text>
+ <Text style={{ paddingTop: 10 }}>The quick brown fox jumped over the slow lazy dog.</Text>
+ <Text>$123,456,789.00</Text>
+ </View>
+ </UseCase>
+ <UseCase text="bold" usage="Used for bolded body text.">
+ <View style={VIEWSTYLE}>
+ <Text preset="bold">Osnap! I'm puffy.</Text>
+ </View>
+ </UseCase>
+ <UseCase text="header" usage="Used for major section headers.">
+ <View style={VIEWSTYLE}>
+ <Text preset="header">Behold!</Text>
+ </View>
+ </UseCase>
+ </Story>
+ ))
+ .add('Passing Content', () => (
+ <Story>
+ <UseCase
+ text="text"
+ usage="Used when you want to pass a value but don't want to open a child."
+ >
+ <View style={VIEWSTYLE}>
+ <Text text="Heyo!" />
+ </View>
+ </UseCase>
+ <UseCase text="tx" usage="Used for looking up i18n keys.">
+ <View style={VIEWSTYLE}>
+ <Text tx="common.ok" />
+ <Text tx="common.cancel" />
+ </View>
+ </UseCase>
+ <UseCase
+ text="children"
+ usage="Used like you would normally use a React Native <Text> component."
+ >
+ <View style={VIEWSTYLE}>
+ <Text>Passing strings as children.</Text>
+ </View>
+ </UseCase>
+ <UseCase text="nested children" usage="You can embed them and change styles too.">
+ <View style={VIEWSTYLE}>
+ <Text>
+ {' '}
+ Hello <Text preset="bold">bolded</Text> World.
+ </Text>
+ </View>
+ </UseCase>
+ </Story>
+ ))
+ .add('Styling', () => (
+ <Story>
+ <UseCase text="Style array" usage="Text with style array">
+ <View style={viewStyleArray}>
+ <Text>
+ {' '}
+ Hello <Text preset="bold">bolded</Text> World.
+ </Text>
+ </View>
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/text/text.tsx b/app_expo/components/text/text.tsx
new file mode 100644
index 0000000..d9ffc8c
--- /dev/null
+++ b/app_expo/components/text/text.tsx
@@ -0,0 +1,28 @@
+import * as React from 'react'
+import { Text as ReactNativeText } from 'react-native'
+import { presets } from './text.presets'
+import { TextProps } from './text.props'
+import { translate } from '../../i18n'
+
+/**
+ * For your text displaying needs.
+ *
+ * This component is a HOC over the built-in React Native one.
+ */
+export function Text(props: TextProps) {
+ // grab the props
+ const { preset = 'default', tx, txOptions, text, children, style: styleOverride, ...rest } = props
+
+ // figure out which content to use
+ const i18nText = tx && translate(tx, txOptions)
+ const content = i18nText || text || children
+
+ const style = presets[preset] || presets.default
+ const styles = [style, styleOverride]
+
+ return (
+ <ReactNativeText {...rest} style={styles}>
+ {content}
+ </ReactNativeText>
+ )
+}
diff --git a/app_expo/components/tweaks/tweaks.story.tsx b/app_expo/components/tweaks/tweaks.story.tsx
new file mode 100644
index 0000000..770d50f
--- /dev/null
+++ b/app_expo/components/tweaks/tweaks.story.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { color } from '../../theme'
+import { Tweaks } from './tweaks'
+
+storiesOf('Tweaks', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="Primary" usage="The primary.">
+ <Tweaks style={{ backgroundColor: color.error }} />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/tweaks/tweaks.tsx b/app_expo/components/tweaks/tweaks.tsx
new file mode 100644
index 0000000..ea35805
--- /dev/null
+++ b/app_expo/components/tweaks/tweaks.tsx
@@ -0,0 +1,617 @@
+import * as React from 'react'
+import {
+ ScrollView,
+ StyleProp,
+ TextStyle,
+ TouchableOpacity,
+ View,
+ ViewStyle,
+ StyleSheet,
+ Button,
+} from 'react-native'
+import { observer } from 'mobx-react-lite'
+import { color, typography } from '../../theme'
+import { Text } from '../'
+import { flatten } from 'ramda'
+import Slider from '@react-native-community/slider'
+import { useState } from 'react'
+import Accordion from 'react-native-collapsible/Accordion'
+import * as Animatable from 'react-native-animatable'
+import Icon from 'react-native-vector-icons/MaterialCommunityIcons'
+import { Switch } from 'react-native-elements'
+
+const CONTAINER: ViewStyle = {
+ justifyContent: 'center',
+}
+
+const TEXT: TextStyle = {
+ fontFamily: typography.primary,
+ fontSize: 14,
+ color: color.primary,
+}
+
+export interface TweaksProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ViewStyle>
+ physics
+ setPhysics
+}
+
+/**
+ * Describe your component here
+ */
+export const Tweaks = observer(function Tweaks(props: TweaksProps): JSX.Element {
+ const { style, physics, setPhysics } = props
+ // const styles = flatten([CONTAINER, style])
+
+ const content = [
+ {
+ title: 'Physics',
+ content: (
+ <View>
+ <Text preset="fieldLabel" text="Gravity" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.gravityOn}
+ onValueChange={() => {
+ setPhysics({ ...physics, gravityOn: !physics.gravityOn })
+ }}
+ />
+ <Text preset="fieldLabel" text={'Gravity: ' + physics.gravity} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={1}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, gravity: value })
+ }}
+ value={physics.gravity}
+ step={0.01}
+ />
+ <Text preset="fieldLabel" text={'Repulsive force: ' + physics.charge} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={-400}
+ maximumValue={100}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, charge: value })
+ }}
+ value={physics.charge}
+ step={1}
+ />
+ <Text preset="fieldLabel" text={'Link Force: ' + physics.linkStrength} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={2}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, linkStrength: value })
+ }}
+ value={physics.linkStrength}
+ step={0.01}
+ />
+ <Text preset="fieldLabel" text={"'Link Iterations': " + physics.linkIts} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={1}
+ maximumValue={10}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, linkIts: value })
+ }}
+ value={physics.linkIts}
+ step={1}
+ />
+ <Text preset="fieldLabel" text="Collision" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.collision}
+ onValueChange={() => {
+ setPhysics({ ...physics, collision: !physics.collision })
+ }}
+ />
+ <Text preset="fieldLabel" text={'Alpha Decay: ' + physics.alphaDecay} />
+ <Slider
+ style={styles.slider}
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ minimumValue={0}
+ maximumValue={1}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, alphaDecay: value })
+ }}
+ value={physics.alphaDecay}
+ step={0.01}
+ />
+ <Text preset="fieldLabel" text={'Alhpa Target: ' + physics.alphaTarget} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={1}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, alphaTarget: value })
+ }}
+ value={physics.alphaTarget}
+ step={0.1}
+ />
+ <Text preset="fieldLabel" text={'Viscosity: ' + physics.velocityDecay} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={1}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, velocityDecay: value })
+ }}
+ value={physics.velocityDecay}
+ step={0.01}
+ />
+ <Text preset="fieldLabel" text={'Galaxy Mode (3D-only)'} />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.galaxy}
+ onValueChange={() => {
+ setPhysics({ ...physics, galaxy: !physics.galaxy })
+ }}
+ />
+ </View>
+ ),
+ },
+ {
+ title: 'Visual',
+ content: (
+ <View>
+ <Text preset="fieldLabel" text="Colorful" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.colorful}
+ onValueChange={() => {
+ setPhysics({ ...physics, colorful: !physics.colorful })
+ }}
+ />
+ <Text preset="fieldLabel" text="Hover highlight" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.hover}
+ onValueChange={() => {
+ setPhysics({ ...physics, hover: !physics.hover })
+ }}
+ />
+ <Text preset="fieldLabel" text={'Line Opacity: ' + physics.linkOpacity} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={1}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, linkOpacity: value })
+ }}
+ value={physics.linkOpacity}
+ step={0.01}
+ />
+ <Text preset="fieldLabel" text={'Line width: ' + physics.linkWidth} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0.1}
+ maximumValue={10}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, linkWidth: value })
+ }}
+ value={physics.linkWidth}
+ step={0.1}
+ />
+ <Text preset="fieldLabel" text={'Node size: ' + physics.nodeRel} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={1}
+ maximumValue={10}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, nodeRel: value })
+ }}
+ value={physics.nodeRel}
+ step={0.01}
+ />
+ <Text preset="fieldLabel" text={'Particles: ' + physics.particles} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={10}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, particles: value })
+ }}
+ value={physics.particles}
+ step={1}
+ />
+ <Text preset="fieldLabel" text={'Particle Size: ' + physics.particleWidth} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={1}
+ maximumValue={10}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, particleWidth: value })
+ }}
+ value={physics.particleWidth}
+ step={0.1}
+ />
+ <Text preset="fieldLabel" text="Labels" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.labels}
+ onValueChange={() => {
+ setPhysics({ ...physics, labels: !physics.labels })
+ }}
+ />
+ <Text
+ preset="fieldLabel"
+ text={'Scale when labels become visible: ' + physics.labelScale}
+ />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0.1}
+ maximumValue={5}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, labelScale: value })
+ }}
+ value={physics.labelScale}
+ step={0.1}
+ />
+ </View>
+ ),
+ },
+ {
+ title: 'Modes',
+ content: <View></View>,
+ },
+ ]
+
+ const [activeSections, setActiveSections] = useState([])
+
+ const setSections = (sections) => {
+ setActiveSections(sections.includes(undefined) ? [] : sections)
+ }
+
+ const renderHeader = (section, _, isActive) => {
+ return (
+ <Animatable.View
+ duration={400}
+ style={[styles.header, isActive ? styles.active : styles.inactive]}
+ transition="backgroundColor"
+ >
+ <Text style={styles.headerText}>{section.title}</Text>
+ </Animatable.View>
+ )
+ }
+
+ const renderContent = (section, _, isActive) => {
+ return (
+ <Animatable.View
+ duration={400}
+ style={[styles.content, isActive ? styles.active : styles.inactive]}
+ transition="backgroundColor"
+ >
+ {section.content}
+ </Animatable.View>
+ )
+ }
+ const [tweaks, setTweaks] = useState(true)
+ if (true) {
+ if (tweaks) {
+ return (
+ <View style={styles.container}>
+ <View style={{ height: 30, width: '100%', backgroundColor: '#2a2e38' }}>
+ <TouchableOpacity
+ style={{
+ width: 30,
+ color: '#a991f1',
+ textAlign: 'center',
+ marginLeft: 'auto',
+ padding: 5,
+ }}
+ onPress={() => {
+ setTweaks(false)
+ }}
+ >
+ <Icon name="close-circle" color="#ffffff" size={20} />
+ </TouchableOpacity>
+ </View>
+ <ScrollView>
+ <Accordion
+ activeSections={activeSections}
+ sections={content}
+ touchAbleComponent={TouchableOpacity}
+ expandMultiple={true}
+ renderHeader={renderHeader}
+ renderContent={renderContent}
+ duration={200}
+ onChange={setSections}
+ renderAsFlatList={false}
+ />
+ </ScrollView>
+ </View>
+ )
+ } else {
+ return (
+ <TouchableOpacity
+ onPress={() => {
+ setTweaks(true)
+ }}
+ style={{
+ position: 'absolute',
+ top: 50,
+ left: 50,
+ width: 30,
+ color: '#ffffff',
+ zIndex: 100,
+ }}
+ >
+ <Icon name="cog" color="#ffffff" size={30} />
+ </TouchableOpacity>
+ )
+ }
+ } else {
+ return (
+ <View
+ style={{
+ position: 'absolute',
+ top: '5%',
+ left: '5%',
+ zIndex: 100,
+ width: 300,
+ backgroundColor: '#000000',
+ padding: 20,
+ }}
+ >
+ <Text preset="bold" text="Physics" />
+ <Text preset="fieldLabel" text={'Repulsive force: ' + physics.charge} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={-400}
+ maximumValue={100}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, charge: value })
+ }}
+ value={physics.charge}
+ step={1}
+ />
+ <Text preset="fieldLabel" text={'Link Force: ' + physics.linkStrength} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={2}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, linkStrength: value })
+ }}
+ value={physics.linkStrength}
+ step={0.1}
+ />
+ <Text preset="fieldLabel" text={"'Link Iterations': " + physics.linkIts} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={1}
+ maximumValue={10}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, linkIts: value })
+ }}
+ value={physics.linkIts}
+ step={1}
+ />
+ <Text preset="fieldLabel" text="Collision" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.collision}
+ onValueChange={() => {
+ setPhysics({ ...physics, collision: !physics.collision })
+ }}
+ />
+ <Text preset="bold" text="Visual" />
+ <Text preset="fieldLabel" text={'Particles: ' + physics.particles} />
+ <Slider
+ minimumTrackTintColor="#a991f1"
+ maximumTrackTintColor="#242730"
+ thumbTintColor="#a991f1"
+ style={styles.slider}
+ minimumValue={0}
+ maximumValue={5}
+ onValueChange={(value) => {
+ setPhysics({ ...physics, particles: value })
+ }}
+ value={physics.particles}
+ step={1}
+ />
+ <Text preset="bold" text="Modes" />
+ <Text preset="fieldLabel" text="Expandable Graph" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.collapse}
+ onValueChange={() => {
+ setPhysics({ ...physics, collapse: !physics.collapse })
+ }}
+ />
+ <Text preset="fieldLabel" text="3D" />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={styles.switch}
+ value={physics.threedim}
+ onValueChange={() => {
+ setPhysics({ ...physics, threedim: !physics.threedim })
+ }}
+ />
+ </View>
+ )
+ }
+})
+
+const styles = StyleSheet.create({
+ container: {
+ display: 'flex',
+ backgroundColor: '#2a2e38',
+ position: 'absolute',
+ zIndex: 5,
+ marginLeft: '2%',
+ marginTop: '2%',
+ maxWidth: 275,
+ borderRadius: 10,
+ borderStyle: 'solid',
+ borderWidth: 10,
+ borderColor: '#2a2e38',
+ maxHeight: '80%',
+ paddingBottom: 20,
+ },
+ title: {
+ textAlign: 'left',
+ fontSize: 22,
+ fontWeight: '300',
+ marginBottom: 20,
+ paddingLeft: 10,
+ },
+ header: {
+ backgroundColor: '#2a2e38',
+ padding: 10,
+ paddingBottom: 20,
+ textAlign: 'left',
+ },
+ headerText: {
+ textAlign: 'left',
+ paddingLeft: 30,
+ fontSize: 16,
+ fontWeight: '500',
+ },
+ content: {
+ padding: 20,
+ paddingLeft: 60,
+ backgroundColor: '#000000',
+ },
+ active: {
+ backgroundColor: '#2a2e38',
+ },
+ inactive: {
+ backgroundColor: '#2a2e38',
+ },
+ selectors: {
+ marginBottom: 10,
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+ selector: {
+ backgroundColor: '#2a2e38',
+ padding: 10,
+ },
+ activeSelector: {
+ fontWeight: 'bold',
+ },
+ selectTitle: {
+ fontSize: 14,
+ fontWeight: '500',
+ padding: 10,
+ },
+ multipleToggle: {
+ flexDirection: 'row',
+ justifyContent: 'center',
+ marginVertical: 30,
+ alignItems: 'center',
+ },
+ multipleToggle__title: {
+ fontSize: 16,
+ marginRight: 8,
+ },
+ slider: {
+ minimumTrackTintColor: '#a991f1',
+ thumbTintColor: '#a991f1',
+ height: 40,
+ width: '90%',
+ },
+ switch: {
+ width: '5',
+ height: 20,
+ marginVertical: 10,
+ },
+})
diff --git a/app_expo/components/wallpaper/wallpaper.presets.ts b/app_expo/components/wallpaper/wallpaper.presets.ts
new file mode 100644
index 0000000..148ad5c
--- /dev/null
+++ b/app_expo/components/wallpaper/wallpaper.presets.ts
@@ -0,0 +1,34 @@
+import { ImageStyle } from 'react-native'
+
+/**
+ * All wallpaper will start off looking like this.
+ */
+const BASE: ImageStyle = {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ bottom: 0,
+ right: 0,
+}
+
+/**
+ * All the variations of wallpaper styling within the app.
+ *
+ * You want to customize these to whatever you need in your app.
+ */
+export const presets = {
+ /**
+ * The default wallpaper styles.
+ */
+ stretch: {
+ ...BASE,
+ resizeMode: 'stretch',
+ width: null, // Have to set these to null because android ¯\_(ツ)_/¯
+ height: null,
+ } as ImageStyle,
+}
+
+/**
+ * A list of preset names.
+ */
+export type WallpaperPresets = keyof typeof presets
diff --git a/app_expo/components/wallpaper/wallpaper.props.ts b/app_expo/components/wallpaper/wallpaper.props.ts
new file mode 100644
index 0000000..9d97f12
--- /dev/null
+++ b/app_expo/components/wallpaper/wallpaper.props.ts
@@ -0,0 +1,19 @@
+import { ImageStyle, StyleProp } from 'react-native'
+import { WallpaperPresets } from './wallpaper.presets'
+
+export interface WallpaperProps {
+ /**
+ * An optional style override useful for padding & margin.
+ */
+ style?: StyleProp<ImageStyle>
+
+ /**
+ * An optional background image to override the default image.
+ */
+ backgroundImage?: string
+
+ /**
+ * One of the different types of wallpaper presets.
+ */
+ preset?: WallpaperPresets
+}
diff --git a/app_expo/components/wallpaper/wallpaper.story.tsx b/app_expo/components/wallpaper/wallpaper.story.tsx
new file mode 100644
index 0000000..14a5f62
--- /dev/null
+++ b/app_expo/components/wallpaper/wallpaper.story.tsx
@@ -0,0 +1,16 @@
+import * as React from 'react'
+import { storiesOf } from '@storybook/react-native'
+import { StoryScreen, Story, UseCase } from '../../../storybook/views'
+import { Wallpaper } from './wallpaper'
+
+declare let module
+
+storiesOf('Wallpaper', module)
+ .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>)
+ .add('Style Presets', () => (
+ <Story>
+ <UseCase text="default/stretch" usage="Full screen wallpaper image.">
+ <Wallpaper />
+ </UseCase>
+ </Story>
+ ))
diff --git a/app_expo/components/wallpaper/wallpaper.tsx b/app_expo/components/wallpaper/wallpaper.tsx
new file mode 100644
index 0000000..f5e24f1
--- /dev/null
+++ b/app_expo/components/wallpaper/wallpaper.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import { AutoImage as Image } from '../auto-image/auto-image'
+import { presets } from './wallpaper.presets'
+import { WallpaperProps } from './wallpaper.props'
+
+//const defaultImage = require("./bg.png")
+
+/**
+ * For your text displaying needs.
+ *
+ * This component is a HOC over the built-in React Native one.
+ */
+export function Wallpaper(props: WallpaperProps) {
+ // grab the props
+ const { preset = 'stretch', style: styleOverride, backgroundImage } = props
+
+ // assemble the style
+ const presetToUse = presets[preset] || presets.stretch
+ const styles = [presetToUse, styleOverride]
+
+ // figure out which image to use
+ //const source = backgroundImage || defaultImage
+
+ return null //<Image source={source} style={styles} />
+}
diff --git a/app_expo/config/env.js b/app_expo/config/env.js
new file mode 100644
index 0000000..e8a18b7
--- /dev/null
+++ b/app_expo/config/env.js
@@ -0,0 +1 @@
+module.exports = __DEV__ ? require('./env.dev') : require('./env.prod')
diff --git a/app_expo/data/miserables.json b/app_expo/data/miserables.json
new file mode 100644
index 0000000..046a058
--- /dev/null
+++ b/app_expo/data/miserables.json
@@ -0,0 +1,337 @@
+{
+ "nodes": [
+ { "id": "Myriel", "group": 1 },
+ { "id": "Napoleon", "group": 1 },
+ { "id": "Mlle.Baptistine", "group": 1 },
+ { "id": "Mme.Magloire", "group": 1 },
+ { "id": "CountessdeLo", "group": 1 },
+ { "id": "Geborand", "group": 1 },
+ { "id": "Champtercier", "group": 1 },
+ { "id": "Cravatte", "group": 1 },
+ { "id": "Count", "group": 1 },
+ { "id": "OldMan", "group": 1 },
+ { "id": "Labarre", "group": 2 },
+ { "id": "Valjean", "group": 2 },
+ { "id": "Marguerite", "group": 3 },
+ { "id": "Mme.deR", "group": 2 },
+ { "id": "Isabeau", "group": 2 },
+ { "id": "Gervais", "group": 2 },
+ { "id": "Tholomyes", "group": 3 },
+ { "id": "Listolier", "group": 3 },
+ { "id": "Fameuil", "group": 3 },
+ { "id": "Blacheville", "group": 3 },
+ { "id": "Favourite", "group": 3 },
+ { "id": "Dahlia", "group": 3 },
+ { "id": "Zephine", "group": 3 },
+ { "id": "Fantine", "group": 3 },
+ { "id": "Mme.Thenardier", "group": 4 },
+ { "id": "Thenardier", "group": 4 },
+ { "id": "Cosette", "group": 5 },
+ { "id": "Javert", "group": 4 },
+ { "id": "Fauchelevent", "group": 0 },
+ { "id": "Bamatabois", "group": 2 },
+ { "id": "Perpetue", "group": 3 },
+ { "id": "Simplice", "group": 2 },
+ { "id": "Scaufflaire", "group": 2 },
+ { "id": "Woman1", "group": 2 },
+ { "id": "Judge", "group": 2 },
+ { "id": "Champmathieu", "group": 2 },
+ { "id": "Brevet", "group": 2 },
+ { "id": "Chenildieu", "group": 2 },
+ { "id": "Cochepaille", "group": 2 },
+ { "id": "Pontmercy", "group": 4 },
+ { "id": "Boulatruelle", "group": 6 },
+ { "id": "Eponine", "group": 4 },
+ { "id": "Anzelma", "group": 4 },
+ { "id": "Woman2", "group": 5 },
+ { "id": "MotherInnocent", "group": 0 },
+ { "id": "Gribier", "group": 0 },
+ { "id": "Jondrette", "group": 7 },
+ { "id": "Mme.Burgon", "group": 7 },
+ { "id": "Gavroche", "group": 8 },
+ { "id": "Gillenormand", "group": 5 },
+ { "id": "Magnon", "group": 5 },
+ { "id": "Mlle.Gillenormand", "group": 5 },
+ { "id": "Mme.Pontmercy", "group": 5 },
+ { "id": "Mlle.Vaubois", "group": 5 },
+ { "id": "Lt.Gillenormand", "group": 5 },
+ { "id": "Marius", "group": 8 },
+ { "id": "BaronessT", "group": 5 },
+ { "id": "Mabeuf", "group": 8 },
+ { "id": "Enjolras", "group": 8 },
+ { "id": "Combeferre", "group": 8 },
+ { "id": "Prouvaire", "group": 8 },
+ { "id": "Feuilly", "group": 8 },
+ { "id": "Courfeyrac", "group": 8 },
+ { "id": "Bahorel", "group": 8 },
+ { "id": "Bossuet", "group": 8 },
+ { "id": "Joly", "group": 8 },
+ { "id": "Grantaire", "group": 8 },
+ { "id": "MotherPlutarch", "group": 9 },
+ { "id": "Gueulemer", "group": 4 },
+ { "id": "Babet", "group": 4 },
+ { "id": "Claquesous", "group": 4 },
+ { "id": "Montparnasse", "group": 4 },
+ { "id": "Toussaint", "group": 5 },
+ { "id": "Child1", "group": 10 },
+ { "id": "Child2", "group": 10 },
+ { "id": "Brujon", "group": 4 },
+ { "id": "Mme.Hucheloup", "group": 8 }
+ ],
+ "links": [
+ { "source": "Napoleon", "target": "Myriel", "value": 1 },
+ { "source": "Mlle.Baptistine", "target": "Myriel", "value": 8 },
+ { "source": "Mme.Magloire", "target": "Myriel", "value": 10 },
+ { "source": "Mme.Magloire", "target": "Mlle.Baptistine", "value": 6 },
+ { "source": "CountessdeLo", "target": "Myriel", "value": 1 },
+ { "source": "Geborand", "target": "Myriel", "value": 1 },
+ { "source": "Champtercier", "target": "Myriel", "value": 1 },
+ { "source": "Cravatte", "target": "Myriel", "value": 1 },
+ { "source": "Count", "target": "Myriel", "value": 2 },
+ { "source": "OldMan", "target": "Myriel", "value": 1 },
+ { "source": "Valjean", "target": "Labarre", "value": 1 },
+ { "source": "Valjean", "target": "Mme.Magloire", "value": 3 },
+ { "source": "Valjean", "target": "Mlle.Baptistine", "value": 3 },
+ { "source": "Valjean", "target": "Myriel", "value": 5 },
+ { "source": "Marguerite", "target": "Valjean", "value": 1 },
+ { "source": "Mme.deR", "target": "Valjean", "value": 1 },
+ { "source": "Isabeau", "target": "Valjean", "value": 1 },
+ { "source": "Gervais", "target": "Valjean", "value": 1 },
+ { "source": "Listolier", "target": "Tholomyes", "value": 4 },
+ { "source": "Fameuil", "target": "Tholomyes", "value": 4 },
+ { "source": "Fameuil", "target": "Listolier", "value": 4 },
+ { "source": "Blacheville", "target": "Tholomyes", "value": 4 },
+ { "source": "Blacheville", "target": "Listolier", "value": 4 },
+ { "source": "Blacheville", "target": "Fameuil", "value": 4 },
+ { "source": "Favourite", "target": "Tholomyes", "value": 3 },
+ { "source": "Favourite", "target": "Listolier", "value": 3 },
+ { "source": "Favourite", "target": "Fameuil", "value": 3 },
+ { "source": "Favourite", "target": "Blacheville", "value": 4 },
+ { "source": "Dahlia", "target": "Tholomyes", "value": 3 },
+ { "source": "Dahlia", "target": "Listolier", "value": 3 },
+ { "source": "Dahlia", "target": "Fameuil", "value": 3 },
+ { "source": "Dahlia", "target": "Blacheville", "value": 3 },
+ { "source": "Dahlia", "target": "Favourite", "value": 5 },
+ { "source": "Zephine", "target": "Tholomyes", "value": 3 },
+ { "source": "Zephine", "target": "Listolier", "value": 3 },
+ { "source": "Zephine", "target": "Fameuil", "value": 3 },
+ { "source": "Zephine", "target": "Blacheville", "value": 3 },
+ { "source": "Zephine", "target": "Favourite", "value": 4 },
+ { "source": "Zephine", "target": "Dahlia", "value": 4 },
+ { "source": "Fantine", "target": "Tholomyes", "value": 3 },
+ { "source": "Fantine", "target": "Listolier", "value": 3 },
+ { "source": "Fantine", "target": "Fameuil", "value": 3 },
+ { "source": "Fantine", "target": "Blacheville", "value": 3 },
+ { "source": "Fantine", "target": "Favourite", "value": 4 },
+ { "source": "Fantine", "target": "Dahlia", "value": 4 },
+ { "source": "Fantine", "target": "Zephine", "value": 4 },
+ { "source": "Fantine", "target": "Marguerite", "value": 2 },
+ { "source": "Fantine", "target": "Valjean", "value": 9 },
+ { "source": "Mme.Thenardier", "target": "Fantine", "value": 2 },
+ { "source": "Mme.Thenardier", "target": "Valjean", "value": 7 },
+ { "source": "Thenardier", "target": "Mme.Thenardier", "value": 13 },
+ { "source": "Thenardier", "target": "Fantine", "value": 1 },
+ { "source": "Thenardier", "target": "Valjean", "value": 12 },
+ { "source": "Cosette", "target": "Mme.Thenardier", "value": 4 },
+ { "source": "Cosette", "target": "Valjean", "value": 31 },
+ { "source": "Cosette", "target": "Tholomyes", "value": 1 },
+ { "source": "Cosette", "target": "Thenardier", "value": 1 },
+ { "source": "Javert", "target": "Valjean", "value": 17 },
+ { "source": "Javert", "target": "Fantine", "value": 5 },
+ { "source": "Javert", "target": "Thenardier", "value": 5 },
+ { "source": "Javert", "target": "Mme.Thenardier", "value": 1 },
+ { "source": "Javert", "target": "Cosette", "value": 1 },
+ { "source": "Fauchelevent", "target": "Valjean", "value": 8 },
+ { "source": "Fauchelevent", "target": "Javert", "value": 1 },
+ { "source": "Bamatabois", "target": "Fantine", "value": 1 },
+ { "source": "Bamatabois", "target": "Javert", "value": 1 },
+ { "source": "Bamatabois", "target": "Valjean", "value": 2 },
+ { "source": "Perpetue", "target": "Fantine", "value": 1 },
+ { "source": "Simplice", "target": "Perpetue", "value": 2 },
+ { "source": "Simplice", "target": "Valjean", "value": 3 },
+ { "source": "Simplice", "target": "Fantine", "value": 2 },
+ { "source": "Simplice", "target": "Javert", "value": 1 },
+ { "source": "Scaufflaire", "target": "Valjean", "value": 1 },
+ { "source": "Woman1", "target": "Valjean", "value": 2 },
+ { "source": "Woman1", "target": "Javert", "value": 1 },
+ { "source": "Judge", "target": "Valjean", "value": 3 },
+ { "source": "Judge", "target": "Bamatabois", "value": 2 },
+ { "source": "Champmathieu", "target": "Valjean", "value": 3 },
+ { "source": "Champmathieu", "target": "Judge", "value": 3 },
+ { "source": "Champmathieu", "target": "Bamatabois", "value": 2 },
+ { "source": "Brevet", "target": "Judge", "value": 2 },
+ { "source": "Brevet", "target": "Champmathieu", "value": 2 },
+ { "source": "Brevet", "target": "Valjean", "value": 2 },
+ { "source": "Brevet", "target": "Bamatabois", "value": 1 },
+ { "source": "Chenildieu", "target": "Judge", "value": 2 },
+ { "source": "Chenildieu", "target": "Champmathieu", "value": 2 },
+ { "source": "Chenildieu", "target": "Brevet", "value": 2 },
+ { "source": "Chenildieu", "target": "Valjean", "value": 2 },
+ { "source": "Chenildieu", "target": "Bamatabois", "value": 1 },
+ { "source": "Cochepaille", "target": "Judge", "value": 2 },
+ { "source": "Cochepaille", "target": "Champmathieu", "value": 2 },
+ { "source": "Cochepaille", "target": "Brevet", "value": 2 },
+ { "source": "Cochepaille", "target": "Chenildieu", "value": 2 },
+ { "source": "Cochepaille", "target": "Valjean", "value": 2 },
+ { "source": "Cochepaille", "target": "Bamatabois", "value": 1 },
+ { "source": "Pontmercy", "target": "Thenardier", "value": 1 },
+ { "source": "Boulatruelle", "target": "Thenardier", "value": 1 },
+ { "source": "Eponine", "target": "Mme.Thenardier", "value": 2 },
+ { "source": "Eponine", "target": "Thenardier", "value": 3 },
+ { "source": "Anzelma", "target": "Eponine", "value": 2 },
+ { "source": "Anzelma", "target": "Thenardier", "value": 2 },
+ { "source": "Anzelma", "target": "Mme.Thenardier", "value": 1 },
+ { "source": "Woman2", "target": "Valjean", "value": 3 },
+ { "source": "Woman2", "target": "Cosette", "value": 1 },
+ { "source": "Woman2", "target": "Javert", "value": 1 },
+ { "source": "MotherInnocent", "target": "Fauchelevent", "value": 3 },
+ { "source": "MotherInnocent", "target": "Valjean", "value": 1 },
+ { "source": "Gribier", "target": "Fauchelevent", "value": 2 },
+ { "source": "Mme.Burgon", "target": "Jondrette", "value": 1 },
+ { "source": "Gavroche", "target": "Mme.Burgon", "value": 2 },
+ { "source": "Gavroche", "target": "Thenardier", "value": 1 },
+ { "source": "Gavroche", "target": "Javert", "value": 1 },
+ { "source": "Gavroche", "target": "Valjean", "value": 1 },
+ { "source": "Gillenormand", "target": "Cosette", "value": 3 },
+ { "source": "Gillenormand", "target": "Valjean", "value": 2 },
+ { "source": "Magnon", "target": "Gillenormand", "value": 1 },
+ { "source": "Magnon", "target": "Mme.Thenardier", "value": 1 },
+ { "source": "Mlle.Gillenormand", "target": "Gillenormand", "value": 9 },
+ { "source": "Mlle.Gillenormand", "target": "Cosette", "value": 2 },
+ { "source": "Mlle.Gillenormand", "target": "Valjean", "value": 2 },
+ { "source": "Mme.Pontmercy", "target": "Mlle.Gillenormand", "value": 1 },
+ { "source": "Mme.Pontmercy", "target": "Pontmercy", "value": 1 },
+ { "source": "Mlle.Vaubois", "target": "Mlle.Gillenormand", "value": 1 },
+ { "source": "Lt.Gillenormand", "target": "Mlle.Gillenormand", "value": 2 },
+ { "source": "Lt.Gillenormand", "target": "Gillenormand", "value": 1 },
+ { "source": "Lt.Gillenormand", "target": "Cosette", "value": 1 },
+ { "source": "Marius", "target": "Mlle.Gillenormand", "value": 6 },
+ { "source": "Marius", "target": "Gillenormand", "value": 12 },
+ { "source": "Marius", "target": "Pontmercy", "value": 1 },
+ { "source": "Marius", "target": "Lt.Gillenormand", "value": 1 },
+ { "source": "Marius", "target": "Cosette", "value": 21 },
+ { "source": "Marius", "target": "Valjean", "value": 19 },
+ { "source": "Marius", "target": "Tholomyes", "value": 1 },
+ { "source": "Marius", "target": "Thenardier", "value": 2 },
+ { "source": "Marius", "target": "Eponine", "value": 5 },
+ { "source": "Marius", "target": "Gavroche", "value": 4 },
+ { "source": "BaronessT", "target": "Gillenormand", "value": 1 },
+ { "source": "BaronessT", "target": "Marius", "value": 1 },
+ { "source": "Mabeuf", "target": "Marius", "value": 1 },
+ { "source": "Mabeuf", "target": "Eponine", "value": 1 },
+ { "source": "Mabeuf", "target": "Gavroche", "value": 1 },
+ { "source": "Enjolras", "target": "Marius", "value": 7 },
+ { "source": "Enjolras", "target": "Gavroche", "value": 7 },
+ { "source": "Enjolras", "target": "Javert", "value": 6 },
+ { "source": "Enjolras", "target": "Mabeuf", "value": 1 },
+ { "source": "Enjolras", "target": "Valjean", "value": 4 },
+ { "source": "Combeferre", "target": "Enjolras", "value": 15 },
+ { "source": "Combeferre", "target": "Marius", "value": 5 },
+ { "source": "Combeferre", "target": "Gavroche", "value": 6 },
+ { "source": "Combeferre", "target": "Mabeuf", "value": 2 },
+ { "source": "Prouvaire", "target": "Gavroche", "value": 1 },
+ { "source": "Prouvaire", "target": "Enjolras", "value": 4 },
+ { "source": "Prouvaire", "target": "Combeferre", "value": 2 },
+ { "source": "Feuilly", "target": "Gavroche", "value": 2 },
+ { "source": "Feuilly", "target": "Enjolras", "value": 6 },
+ { "source": "Feuilly", "target": "Prouvaire", "value": 2 },
+ { "source": "Feuilly", "target": "Combeferre", "value": 5 },
+ { "source": "Feuilly", "target": "Mabeuf", "value": 1 },
+ { "source": "Feuilly", "target": "Marius", "value": 1 },
+ { "source": "Courfeyrac", "target": "Marius", "value": 9 },
+ { "source": "Courfeyrac", "target": "Enjolras", "value": 17 },
+ { "source": "Courfeyrac", "target": "Combeferre", "value": 13 },
+ { "source": "Courfeyrac", "target": "Gavroche", "value": 7 },
+ { "source": "Courfeyrac", "target": "Mabeuf", "value": 2 },
+ { "source": "Courfeyrac", "target": "Eponine", "value": 1 },
+ { "source": "Courfeyrac", "target": "Feuilly", "value": 6 },
+ { "source": "Courfeyrac", "target": "Prouvaire", "value": 3 },
+ { "source": "Bahorel", "target": "Combeferre", "value": 5 },
+ { "source": "Bahorel", "target": "Gavroche", "value": 5 },
+ { "source": "Bahorel", "target": "Courfeyrac", "value": 6 },
+ { "source": "Bahorel", "target": "Mabeuf", "value": 2 },
+ { "source": "Bahorel", "target": "Enjolras", "value": 4 },
+ { "source": "Bahorel", "target": "Feuilly", "value": 3 },
+ { "source": "Bahorel", "target": "Prouvaire", "value": 2 },
+ { "source": "Bahorel", "target": "Marius", "value": 1 },
+ { "source": "Bossuet", "target": "Marius", "value": 5 },
+ { "source": "Bossuet", "target": "Courfeyrac", "value": 12 },
+ { "source": "Bossuet", "target": "Gavroche", "value": 5 },
+ { "source": "Bossuet", "target": "Bahorel", "value": 4 },
+ { "source": "Bossuet", "target": "Enjolras", "value": 10 },
+ { "source": "Bossuet", "target": "Feuilly", "value": 6 },
+ { "source": "Bossuet", "target": "Prouvaire", "value": 2 },
+ { "source": "Bossuet", "target": "Combeferre", "value": 9 },
+ { "source": "Bossuet", "target": "Mabeuf", "value": 1 },
+ { "source": "Bossuet", "target": "Valjean", "value": 1 },
+ { "source": "Joly", "target": "Bahorel", "value": 5 },
+ { "source": "Joly", "target": "Bossuet", "value": 7 },
+ { "source": "Joly", "target": "Gavroche", "value": 3 },
+ { "source": "Joly", "target": "Courfeyrac", "value": 5 },
+ { "source": "Joly", "target": "Enjolras", "value": 5 },
+ { "source": "Joly", "target": "Feuilly", "value": 5 },
+ { "source": "Joly", "target": "Prouvaire", "value": 2 },
+ { "source": "Joly", "target": "Combeferre", "value": 5 },
+ { "source": "Joly", "target": "Mabeuf", "value": 1 },
+ { "source": "Joly", "target": "Marius", "value": 2 },
+ { "source": "Grantaire", "target": "Bossuet", "value": 3 },
+ { "source": "Grantaire", "target": "Enjolras", "value": 3 },
+ { "source": "Grantaire", "target": "Combeferre", "value": 1 },
+ { "source": "Grantaire", "target": "Courfeyrac", "value": 2 },
+ { "source": "Grantaire", "target": "Joly", "value": 2 },
+ { "source": "Grantaire", "target": "Gavroche", "value": 1 },
+ { "source": "Grantaire", "target": "Bahorel", "value": 1 },
+ { "source": "Grantaire", "target": "Feuilly", "value": 1 },
+ { "source": "Grantaire", "target": "Prouvaire", "value": 1 },
+ { "source": "MotherPlutarch", "target": "Mabeuf", "value": 3 },
+ { "source": "Gueulemer", "target": "Thenardier", "value": 5 },
+ { "source": "Gueulemer", "target": "Valjean", "value": 1 },
+ { "source": "Gueulemer", "target": "Mme.Thenardier", "value": 1 },
+ { "source": "Gueulemer", "target": "Javert", "value": 1 },
+ { "source": "Gueulemer", "target": "Gavroche", "value": 1 },
+ { "source": "Gueulemer", "target": "Eponine", "value": 1 },
+ { "source": "Babet", "target": "Thenardier", "value": 6 },
+ { "source": "Babet", "target": "Gueulemer", "value": 6 },
+ { "source": "Babet", "target": "Valjean", "value": 1 },
+ { "source": "Babet", "target": "Mme.Thenardier", "value": 1 },
+ { "source": "Babet", "target": "Javert", "value": 2 },
+ { "source": "Babet", "target": "Gavroche", "value": 1 },
+ { "source": "Babet", "target": "Eponine", "value": 1 },
+ { "source": "Claquesous", "target": "Thenardier", "value": 4 },
+ { "source": "Claquesous", "target": "Babet", "value": 4 },
+ { "source": "Claquesous", "target": "Gueulemer", "value": 4 },
+ { "source": "Claquesous", "target": "Valjean", "value": 1 },
+ { "source": "Claquesous", "target": "Mme.Thenardier", "value": 1 },
+ { "source": "Claquesous", "target": "Javert", "value": 1 },
+ { "source": "Claquesous", "target": "Eponine", "value": 1 },
+ { "source": "Claquesous", "target": "Enjolras", "value": 1 },
+ { "source": "Montparnasse", "target": "Javert", "value": 1 },
+ { "source": "Montparnasse", "target": "Babet", "value": 2 },
+ { "source": "Montparnasse", "target": "Gueulemer", "value": 2 },
+ { "source": "Montparnasse", "target": "Claquesous", "value": 2 },
+ { "source": "Montparnasse", "target": "Valjean", "value": 1 },
+ { "source": "Montparnasse", "target": "Gavroche", "value": 1 },
+ { "source": "Montparnasse", "target": "Eponine", "value": 1 },
+ { "source": "Montparnasse", "target": "Thenardier", "value": 1 },
+ { "source": "Toussaint", "target": "Cosette", "value": 2 },
+ { "source": "Toussaint", "target": "Javert", "value": 1 },
+ { "source": "Toussaint", "target": "Valjean", "value": 1 },
+ { "source": "Child1", "target": "Gavroche", "value": 2 },
+ { "source": "Child2", "target": "Gavroche", "value": 2 },
+ { "source": "Child2", "target": "Child1", "value": 3 },
+ { "source": "Brujon", "target": "Babet", "value": 3 },
+ { "source": "Brujon", "target": "Gueulemer", "value": 3 },
+ { "source": "Brujon", "target": "Thenardier", "value": 3 },
+ { "source": "Brujon", "target": "Gavroche", "value": 1 },
+ { "source": "Brujon", "target": "Eponine", "value": 1 },
+ { "source": "Brujon", "target": "Claquesous", "value": 1 },
+ { "source": "Brujon", "target": "Montparnasse", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Bossuet", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Joly", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Grantaire", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Bahorel", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Courfeyrac", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Gavroche", "value": 1 },
+ { "source": "Mme.Hucheloup", "target": "Enjolras", "value": 1 }
+ ]
+}
diff --git a/app_expo/data/pythonserver.py b/app_expo/data/pythonserver.py
new file mode 100644
index 0000000..69fda3a
--- /dev/null
+++ b/app_expo/data/pythonserver.py
@@ -0,0 +1,17 @@
+try:
+ # Python 3
+ from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
+ import sys
+ def test (*args):
+ test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
+except ImportError: # Python 2
+ from BaseHTTPServer import HTTPServer, test
+ from SimpleHTTPServer import SimpleHTTPRequestHandler
+
+class CORSRequestHandler (SimpleHTTPRequestHandler):
+ def end_headers (self):
+ self.send_header('Access-Control-Allow-Origin', '*')
+ SimpleHTTPRequestHandler.end_headers(self)
+
+if __name__ == '__main__':
+ test(CORSRequestHandler, HTTPServer)
diff --git a/app_expo/data/rando.json b/app_expo/data/rando.json
new file mode 100644
index 0000000..2f20408
--- /dev/null
+++ b/app_expo/data/rando.json
@@ -0,0 +1,2102 @@
+{
+ "nodes": [
+ {
+ "id": 0
+ },
+ {
+ "id": 1
+ },
+ {
+ "id": 2
+ },
+ {
+ "id": 3
+ },
+ {
+ "id": 4
+ },
+ {
+ "id": 5
+ },
+ {
+ "id": 6
+ },
+ {
+ "id": 7
+ },
+ {
+ "id": 8
+ },
+ {
+ "id": 9
+ },
+ {
+ "id": 10
+ },
+ {
+ "id": 11
+ },
+ {
+ "id": 12
+ },
+ {
+ "id": 13
+ },
+ {
+ "id": 14
+ },
+ {
+ "id": 15
+ },
+ {
+ "id": 16
+ },
+ {
+ "id": 17
+ },
+ {
+ "id": 18
+ },
+ {
+ "id": 19
+ },
+ {
+ "id": 20
+ },
+ {
+ "id": 21
+ },
+ {
+ "id": 22
+ },
+ {
+ "id": 23
+ },
+ {
+ "id": 24
+ },
+ {
+ "id": 25
+ },
+ {
+ "id": 26
+ },
+ {
+ "id": 27
+ },
+ {
+ "id": 28
+ },
+ {
+ "id": 29
+ },
+ {
+ "id": 30
+ },
+ {
+ "id": 31
+ },
+ {
+ "id": 32
+ },
+ {
+ "id": 33
+ },
+ {
+ "id": 34
+ },
+ {
+ "id": 35
+ },
+ {
+ "id": 36
+ },
+ {
+ "id": 37
+ },
+ {
+ "id": 38
+ },
+ {
+ "id": 39
+ },
+ {
+ "id": 40
+ },
+ {
+ "id": 41
+ },
+ {
+ "id": 42
+ },
+ {
+ "id": 43
+ },
+ {
+ "id": 44
+ },
+ {
+ "id": 45
+ },
+ {
+ "id": 46
+ },
+ {
+ "id": 47
+ },
+ {
+ "id": 48
+ },
+ {
+ "id": 49
+ },
+ {
+ "id": 50
+ },
+ {
+ "id": 51
+ },
+ {
+ "id": 52
+ },
+ {
+ "id": 53
+ },
+ {
+ "id": 54
+ },
+ {
+ "id": 55
+ },
+ {
+ "id": 56
+ },
+ {
+ "id": 57
+ },
+ {
+ "id": 58
+ },
+ {
+ "id": 59
+ },
+ {
+ "id": 60
+ },
+ {
+ "id": 61
+ },
+ {
+ "id": 62
+ },
+ {
+ "id": 63
+ },
+ {
+ "id": 64
+ },
+ {
+ "id": 65
+ },
+ {
+ "id": 66
+ },
+ {
+ "id": 67
+ },
+ {
+ "id": 68
+ },
+ {
+ "id": 69
+ },
+ {
+ "id": 70
+ },
+ {
+ "id": 71
+ },
+ {
+ "id": 72
+ },
+ {
+ "id": 73
+ },
+ {
+ "id": 74
+ },
+ {
+ "id": 75
+ },
+ {
+ "id": 76
+ },
+ {
+ "id": 77
+ },
+ {
+ "id": 78
+ },
+ {
+ "id": 79
+ },
+ {
+ "id": 80
+ },
+ {
+ "id": 81
+ },
+ {
+ "id": 82
+ },
+ {
+ "id": 83
+ },
+ {
+ "id": 84
+ },
+ {
+ "id": 85
+ },
+ {
+ "id": 86
+ },
+ {
+ "id": 87
+ },
+ {
+ "id": 88
+ },
+ {
+ "id": 89
+ },
+ {
+ "id": 90
+ },
+ {
+ "id": 91
+ },
+ {
+ "id": 92
+ },
+ {
+ "id": 93
+ },
+ {
+ "id": 94
+ },
+ {
+ "id": 95
+ },
+ {
+ "id": 96
+ },
+ {
+ "id": 97
+ },
+ {
+ "id": 98
+ },
+ {
+ "id": 99
+ },
+ {
+ "id": 100
+ },
+ {
+ "id": 101
+ },
+ {
+ "id": 102
+ },
+ {
+ "id": 103
+ },
+ {
+ "id": 104
+ },
+ {
+ "id": 105
+ },
+ {
+ "id": 106
+ },
+ {
+ "id": 107
+ },
+ {
+ "id": 108
+ },
+ {
+ "id": 109
+ },
+ {
+ "id": 110
+ },
+ {
+ "id": 111
+ },
+ {
+ "id": 112
+ },
+ {
+ "id": 113
+ },
+ {
+ "id": 114
+ },
+ {
+ "id": 115
+ },
+ {
+ "id": 116
+ },
+ {
+ "id": 117
+ },
+ {
+ "id": 118
+ },
+ {
+ "id": 119
+ },
+ {
+ "id": 120
+ },
+ {
+ "id": 121
+ },
+ {
+ "id": 122
+ },
+ {
+ "id": 123
+ },
+ {
+ "id": 124
+ },
+ {
+ "id": 125
+ },
+ {
+ "id": 126
+ },
+ {
+ "id": 127
+ },
+ {
+ "id": 128
+ },
+ {
+ "id": 129
+ },
+ {
+ "id": 130
+ },
+ {
+ "id": 131
+ },
+ {
+ "id": 132
+ },
+ {
+ "id": 133
+ },
+ {
+ "id": 134
+ },
+ {
+ "id": 135
+ },
+ {
+ "id": 136
+ },
+ {
+ "id": 137
+ },
+ {
+ "id": 138
+ },
+ {
+ "id": 139
+ },
+ {
+ "id": 140
+ },
+ {
+ "id": 141
+ },
+ {
+ "id": 142
+ },
+ {
+ "id": 143
+ },
+ {
+ "id": 144
+ },
+ {
+ "id": 145
+ },
+ {
+ "id": 146
+ },
+ {
+ "id": 147
+ },
+ {
+ "id": 148
+ },
+ {
+ "id": 149
+ },
+ {
+ "id": 150
+ },
+ {
+ "id": 151
+ },
+ {
+ "id": 152
+ },
+ {
+ "id": 153
+ },
+ {
+ "id": 154
+ },
+ {
+ "id": 155
+ },
+ {
+ "id": 156
+ },
+ {
+ "id": 157
+ },
+ {
+ "id": 158
+ },
+ {
+ "id": 159
+ },
+ {
+ "id": 160
+ },
+ {
+ "id": 161
+ },
+ {
+ "id": 162
+ },
+ {
+ "id": 163
+ },
+ {
+ "id": 164
+ },
+ {
+ "id": 165
+ },
+ {
+ "id": 166
+ },
+ {
+ "id": 167
+ },
+ {
+ "id": 168
+ },
+ {
+ "id": 169
+ },
+ {
+ "id": 170
+ },
+ {
+ "id": 171
+ },
+ {
+ "id": 172
+ },
+ {
+ "id": 173
+ },
+ {
+ "id": 174
+ },
+ {
+ "id": 175
+ },
+ {
+ "id": 176
+ },
+ {
+ "id": 177
+ },
+ {
+ "id": 178
+ },
+ {
+ "id": 179
+ },
+ {
+ "id": 180
+ },
+ {
+ "id": 181
+ },
+ {
+ "id": 182
+ },
+ {
+ "id": 183
+ },
+ {
+ "id": 184
+ },
+ {
+ "id": 185
+ },
+ {
+ "id": 186
+ },
+ {
+ "id": 187
+ },
+ {
+ "id": 188
+ },
+ {
+ "id": 189
+ },
+ {
+ "id": 190
+ },
+ {
+ "id": 191
+ },
+ {
+ "id": 192
+ },
+ {
+ "id": 193
+ },
+ {
+ "id": 194
+ },
+ {
+ "id": 195
+ },
+ {
+ "id": 196
+ },
+ {
+ "id": 197
+ },
+ {
+ "id": 198
+ },
+ {
+ "id": 199
+ },
+ {
+ "id": 200
+ },
+ {
+ "id": 201
+ },
+ {
+ "id": 202
+ },
+ {
+ "id": 203
+ },
+ {
+ "id": 204
+ },
+ {
+ "id": 205
+ },
+ {
+ "id": 206
+ },
+ {
+ "id": 207
+ },
+ {
+ "id": 208
+ },
+ {
+ "id": 209
+ },
+ {
+ "id": 210
+ },
+ {
+ "id": 211
+ },
+ {
+ "id": 212
+ },
+ {
+ "id": 213
+ },
+ {
+ "id": 214
+ },
+ {
+ "id": 215
+ },
+ {
+ "id": 216
+ },
+ {
+ "id": 217
+ },
+ {
+ "id": 218
+ },
+ {
+ "id": 219
+ },
+ {
+ "id": 220
+ },
+ {
+ "id": 221
+ },
+ {
+ "id": 222
+ },
+ {
+ "id": 223
+ },
+ {
+ "id": 224
+ },
+ {
+ "id": 225
+ },
+ {
+ "id": 226
+ },
+ {
+ "id": 227
+ },
+ {
+ "id": 228
+ },
+ {
+ "id": 229
+ },
+ {
+ "id": 230
+ },
+ {
+ "id": 231
+ },
+ {
+ "id": 232
+ },
+ {
+ "id": 233
+ },
+ {
+ "id": 234
+ },
+ {
+ "id": 235
+ },
+ {
+ "id": 236
+ },
+ {
+ "id": 237
+ },
+ {
+ "id": 238
+ },
+ {
+ "id": 239
+ },
+ {
+ "id": 240
+ },
+ {
+ "id": 241
+ },
+ {
+ "id": 242
+ },
+ {
+ "id": 243
+ },
+ {
+ "id": 244
+ },
+ {
+ "id": 245
+ },
+ {
+ "id": 246
+ },
+ {
+ "id": 247
+ },
+ {
+ "id": 248
+ },
+ {
+ "id": 249
+ },
+ {
+ "id": 250
+ },
+ {
+ "id": 251
+ },
+ {
+ "id": 252
+ },
+ {
+ "id": 253
+ },
+ {
+ "id": 254
+ },
+ {
+ "id": 255
+ },
+ {
+ "id": 256
+ },
+ {
+ "id": 257
+ },
+ {
+ "id": 258
+ },
+ {
+ "id": 259
+ },
+ {
+ "id": 260
+ },
+ {
+ "id": 261
+ },
+ {
+ "id": 262
+ },
+ {
+ "id": 263
+ },
+ {
+ "id": 264
+ },
+ {
+ "id": 265
+ },
+ {
+ "id": 266
+ },
+ {
+ "id": 267
+ },
+ {
+ "id": 268
+ },
+ {
+ "id": 269
+ },
+ {
+ "id": 270
+ },
+ {
+ "id": 271
+ },
+ {
+ "id": 272
+ },
+ {
+ "id": 273
+ },
+ {
+ "id": 274
+ },
+ {
+ "id": 275
+ },
+ {
+ "id": 276
+ },
+ {
+ "id": 277
+ },
+ {
+ "id": 278
+ },
+ {
+ "id": 279
+ },
+ {
+ "id": 280
+ },
+ {
+ "id": 281
+ },
+ {
+ "id": 282
+ },
+ {
+ "id": 283
+ },
+ {
+ "id": 284
+ },
+ {
+ "id": 285
+ },
+ {
+ "id": 286
+ },
+ {
+ "id": 287
+ },
+ {
+ "id": 288
+ },
+ {
+ "id": 289
+ },
+ {
+ "id": 290
+ },
+ {
+ "id": 291
+ },
+ {
+ "id": 292
+ },
+ {
+ "id": 293
+ },
+ {
+ "id": 294
+ },
+ {
+ "id": 295
+ },
+ {
+ "id": 296
+ },
+ {
+ "id": 297
+ },
+ {
+ "id": 298
+ },
+ {
+ "id": 299
+ }
+ ],
+ "links": [
+ {
+ "source": 1,
+ "target": 0
+ },
+ {
+ "source": 2,
+ "target": 0
+ },
+ {
+ "source": 3,
+ "target": 0
+ },
+ {
+ "source": 4,
+ "target": 2
+ },
+ {
+ "source": 5,
+ "target": 3
+ },
+ {
+ "source": 6,
+ "target": 1
+ },
+ {
+ "source": 7,
+ "target": 2
+ },
+ {
+ "source": 8,
+ "target": 6
+ },
+ {
+ "source": 9,
+ "target": 3
+ },
+ {
+ "source": 10,
+ "target": 6
+ },
+ {
+ "source": 11,
+ "target": 1
+ },
+ {
+ "source": 12,
+ "target": 9
+ },
+ {
+ "source": 13,
+ "target": 5
+ },
+ {
+ "source": 14,
+ "target": 2
+ },
+ {
+ "source": 15,
+ "target": 10
+ },
+ {
+ "source": 16,
+ "target": 11
+ },
+ {
+ "source": 17,
+ "target": 11
+ },
+ {
+ "source": 18,
+ "target": 9
+ },
+ {
+ "source": 19,
+ "target": 7
+ },
+ {
+ "source": 20,
+ "target": 3
+ },
+ {
+ "source": 21,
+ "target": 5
+ },
+ {
+ "source": 22,
+ "target": 13
+ },
+ {
+ "source": 23,
+ "target": 20
+ },
+ {
+ "source": 24,
+ "target": 2
+ },
+ {
+ "source": 25,
+ "target": 23
+ },
+ {
+ "source": 26,
+ "target": 6
+ },
+ {
+ "source": 27,
+ "target": 17
+ },
+ {
+ "source": 28,
+ "target": 13
+ },
+ {
+ "source": 29,
+ "target": 21
+ },
+ {
+ "source": 30,
+ "target": 12
+ },
+ {
+ "source": 31,
+ "target": 4
+ },
+ {
+ "source": 32,
+ "target": 2
+ },
+ {
+ "source": 33,
+ "target": 20
+ },
+ {
+ "source": 34,
+ "target": 27
+ },
+ {
+ "source": 35,
+ "target": 16
+ },
+ {
+ "source": 36,
+ "target": 5
+ },
+ {
+ "source": 37,
+ "target": 9
+ },
+ {
+ "source": 38,
+ "target": 12
+ },
+ {
+ "source": 39,
+ "target": 11
+ },
+ {
+ "source": 40,
+ "target": 16
+ },
+ {
+ "source": 41,
+ "target": 27
+ },
+ {
+ "source": 42,
+ "target": 11
+ },
+ {
+ "source": 43,
+ "target": 29
+ },
+ {
+ "source": 44,
+ "target": 9
+ },
+ {
+ "source": 45,
+ "target": 39
+ },
+ {
+ "source": 46,
+ "target": 38
+ },
+ {
+ "source": 47,
+ "target": 13
+ },
+ {
+ "source": 48,
+ "target": 25
+ },
+ {
+ "source": 49,
+ "target": 30
+ },
+ {
+ "source": 50,
+ "target": 37
+ },
+ {
+ "source": 51,
+ "target": 44
+ },
+ {
+ "source": 52,
+ "target": 36
+ },
+ {
+ "source": 53,
+ "target": 10
+ },
+ {
+ "source": 54,
+ "target": 48
+ },
+ {
+ "source": 55,
+ "target": 2
+ },
+ {
+ "source": 56,
+ "target": 52
+ },
+ {
+ "source": 57,
+ "target": 55
+ },
+ {
+ "source": 58,
+ "target": 49
+ },
+ {
+ "source": 59,
+ "target": 50
+ },
+ {
+ "source": 60,
+ "target": 21
+ },
+ {
+ "source": 61,
+ "target": 2
+ },
+ {
+ "source": 62,
+ "target": 41
+ },
+ {
+ "source": 63,
+ "target": 14
+ },
+ {
+ "source": 64,
+ "target": 46
+ },
+ {
+ "source": 65,
+ "target": 19
+ },
+ {
+ "source": 66,
+ "target": 56
+ },
+ {
+ "source": 67,
+ "target": 42
+ },
+ {
+ "source": 68,
+ "target": 63
+ },
+ {
+ "source": 69,
+ "target": 23
+ },
+ {
+ "source": 70,
+ "target": 62
+ },
+ {
+ "source": 71,
+ "target": 29
+ },
+ {
+ "source": 72,
+ "target": 70
+ },
+ {
+ "source": 73,
+ "target": 72
+ },
+ {
+ "source": 74,
+ "target": 36
+ },
+ {
+ "source": 75,
+ "target": 42
+ },
+ {
+ "source": 76,
+ "target": 7
+ },
+ {
+ "source": 77,
+ "target": 45
+ },
+ {
+ "source": 78,
+ "target": 4
+ },
+ {
+ "source": 79,
+ "target": 37
+ },
+ {
+ "source": 80,
+ "target": 44
+ },
+ {
+ "source": 81,
+ "target": 42
+ },
+ {
+ "source": 82,
+ "target": 1
+ },
+ {
+ "source": 83,
+ "target": 43
+ },
+ {
+ "source": 84,
+ "target": 21
+ },
+ {
+ "source": 85,
+ "target": 41
+ },
+ {
+ "source": 86,
+ "target": 18
+ },
+ {
+ "source": 87,
+ "target": 57
+ },
+ {
+ "source": 88,
+ "target": 58
+ },
+ {
+ "source": 89,
+ "target": 63
+ },
+ {
+ "source": 90,
+ "target": 4
+ },
+ {
+ "source": 91,
+ "target": 14
+ },
+ {
+ "source": 92,
+ "target": 80
+ },
+ {
+ "source": 93,
+ "target": 74
+ },
+ {
+ "source": 94,
+ "target": 65
+ },
+ {
+ "source": 95,
+ "target": 92
+ },
+ {
+ "source": 96,
+ "target": 26
+ },
+ {
+ "source": 97,
+ "target": 44
+ },
+ {
+ "source": 98,
+ "target": 47
+ },
+ {
+ "source": 99,
+ "target": 89
+ },
+ {
+ "source": 100,
+ "target": 2
+ },
+ {
+ "source": 101,
+ "target": 76
+ },
+ {
+ "source": 102,
+ "target": 92
+ },
+ {
+ "source": 103,
+ "target": 58
+ },
+ {
+ "source": 104,
+ "target": 84
+ },
+ {
+ "source": 105,
+ "target": 99
+ },
+ {
+ "source": 106,
+ "target": 95
+ },
+ {
+ "source": 107,
+ "target": 101
+ },
+ {
+ "source": 108,
+ "target": 34
+ },
+ {
+ "source": 109,
+ "target": 60
+ },
+ {
+ "source": 110,
+ "target": 25
+ },
+ {
+ "source": 111,
+ "target": 11
+ },
+ {
+ "source": 112,
+ "target": 79
+ },
+ {
+ "source": 113,
+ "target": 107
+ },
+ {
+ "source": 114,
+ "target": 24
+ },
+ {
+ "source": 115,
+ "target": 43
+ },
+ {
+ "source": 116,
+ "target": 4
+ },
+ {
+ "source": 117,
+ "target": 76
+ },
+ {
+ "source": 118,
+ "target": 43
+ },
+ {
+ "source": 119,
+ "target": 106
+ },
+ {
+ "source": 120,
+ "target": 26
+ },
+ {
+ "source": 121,
+ "target": 109
+ },
+ {
+ "source": 122,
+ "target": 98
+ },
+ {
+ "source": 123,
+ "target": 5
+ },
+ {
+ "source": 124,
+ "target": 35
+ },
+ {
+ "source": 125,
+ "target": 80
+ },
+ {
+ "source": 126,
+ "target": 106
+ },
+ {
+ "source": 127,
+ "target": 15
+ },
+ {
+ "source": 128,
+ "target": 49
+ },
+ {
+ "source": 129,
+ "target": 9
+ },
+ {
+ "source": 130,
+ "target": 109
+ },
+ {
+ "source": 131,
+ "target": 72
+ },
+ {
+ "source": 132,
+ "target": 62
+ },
+ {
+ "source": 133,
+ "target": 61
+ },
+ {
+ "source": 134,
+ "target": 107
+ },
+ {
+ "source": 135,
+ "target": 125
+ },
+ {
+ "source": 136,
+ "target": 56
+ },
+ {
+ "source": 137,
+ "target": 98
+ },
+ {
+ "source": 138,
+ "target": 50
+ },
+ {
+ "source": 139,
+ "target": 120
+ },
+ {
+ "source": 140,
+ "target": 72
+ },
+ {
+ "source": 141,
+ "target": 85
+ },
+ {
+ "source": 142,
+ "target": 13
+ },
+ {
+ "source": 143,
+ "target": 55
+ },
+ {
+ "source": 144,
+ "target": 12
+ },
+ {
+ "source": 145,
+ "target": 125
+ },
+ {
+ "source": 146,
+ "target": 41
+ },
+ {
+ "source": 147,
+ "target": 79
+ },
+ {
+ "source": 148,
+ "target": 33
+ },
+ {
+ "source": 149,
+ "target": 8
+ },
+ {
+ "source": 150,
+ "target": 23
+ },
+ {
+ "source": 151,
+ "target": 10
+ },
+ {
+ "source": 152,
+ "target": 119
+ },
+ {
+ "source": 153,
+ "target": 119
+ },
+ {
+ "source": 154,
+ "target": 152
+ },
+ {
+ "source": 155,
+ "target": 52
+ },
+ {
+ "source": 156,
+ "target": 149
+ },
+ {
+ "source": 157,
+ "target": 114
+ },
+ {
+ "source": 158,
+ "target": 79
+ },
+ {
+ "source": 159,
+ "target": 149
+ },
+ {
+ "source": 160,
+ "target": 103
+ },
+ {
+ "source": 161,
+ "target": 123
+ },
+ {
+ "source": 162,
+ "target": 112
+ },
+ {
+ "source": 163,
+ "target": 94
+ },
+ {
+ "source": 164,
+ "target": 67
+ },
+ {
+ "source": 165,
+ "target": 113
+ },
+ {
+ "source": 166,
+ "target": 1
+ },
+ {
+ "source": 167,
+ "target": 3
+ },
+ {
+ "source": 168,
+ "target": 100
+ },
+ {
+ "source": 169,
+ "target": 22
+ },
+ {
+ "source": 170,
+ "target": 118
+ },
+ {
+ "source": 171,
+ "target": 116
+ },
+ {
+ "source": 172,
+ "target": 79
+ },
+ {
+ "source": 173,
+ "target": 141
+ },
+ {
+ "source": 174,
+ "target": 72
+ },
+ {
+ "source": 175,
+ "target": 4
+ },
+ {
+ "source": 176,
+ "target": 159
+ },
+ {
+ "source": 177,
+ "target": 147
+ },
+ {
+ "source": 178,
+ "target": 86
+ },
+ {
+ "source": 179,
+ "target": 138
+ },
+ {
+ "source": 180,
+ "target": 107
+ },
+ {
+ "source": 181,
+ "target": 90
+ },
+ {
+ "source": 182,
+ "target": 123
+ },
+ {
+ "source": 183,
+ "target": 121
+ },
+ {
+ "source": 184,
+ "target": 158
+ },
+ {
+ "source": 185,
+ "target": 44
+ },
+ {
+ "source": 186,
+ "target": 184
+ },
+ {
+ "source": 187,
+ "target": 135
+ },
+ {
+ "source": 188,
+ "target": 13
+ },
+ {
+ "source": 189,
+ "target": 73
+ },
+ {
+ "source": 190,
+ "target": 41
+ },
+ {
+ "source": 191,
+ "target": 13
+ },
+ {
+ "source": 192,
+ "target": 132
+ },
+ {
+ "source": 193,
+ "target": 156
+ },
+ {
+ "source": 194,
+ "target": 146
+ },
+ {
+ "source": 195,
+ "target": 16
+ },
+ {
+ "source": 196,
+ "target": 1
+ },
+ {
+ "source": 197,
+ "target": 55
+ },
+ {
+ "source": 198,
+ "target": 143
+ },
+ {
+ "source": 199,
+ "target": 128
+ },
+ {
+ "source": 200,
+ "target": 176
+ },
+ {
+ "source": 201,
+ "target": 74
+ },
+ {
+ "source": 202,
+ "target": 174
+ },
+ {
+ "source": 203,
+ "target": 86
+ },
+ {
+ "source": 204,
+ "target": 181
+ },
+ {
+ "source": 205,
+ "target": 152
+ },
+ {
+ "source": 206,
+ "target": 88
+ },
+ {
+ "source": 207,
+ "target": 52
+ },
+ {
+ "source": 208,
+ "target": 195
+ },
+ {
+ "source": 209,
+ "target": 175
+ },
+ {
+ "source": 210,
+ "target": 49
+ },
+ {
+ "source": 211,
+ "target": 176
+ },
+ {
+ "source": 212,
+ "target": 11
+ },
+ {
+ "source": 213,
+ "target": 204
+ },
+ {
+ "source": 214,
+ "target": 40
+ },
+ {
+ "source": 215,
+ "target": 70
+ },
+ {
+ "source": 216,
+ "target": 213
+ },
+ {
+ "source": 217,
+ "target": 49
+ },
+ {
+ "source": 218,
+ "target": 67
+ },
+ {
+ "source": 219,
+ "target": 203
+ },
+ {
+ "source": 220,
+ "target": 35
+ },
+ {
+ "source": 221,
+ "target": 172
+ },
+ {
+ "source": 222,
+ "target": 51
+ },
+ {
+ "source": 223,
+ "target": 44
+ },
+ {
+ "source": 224,
+ "target": 35
+ },
+ {
+ "source": 225,
+ "target": 184
+ },
+ {
+ "source": 226,
+ "target": 101
+ },
+ {
+ "source": 227,
+ "target": 88
+ },
+ {
+ "source": 228,
+ "target": 200
+ },
+ {
+ "source": 229,
+ "target": 59
+ },
+ {
+ "source": 230,
+ "target": 138
+ },
+ {
+ "source": 231,
+ "target": 101
+ },
+ {
+ "source": 232,
+ "target": 30
+ },
+ {
+ "source": 233,
+ "target": 3
+ },
+ {
+ "source": 234,
+ "target": 140
+ },
+ {
+ "source": 235,
+ "target": 177
+ },
+ {
+ "source": 236,
+ "target": 168
+ },
+ {
+ "source": 237,
+ "target": 126
+ },
+ {
+ "source": 238,
+ "target": 131
+ },
+ {
+ "source": 239,
+ "target": 237
+ },
+ {
+ "source": 240,
+ "target": 219
+ },
+ {
+ "source": 241,
+ "target": 121
+ },
+ {
+ "source": 242,
+ "target": 158
+ },
+ {
+ "source": 243,
+ "target": 92
+ },
+ {
+ "source": 244,
+ "target": 111
+ },
+ {
+ "source": 245,
+ "target": 188
+ },
+ {
+ "source": 246,
+ "target": 1
+ },
+ {
+ "source": 247,
+ "target": 158
+ },
+ {
+ "source": 248,
+ "target": 239
+ },
+ {
+ "source": 249,
+ "target": 194
+ },
+ {
+ "source": 250,
+ "target": 82
+ },
+ {
+ "source": 251,
+ "target": 175
+ },
+ {
+ "source": 252,
+ "target": 219
+ },
+ {
+ "source": 253,
+ "target": 80
+ },
+ {
+ "source": 254,
+ "target": 18
+ },
+ {
+ "source": 255,
+ "target": 73
+ },
+ {
+ "source": 256,
+ "target": 169
+ },
+ {
+ "source": 257,
+ "target": 54
+ },
+ {
+ "source": 258,
+ "target": 200
+ },
+ {
+ "source": 259,
+ "target": 107
+ },
+ {
+ "source": 260,
+ "target": 252
+ },
+ {
+ "source": 261,
+ "target": 204
+ },
+ {
+ "source": 262,
+ "target": 95
+ },
+ {
+ "source": 263,
+ "target": 235
+ },
+ {
+ "source": 264,
+ "target": 127
+ },
+ {
+ "source": 265,
+ "target": 141
+ },
+ {
+ "source": 266,
+ "target": 217
+ },
+ {
+ "source": 267,
+ "target": 93
+ },
+ {
+ "source": 268,
+ "target": 125
+ },
+ {
+ "source": 269,
+ "target": 249
+ },
+ {
+ "source": 270,
+ "target": 247
+ },
+ {
+ "source": 271,
+ "target": 256
+ },
+ {
+ "source": 272,
+ "target": 268
+ },
+ {
+ "source": 273,
+ "target": 69
+ },
+ {
+ "source": 274,
+ "target": 93
+ },
+ {
+ "source": 275,
+ "target": 244
+ },
+ {
+ "source": 276,
+ "target": 62
+ },
+ {
+ "source": 277,
+ "target": 193
+ },
+ {
+ "source": 278,
+ "target": 265
+ },
+ {
+ "source": 279,
+ "target": 116
+ },
+ {
+ "source": 280,
+ "target": 101
+ },
+ {
+ "source": 281,
+ "target": 168
+ },
+ {
+ "source": 282,
+ "target": 267
+ },
+ {
+ "source": 283,
+ "target": 7
+ },
+ {
+ "source": 284,
+ "target": 128
+ },
+ {
+ "source": 285,
+ "target": 200
+ },
+ {
+ "source": 286,
+ "target": 5
+ },
+ {
+ "source": 287,
+ "target": 79
+ },
+ {
+ "source": 288,
+ "target": 146
+ },
+ {
+ "source": 289,
+ "target": 77
+ },
+ {
+ "source": 290,
+ "target": 120
+ },
+ {
+ "source": 291,
+ "target": 217
+ },
+ {
+ "source": 292,
+ "target": 24
+ },
+ {
+ "source": 293,
+ "target": 278
+ },
+ {
+ "source": 294,
+ "target": 225
+ },
+ {
+ "source": 295,
+ "target": 159
+ },
+ {
+ "source": 296,
+ "target": 21
+ },
+ {
+ "source": 297,
+ "target": 240
+ },
+ {
+ "source": 298,
+ "target": 139
+ },
+ {
+ "source": 299,
+ "target": 155
+ }
+ ]
+}
diff --git a/app_expo/data/randomdata.js b/app_expo/data/randomdata.js
new file mode 100644
index 0000000..2162485
--- /dev/null
+++ b/app_expo/data/randomdata.js
@@ -0,0 +1,11 @@
+function genRandomTree(N = 300, reverse = false) {
+ return {
+ nodes: [...Array(N).keys()].map((i) => ({ id: i })),
+ links: [...Array(N).keys()]
+ .filter((id) => id)
+ .map((id) => ({
+ [reverse ? 'target' : 'source']: id,
+ [reverse ? 'source' : 'target']: Math.round(Math.random() * (id - 1)),
+ })),
+ }
+}
diff --git a/app_expo/data/randomdata.tsx b/app_expo/data/randomdata.tsx
new file mode 100644
index 0000000..844f36f
--- /dev/null
+++ b/app_expo/data/randomdata.tsx
@@ -0,0 +1,11 @@
+export default function genRandomTree(N = 300, reverse = false) {
+ return {
+ nodes: [...Array(N).keys()].map((i) => ({ id: i })),
+ links: [...Array(N).keys()]
+ .filter((id) => id)
+ .map((id) => ({
+ [reverse ? 'target' : 'source']: id,
+ [reverse ? 'source' : 'target']: Math.round(Math.random() * (id - 1)),
+ })),
+ }
+}
diff --git a/app_expo/data/randorev.json b/app_expo/data/randorev.json
new file mode 100644
index 0000000..cadd5b3
--- /dev/null
+++ b/app_expo/data/randorev.json
@@ -0,0 +1,1810 @@
+{
+ "nodes": [
+ {
+ "id": 0
+ },
+ {
+ "id": 1
+ },
+ {
+ "id": 2
+ },
+ {
+ "id": 3
+ },
+ {
+ "id": 4
+ },
+ {
+ "id": 5
+ },
+ {
+ "id": 6
+ },
+ {
+ "id": 7
+ },
+ {
+ "id": 8
+ },
+ {
+ "id": 9
+ },
+ {
+ "id": 10
+ },
+ {
+ "id": 11
+ },
+ {
+ "id": 12
+ },
+ {
+ "id": 13
+ },
+ {
+ "id": 14
+ },
+ {
+ "id": 15
+ },
+ {
+ "id": 16
+ },
+ {
+ "id": 17
+ },
+ {
+ "id": 18
+ },
+ {
+ "id": 19
+ },
+ {
+ "id": 20
+ },
+ {
+ "id": 21
+ },
+ {
+ "id": 22
+ },
+ {
+ "id": 23
+ },
+ {
+ "id": 24
+ },
+ {
+ "id": 25
+ },
+ {
+ "id": 26
+ },
+ {
+ "id": 27
+ },
+ {
+ "id": 28
+ },
+ {
+ "id": 29
+ },
+ {
+ "id": 30
+ },
+ {
+ "id": 31
+ },
+ {
+ "id": 32
+ },
+ {
+ "id": 33
+ },
+ {
+ "id": 34
+ },
+ {
+ "id": 35
+ },
+ {
+ "id": 36
+ },
+ {
+ "id": 37
+ },
+ {
+ "id": 38
+ },
+ {
+ "id": 39
+ },
+ {
+ "id": 40
+ },
+ {
+ "id": 41
+ },
+ {
+ "id": 42
+ },
+ {
+ "id": 43
+ },
+ {
+ "id": 44
+ },
+ {
+ "id": 45
+ },
+ {
+ "id": 46
+ },
+ {
+ "id": 47
+ },
+ {
+ "id": 48
+ },
+ {
+ "id": 49
+ },
+ {
+ "id": 50
+ },
+ {
+ "id": 51
+ },
+ {
+ "id": 52
+ },
+ {
+ "id": 53
+ },
+ {
+ "id": 54
+ },
+ {
+ "id": 55
+ },
+ {
+ "id": 56
+ },
+ {
+ "id": 57
+ },
+ {
+ "id": 58
+ },
+ {
+ "id": 59
+ },
+ {
+ "id": 60
+ },
+ {
+ "id": 61
+ },
+ {
+ "id": 62
+ },
+ {
+ "id": 63
+ },
+ {
+ "id": 64
+ },
+ {
+ "id": 65
+ },
+ {
+ "id": 66
+ },
+ {
+ "id": 67
+ },
+ {
+ "id": 68
+ },
+ {
+ "id": 69
+ },
+ {
+ "id": 70
+ },
+ {
+ "id": 71
+ },
+ {
+ "id": 72
+ },
+ {
+ "id": 73
+ },
+ {
+ "id": 74
+ },
+ {
+ "id": 75
+ },
+ {
+ "id": 76
+ },
+ {
+ "id": 77
+ },
+ {
+ "id": 78
+ },
+ {
+ "id": 79
+ },
+ {
+ "id": 80
+ },
+ {
+ "id": 81
+ },
+ {
+ "id": 82
+ },
+ {
+ "id": 83
+ },
+ {
+ "id": 84
+ },
+ {
+ "id": 85
+ },
+ {
+ "id": 86
+ },
+ {
+ "id": 87
+ },
+ {
+ "id": 88
+ },
+ {
+ "id": 89
+ },
+ {
+ "id": 90
+ },
+ {
+ "id": 91
+ },
+ {
+ "id": 92
+ },
+ {
+ "id": 93
+ },
+ {
+ "id": 94
+ },
+ {
+ "id": 95
+ },
+ {
+ "id": 96
+ },
+ {
+ "id": 97
+ },
+ {
+ "id": 98
+ },
+ {
+ "id": 99
+ },
+ {
+ "id": 100
+ },
+ {
+ "id": 101
+ },
+ {
+ "id": 102
+ },
+ {
+ "id": 103
+ },
+ {
+ "id": 104
+ },
+ {
+ "id": 105
+ },
+ {
+ "id": 106
+ },
+ {
+ "id": 107
+ },
+ {
+ "id": 108
+ },
+ {
+ "id": 109
+ },
+ {
+ "id": 110
+ },
+ {
+ "id": 111
+ },
+ {
+ "id": 112
+ },
+ {
+ "id": 113
+ },
+ {
+ "id": 114
+ },
+ {
+ "id": 115
+ },
+ {
+ "id": 116
+ },
+ {
+ "id": 117
+ },
+ {
+ "id": 118
+ },
+ {
+ "id": 119
+ },
+ {
+ "id": 120
+ },
+ {
+ "id": 121
+ },
+ {
+ "id": 122
+ },
+ {
+ "id": 123
+ },
+ {
+ "id": 124
+ },
+ {
+ "id": 125
+ },
+ {
+ "id": 126
+ },
+ {
+ "id": 127
+ },
+ {
+ "id": 128
+ },
+ {
+ "id": 129
+ },
+ {
+ "id": 130
+ },
+ {
+ "id": 131
+ },
+ {
+ "id": 132
+ },
+ {
+ "id": 133
+ },
+ {
+ "id": 134
+ },
+ {
+ "id": 135
+ },
+ {
+ "id": 136
+ },
+ {
+ "id": 137
+ },
+ {
+ "id": 138
+ },
+ {
+ "id": 139
+ },
+ {
+ "id": 140
+ },
+ {
+ "id": 141
+ },
+ {
+ "id": 142
+ },
+ {
+ "id": 143
+ },
+ {
+ "id": 144
+ },
+ {
+ "id": 145
+ },
+ {
+ "id": 146
+ },
+ {
+ "id": 147
+ },
+ {
+ "id": 148
+ },
+ {
+ "id": 149
+ },
+ {
+ "id": 150
+ },
+ {
+ "id": 151
+ },
+ {
+ "id": 152
+ },
+ {
+ "id": 153
+ },
+ {
+ "id": 154
+ },
+ {
+ "id": 155
+ },
+ {
+ "id": 156
+ },
+ {
+ "id": 157
+ },
+ {
+ "id": 158
+ },
+ {
+ "id": 159
+ },
+ {
+ "id": 160
+ },
+ {
+ "id": 161
+ },
+ {
+ "id": 162
+ },
+ {
+ "id": 163
+ },
+ {
+ "id": 164
+ },
+ {
+ "id": 165
+ },
+ {
+ "id": 166
+ },
+ {
+ "id": 167
+ },
+ {
+ "id": 168
+ },
+ {
+ "id": 169
+ },
+ {
+ "id": 170
+ },
+ {
+ "id": 171
+ },
+ {
+ "id": 172
+ },
+ {
+ "id": 173
+ },
+ {
+ "id": 174
+ },
+ {
+ "id": 175
+ },
+ {
+ "id": 176
+ },
+ {
+ "id": 177
+ },
+ {
+ "id": 178
+ },
+ {
+ "id": 179
+ },
+ {
+ "id": 180
+ },
+ {
+ "id": 181
+ },
+ {
+ "id": 182
+ },
+ {
+ "id": 183
+ },
+ {
+ "id": 184
+ },
+ {
+ "id": 185
+ },
+ {
+ "id": 186
+ },
+ {
+ "id": 187
+ },
+ {
+ "id": 188
+ },
+ {
+ "id": 189
+ },
+ {
+ "id": 190
+ },
+ {
+ "id": 191
+ },
+ {
+ "id": 192
+ },
+ {
+ "id": 193
+ },
+ {
+ "id": 194
+ },
+ {
+ "id": 195
+ },
+ {
+ "id": 196
+ },
+ {
+ "id": 197
+ },
+ {
+ "id": 198
+ },
+ {
+ "id": 199
+ },
+ {
+ "id": 200
+ },
+ {
+ "id": 201
+ },
+ {
+ "id": 202
+ },
+ {
+ "id": 203
+ },
+ {
+ "id": 204
+ },
+ {
+ "id": 205
+ },
+ {
+ "id": 206
+ },
+ {
+ "id": 207
+ },
+ {
+ "id": 208
+ },
+ {
+ "id": 209
+ },
+ {
+ "id": 210
+ },
+ {
+ "id": 211
+ },
+ {
+ "id": 212
+ },
+ {
+ "id": 213
+ },
+ {
+ "id": 214
+ },
+ {
+ "id": 215
+ },
+ {
+ "id": 216
+ },
+ {
+ "id": 217
+ },
+ {
+ "id": 218
+ },
+ {
+ "id": 219
+ },
+ {
+ "id": 220
+ },
+ {
+ "id": 221
+ },
+ {
+ "id": 222
+ },
+ {
+ "id": 223
+ },
+ {
+ "id": 224
+ },
+ {
+ "id": 225
+ },
+ {
+ "id": 226
+ },
+ {
+ "id": 227
+ },
+ {
+ "id": 228
+ },
+ {
+ "id": 229
+ },
+ {
+ "id": 230
+ },
+ {
+ "id": 231
+ },
+ {
+ "id": 232
+ },
+ {
+ "id": 233
+ },
+ {
+ "id": 234
+ },
+ {
+ "id": 235
+ },
+ {
+ "id": 236
+ },
+ {
+ "id": 237
+ },
+ {
+ "id": 238
+ },
+ {
+ "id": 239
+ },
+ {
+ "id": 240
+ },
+ {
+ "id": 241
+ },
+ {
+ "id": 242
+ },
+ {
+ "id": 243
+ },
+ {
+ "id": 244
+ },
+ {
+ "id": 245
+ },
+ {
+ "id": 246
+ },
+ {
+ "id": 247
+ },
+ {
+ "id": 248
+ },
+ {
+ "id": 249
+ },
+ {
+ "id": 250
+ },
+ {
+ "id": 251
+ },
+ {
+ "id": 252
+ },
+ {
+ "id": 253
+ },
+ {
+ "id": 254
+ },
+ {
+ "id": 255
+ },
+ {
+ "id": 256
+ },
+ {
+ "id": 257
+ },
+ {
+ "id": 258
+ },
+ {
+ "id": 259
+ },
+ {
+ "id": 260
+ },
+ {
+ "id": 261
+ },
+ {
+ "id": 262
+ },
+ {
+ "id": 263
+ },
+ {
+ "id": 264
+ },
+ {
+ "id": 265
+ },
+ {
+ "id": 266
+ },
+ {
+ "id": 267
+ },
+ {
+ "id": 268
+ },
+ {
+ "id": 269
+ },
+ {
+ "id": 270
+ },
+ {
+ "id": 271
+ },
+ {
+ "id": 272
+ },
+ {
+ "id": 273
+ },
+ {
+ "id": 274
+ },
+ {
+ "id": 275
+ },
+ {
+ "id": 276
+ },
+ {
+ "id": 277
+ },
+ {
+ "id": 278
+ },
+ {
+ "id": 279
+ },
+ {
+ "id": 280
+ },
+ {
+ "id": 281
+ },
+ {
+ "id": 282
+ },
+ {
+ "id": 283
+ },
+ {
+ "id": 284
+ },
+ {
+ "id": 285
+ },
+ {
+ "id": 286
+ },
+ {
+ "id": 287
+ },
+ {
+ "id": 288
+ },
+ {
+ "id": 289
+ },
+ {
+ "id": 290
+ },
+ {
+ "id": 291
+ },
+ {
+ "id": 292
+ },
+ {
+ "id": 293
+ },
+ {
+ "id": 294
+ },
+ {
+ "id": 295
+ },
+ {
+ "id": 296
+ },
+ {
+ "id": 297
+ },
+ {
+ "id": 298
+ },
+ {
+ "id": 299
+ },
+ {
+ "id": 300
+ },
+ {
+ "id": 301
+ },
+ {
+ "id": 302
+ },
+ {
+ "id": 303
+ },
+ {
+ "id": 304
+ },
+ {
+ "id": 305
+ },
+ {
+ "id": 306
+ },
+ {
+ "id": 307
+ },
+ {
+ "id": 308
+ },
+ {
+ "id": 309
+ },
+ {
+ "id": 310
+ },
+ {
+ "id": 311
+ },
+ {
+ "id": 312
+ },
+ {
+ "id": 313
+ },
+ {
+ "id": 314
+ },
+ {
+ "id": 315
+ },
+ {
+ "id": 316
+ },
+ {
+ "id": 317
+ },
+ {
+ "id": 318
+ },
+ {
+ "id": 319
+ },
+ {
+ "id": 320
+ },
+ {
+ "id": 321
+ },
+ {
+ "id": 322
+ },
+ {
+ "id": 323
+ },
+ {
+ "id": 324
+ },
+ {
+ "id": 325
+ },
+ {
+ "id": 326
+ },
+ {
+ "id": 327
+ },
+ {
+ "id": 328
+ },
+ {
+ "id": 329
+ },
+ {
+ "id": 330
+ },
+ {
+ "id": 331
+ },
+ {
+ "id": 332
+ },
+ {
+ "id": 333
+ },
+ {
+ "id": 334
+ },
+ {
+ "id": 335
+ },
+ {
+ "id": 336
+ },
+ {
+ "id": 337
+ },
+ {
+ "id": 338
+ },
+ {
+ "id": 339
+ },
+ {
+ "id": 340
+ },
+ {
+ "id": 341
+ },
+ {
+ "id": 342
+ },
+ {
+ "id": 343
+ },
+ {
+ "id": 344
+ },
+ {
+ "id": 345
+ },
+ {
+ "id": 346
+ },
+ {
+ "id": 347
+ },
+ {
+ "id": 348
+ },
+ {
+ "id": 349
+ },
+ {
+ "id": 350
+ },
+ {
+ "id": 351
+ },
+ {
+ "id": 352
+ },
+ {
+ "id": 353
+ },
+ {
+ "id": 354
+ },
+ {
+ "id": 355
+ },
+ {
+ "id": 356
+ },
+ {
+ "id": 357
+ },
+ {
+ "id": 358
+ },
+ {
+ "id": 359
+ },
+ {
+ "id": 360
+ },
+ {
+ "id": 361
+ },
+ {
+ "id": 362
+ },
+ {
+ "id": 363
+ },
+ {
+ "id": 364
+ },
+ {
+ "id": 365
+ },
+ {
+ "id": 366
+ },
+ {
+ "id": 367
+ },
+ {
+ "id": 368
+ },
+ {
+ "id": 369
+ },
+ {
+ "id": 370
+ },
+ {
+ "id": 371
+ },
+ {
+ "id": 372
+ },
+ {
+ "id": 373
+ },
+ {
+ "id": 374
+ },
+ {
+ "id": 375
+ },
+ {
+ "id": 376
+ },
+ {
+ "id": 377
+ },
+ {
+ "id": 378
+ },
+ {
+ "id": 379
+ },
+ {
+ "id": 380
+ },
+ {
+ "id": 381
+ },
+ {
+ "id": 382
+ },
+ {
+ "id": 383
+ },
+ {
+ "id": 384
+ },
+ {
+ "id": 385
+ },
+ {
+ "id": 386
+ },
+ {
+ "id": 387
+ },
+ {
+ "id": 388
+ },
+ {
+ "id": 389
+ },
+ {
+ "id": 390
+ },
+ {
+ "id": 391
+ },
+ {
+ "id": 392
+ },
+ {
+ "id": 393
+ },
+ {
+ "id": 394
+ },
+ {
+ "id": 395
+ },
+ {
+ "id": 396
+ },
+ {
+ "id": 397
+ },
+ {
+ "id": 398
+ },
+ {
+ "id": 399
+ },
+ {
+ "id": 400
+ },
+ {
+ "id": 401
+ },
+ {
+ "id": 402
+ },
+ {
+ "id": 403
+ },
+ {
+ "id": 404
+ },
+ {
+ "id": 405
+ },
+ {
+ "id": 406
+ },
+ {
+ "id": 407
+ },
+ {
+ "id": 408
+ },
+ {
+ "id": 409
+ },
+ {
+ "id": 410
+ },
+ {
+ "id": 411
+ },
+ {
+ "id": 412
+ },
+ {
+ "id": 413
+ },
+ {
+ "id": 414
+ },
+ {
+ "id": 415
+ },
+ {
+ "id": 416
+ },
+ {
+ "id": 417
+ },
+ {
+ "id": 418
+ },
+ {
+ "id": 419
+ },
+ {
+ "id": 420
+ },
+ {
+ "id": 421
+ },
+ {
+ "id": 422
+ },
+ {
+ "id": 423
+ },
+ {
+ "id": 424
+ },
+ {
+ "id": 425
+ },
+ {
+ "id": 426
+ },
+ {
+ "id": 427
+ },
+ {
+ "id": 428
+ },
+ {
+ "id": 429
+ },
+ {
+ "id": 430
+ },
+ {
+ "id": 431
+ },
+ {
+ "id": 432
+ },
+ {
+ "id": 433
+ },
+ {
+ "id": 434
+ },
+ {
+ "id": 435
+ },
+ {
+ "id": 436
+ },
+ {
+ "id": 437
+ },
+ {
+ "id": 438
+ },
+ {
+ "id": 439
+ },
+ {
+ "id": 440
+ },
+ {
+ "id": 441
+ },
+ {
+ "id": 442
+ },
+ {
+ "id": 443
+ },
+ {
+ "id": 444
+ },
+ {
+ "id": 445
+ },
+ {
+ "id": 446
+ },
+ {
+ "id": 447
+ },
+ {
+ "id": 448
+ },
+ {
+ "id": 449
+ },
+ {
+ "id": 450
+ },
+ {
+ "id": 451
+ },
+ {
+ "id": 452
+ },
+ {
+ "id": 453
+ },
+ {
+ "id": 454
+ },
+ {
+ "id": 455
+ },
+ {
+ "id": 456
+ },
+ {
+ "id": 457
+ },
+ {
+ "id": 458
+ },
+ {
+ "id": 459
+ },
+ {
+ "id": 460
+ },
+ {
+ "id": 461
+ },
+ {
+ "id": 462
+ },
+ {
+ "id": 463
+ },
+ {
+ "id": 464
+ },
+ {
+ "id": 465
+ },
+ {
+ "id": 466
+ },
+ {
+ "id": 467
+ },
+ {
+ "id": 468
+ },
+ {
+ "id": 469
+ },
+ {
+ "id": 470
+ },
+ {
+ "id": 471
+ },
+ {
+ "id": 472
+ },
+ {
+ "id": 473
+ },
+ {
+ "id": 474
+ },
+ {
+ "id": 475
+ },
+ {
+ "id": 476
+ },
+ {
+ "id": 477
+ },
+ {
+ "id": 478
+ },
+ {
+ "id": 479
+ },
+ {
+ "id": 480
+ },
+ {
+ "id": 481
+ },
+ {
+ "id": 482
+ },
+ {
+ "id": 483
+ },
+ {
+ "id": 484
+ },
+ {
+ "id": 485
+ },
+ {
+ "id": 486
+ },
+ {
+ "id": 487
+ },
+ {
+ "id": 488
+ },
+ {
+ "id": 489
+ },
+ {
+ "id": 490
+ },
+ {
+ "id": 491
+ },
+ {
+ "id": 492
+ },
+ {
+ "id": 493
+ },
+ {
+ "id": 494
+ },
+ {
+ "id": 495
+ },
+ {
+ "id": 496
+ },
+ {
+ "id": 497
+ },
+ {
+ "id": 498
+ },
+ {
+ "id": 499
+ },
+ {
+ "id": 500
+ },
+ {
+ "id": 501
+ },
+ {
+ "id": 502
+ },
+ {
+ "id": 503
+ },
+ {
+ "id": 504
+ },
+ {
+ "id": 505
+ },
+ {
+ "id": 506
+ },
+ {
+ "id": 507
+ },
+ {
+ "id": 508
+ },
+ {
+ "id": 509
+ },
+ {
+ "id": 510
+ },
+ {
+ "id": 511
+ },
+ {
+ "id": 512
+ },
+ {
+ "id": 513
+ },
+ {
+ "id": 514
+ },
+ {
+ "id": 515
+ },
+ {
+ "id": 516
+ },
+ {
+ "id": 517
+ },
+ {
+ "id": 518
+ },
+ {
+ "id": 519
+ },
+ {
+ "id": 520
+ },
+ {
+ "id": 521
+ },
+ {
+ "id": 522
+ },
+ {
+ "id": 523
+ },
+ {
+ "id": 524
+ },
+ {
+ "id": 525
+ },
+ {
+ "id": 526
+ },
+ {
+ "id": 527
+ },
+ {
+ "id": 528
+ },
+ {
+ "id": 529
+ },
+ {
+ "id": 530
+ },
+ {
+ "id": 531
+ },
+ {
+ "id": 532
+ },
+ {
+ "id": 533
+ },
+ {
+ "id": 534
+ },
+ {
+ "id": 535
+ },
+ {
+ "id": 536
+ },
+ {
+ "id": 537
+ },
+ {
+ "id": 538
+ },
+ {
+ "id": 539
+ },
+ {
+ "id": 540
+ },
+ {
+ "id": 541
+ },
+ {
+ "id": 542
+ },
+ {
+ "id": 543
+ },
+ {
+ "id": 544
+ },
+ {
+ "id": 545
+ },
+ {
+ "id": 546
+ },
+ {
+ "id": 547
+ },
+ {
+ "id": 548
+ },
+ {
+ "id": 549
+ },
+ {
+ "id": 550
+ },
+ {
+ "id": 551
+ },
+ {
+ "id": 552
+ },
+ {
+ "id": 553
+ },
+ {
+ "id": 554
+ },
+ {
+ "id": 555
+ },
+ {
+ "id": 556
+ },
+ {
+ "id": 557
+ },
+ {
+ "id": 558
+ },
+ {
+ "id": 559
+ },
+ {
+ "id": 560
+ },
+ {
+ "id": 561
+ },
+ {
+ "id": 562
+ },
+ {
+ "id": 563
+ },
+ {
+ "id": 564
+ },
+ {
+ "id": 565
+ },
+ {
+ "id": 566
+ },
+ {
+ "id": 567
+ },
+ {
+ "id": 568
+ },
+ {
+ "id": 569
+ },
+ {
+ "id": 570
+ },
+ {
+ "id": 571
+ },
+ {
+ "id": 572
+ },
+ {
+ "id": 573
+ },
+ {
+ "id": 574
+ },
+ {
+ "id": 575
+ },
+ {
+ "id": 576
+ },
+ {
+ "id": 577
+ },
+ {
+ "id": 578
+ },
+ {
+ "id": 579
+ },
+ {
+ "id": 580
+ },
+ {
+ "id": 581
+ },
+ {
+ "id": 582
+ },
+ {
+ "id": 583
+ },
+ {
+ "id": 584
+ },
+ {
+ "id": 585
+ },
+ {
+ "id": 586
+ },
+ {
+ "id": 587
+ },
+ {
+ "id": 588
+ },
+ {
+ "id": 589
+ },
+ {
+ "id": 590
+ },
+ {
+ "id": 591
+ },
+ {
+ "id": 592
+ },
+ {
+ "id": 593
+ },
+ {
+ "id": 594
+ },
+ {
+ "id": 595
+ },
+ {
+ "id": 596
+ },
+ {
+ "id": 597
+ },
+ {
+ "id": 598
+ },
+ {
+ "id": 599
+ }
+ ],
+ "links": [
+ {
+ "target": 1,
+ "source": 0
+ }
+ ]
+}
diff --git a/app_expo/data/randorevog.json b/app_expo/data/randorevog.json
new file mode 100644
index 0000000..5bbad83
--- /dev/null
+++ b/app_expo/data/randorevog.json
@@ -0,0 +1,4202 @@
+{
+ "nodes": [
+ {
+ "id": 0
+ },
+ {
+ "id": 1
+ },
+ {
+ "id": 2
+ },
+ {
+ "id": 3
+ },
+ {
+ "id": 4
+ },
+ {
+ "id": 5
+ },
+ {
+ "id": 6
+ },
+ {
+ "id": 7
+ },
+ {
+ "id": 8
+ },
+ {
+ "id": 9
+ },
+ {
+ "id": 10
+ },
+ {
+ "id": 11
+ },
+ {
+ "id": 12
+ },
+ {
+ "id": 13
+ },
+ {
+ "id": 14
+ },
+ {
+ "id": 15
+ },
+ {
+ "id": 16
+ },
+ {
+ "id": 17
+ },
+ {
+ "id": 18
+ },
+ {
+ "id": 19
+ },
+ {
+ "id": 20
+ },
+ {
+ "id": 21
+ },
+ {
+ "id": 22
+ },
+ {
+ "id": 23
+ },
+ {
+ "id": 24
+ },
+ {
+ "id": 25
+ },
+ {
+ "id": 26
+ },
+ {
+ "id": 27
+ },
+ {
+ "id": 28
+ },
+ {
+ "id": 29
+ },
+ {
+ "id": 30
+ },
+ {
+ "id": 31
+ },
+ {
+ "id": 32
+ },
+ {
+ "id": 33
+ },
+ {
+ "id": 34
+ },
+ {
+ "id": 35
+ },
+ {
+ "id": 36
+ },
+ {
+ "id": 37
+ },
+ {
+ "id": 38
+ },
+ {
+ "id": 39
+ },
+ {
+ "id": 40
+ },
+ {
+ "id": 41
+ },
+ {
+ "id": 42
+ },
+ {
+ "id": 43
+ },
+ {
+ "id": 44
+ },
+ {
+ "id": 45
+ },
+ {
+ "id": 46
+ },
+ {
+ "id": 47
+ },
+ {
+ "id": 48
+ },
+ {
+ "id": 49
+ },
+ {
+ "id": 50
+ },
+ {
+ "id": 51
+ },
+ {
+ "id": 52
+ },
+ {
+ "id": 53
+ },
+ {
+ "id": 54
+ },
+ {
+ "id": 55
+ },
+ {
+ "id": 56
+ },
+ {
+ "id": 57
+ },
+ {
+ "id": 58
+ },
+ {
+ "id": 59
+ },
+ {
+ "id": 60
+ },
+ {
+ "id": 61
+ },
+ {
+ "id": 62
+ },
+ {
+ "id": 63
+ },
+ {
+ "id": 64
+ },
+ {
+ "id": 65
+ },
+ {
+ "id": 66
+ },
+ {
+ "id": 67
+ },
+ {
+ "id": 68
+ },
+ {
+ "id": 69
+ },
+ {
+ "id": 70
+ },
+ {
+ "id": 71
+ },
+ {
+ "id": 72
+ },
+ {
+ "id": 73
+ },
+ {
+ "id": 74
+ },
+ {
+ "id": 75
+ },
+ {
+ "id": 76
+ },
+ {
+ "id": 77
+ },
+ {
+ "id": 78
+ },
+ {
+ "id": 79
+ },
+ {
+ "id": 80
+ },
+ {
+ "id": 81
+ },
+ {
+ "id": 82
+ },
+ {
+ "id": 83
+ },
+ {
+ "id": 84
+ },
+ {
+ "id": 85
+ },
+ {
+ "id": 86
+ },
+ {
+ "id": 87
+ },
+ {
+ "id": 88
+ },
+ {
+ "id": 89
+ },
+ {
+ "id": 90
+ },
+ {
+ "id": 91
+ },
+ {
+ "id": 92
+ },
+ {
+ "id": 93
+ },
+ {
+ "id": 94
+ },
+ {
+ "id": 95
+ },
+ {
+ "id": 96
+ },
+ {
+ "id": 97
+ },
+ {
+ "id": 98
+ },
+ {
+ "id": 99
+ },
+ {
+ "id": 100
+ },
+ {
+ "id": 101
+ },
+ {
+ "id": 102
+ },
+ {
+ "id": 103
+ },
+ {
+ "id": 104
+ },
+ {
+ "id": 105
+ },
+ {
+ "id": 106
+ },
+ {
+ "id": 107
+ },
+ {
+ "id": 108
+ },
+ {
+ "id": 109
+ },
+ {
+ "id": 110
+ },
+ {
+ "id": 111
+ },
+ {
+ "id": 112
+ },
+ {
+ "id": 113
+ },
+ {
+ "id": 114
+ },
+ {
+ "id": 115
+ },
+ {
+ "id": 116
+ },
+ {
+ "id": 117
+ },
+ {
+ "id": 118
+ },
+ {
+ "id": 119
+ },
+ {
+ "id": 120
+ },
+ {
+ "id": 121
+ },
+ {
+ "id": 122
+ },
+ {
+ "id": 123
+ },
+ {
+ "id": 124
+ },
+ {
+ "id": 125
+ },
+ {
+ "id": 126
+ },
+ {
+ "id": 127
+ },
+ {
+ "id": 128
+ },
+ {
+ "id": 129
+ },
+ {
+ "id": 130
+ },
+ {
+ "id": 131
+ },
+ {
+ "id": 132
+ },
+ {
+ "id": 133
+ },
+ {
+ "id": 134
+ },
+ {
+ "id": 135
+ },
+ {
+ "id": 136
+ },
+ {
+ "id": 137
+ },
+ {
+ "id": 138
+ },
+ {
+ "id": 139
+ },
+ {
+ "id": 140
+ },
+ {
+ "id": 141
+ },
+ {
+ "id": 142
+ },
+ {
+ "id": 143
+ },
+ {
+ "id": 144
+ },
+ {
+ "id": 145
+ },
+ {
+ "id": 146
+ },
+ {
+ "id": 147
+ },
+ {
+ "id": 148
+ },
+ {
+ "id": 149
+ },
+ {
+ "id": 150
+ },
+ {
+ "id": 151
+ },
+ {
+ "id": 152
+ },
+ {
+ "id": 153
+ },
+ {
+ "id": 154
+ },
+ {
+ "id": 155
+ },
+ {
+ "id": 156
+ },
+ {
+ "id": 157
+ },
+ {
+ "id": 158
+ },
+ {
+ "id": 159
+ },
+ {
+ "id": 160
+ },
+ {
+ "id": 161
+ },
+ {
+ "id": 162
+ },
+ {
+ "id": 163
+ },
+ {
+ "id": 164
+ },
+ {
+ "id": 165
+ },
+ {
+ "id": 166
+ },
+ {
+ "id": 167
+ },
+ {
+ "id": 168
+ },
+ {
+ "id": 169
+ },
+ {
+ "id": 170
+ },
+ {
+ "id": 171
+ },
+ {
+ "id": 172
+ },
+ {
+ "id": 173
+ },
+ {
+ "id": 174
+ },
+ {
+ "id": 175
+ },
+ {
+ "id": 176
+ },
+ {
+ "id": 177
+ },
+ {
+ "id": 178
+ },
+ {
+ "id": 179
+ },
+ {
+ "id": 180
+ },
+ {
+ "id": 181
+ },
+ {
+ "id": 182
+ },
+ {
+ "id": 183
+ },
+ {
+ "id": 184
+ },
+ {
+ "id": 185
+ },
+ {
+ "id": 186
+ },
+ {
+ "id": 187
+ },
+ {
+ "id": 188
+ },
+ {
+ "id": 189
+ },
+ {
+ "id": 190
+ },
+ {
+ "id": 191
+ },
+ {
+ "id": 192
+ },
+ {
+ "id": 193
+ },
+ {
+ "id": 194
+ },
+ {
+ "id": 195
+ },
+ {
+ "id": 196
+ },
+ {
+ "id": 197
+ },
+ {
+ "id": 198
+ },
+ {
+ "id": 199
+ },
+ {
+ "id": 200
+ },
+ {
+ "id": 201
+ },
+ {
+ "id": 202
+ },
+ {
+ "id": 203
+ },
+ {
+ "id": 204
+ },
+ {
+ "id": 205
+ },
+ {
+ "id": 206
+ },
+ {
+ "id": 207
+ },
+ {
+ "id": 208
+ },
+ {
+ "id": 209
+ },
+ {
+ "id": 210
+ },
+ {
+ "id": 211
+ },
+ {
+ "id": 212
+ },
+ {
+ "id": 213
+ },
+ {
+ "id": 214
+ },
+ {
+ "id": 215
+ },
+ {
+ "id": 216
+ },
+ {
+ "id": 217
+ },
+ {
+ "id": 218
+ },
+ {
+ "id": 219
+ },
+ {
+ "id": 220
+ },
+ {
+ "id": 221
+ },
+ {
+ "id": 222
+ },
+ {
+ "id": 223
+ },
+ {
+ "id": 224
+ },
+ {
+ "id": 225
+ },
+ {
+ "id": 226
+ },
+ {
+ "id": 227
+ },
+ {
+ "id": 228
+ },
+ {
+ "id": 229
+ },
+ {
+ "id": 230
+ },
+ {
+ "id": 231
+ },
+ {
+ "id": 232
+ },
+ {
+ "id": 233
+ },
+ {
+ "id": 234
+ },
+ {
+ "id": 235
+ },
+ {
+ "id": 236
+ },
+ {
+ "id": 237
+ },
+ {
+ "id": 238
+ },
+ {
+ "id": 239
+ },
+ {
+ "id": 240
+ },
+ {
+ "id": 241
+ },
+ {
+ "id": 242
+ },
+ {
+ "id": 243
+ },
+ {
+ "id": 244
+ },
+ {
+ "id": 245
+ },
+ {
+ "id": 246
+ },
+ {
+ "id": 247
+ },
+ {
+ "id": 248
+ },
+ {
+ "id": 249
+ },
+ {
+ "id": 250
+ },
+ {
+ "id": 251
+ },
+ {
+ "id": 252
+ },
+ {
+ "id": 253
+ },
+ {
+ "id": 254
+ },
+ {
+ "id": 255
+ },
+ {
+ "id": 256
+ },
+ {
+ "id": 257
+ },
+ {
+ "id": 258
+ },
+ {
+ "id": 259
+ },
+ {
+ "id": 260
+ },
+ {
+ "id": 261
+ },
+ {
+ "id": 262
+ },
+ {
+ "id": 263
+ },
+ {
+ "id": 264
+ },
+ {
+ "id": 265
+ },
+ {
+ "id": 266
+ },
+ {
+ "id": 267
+ },
+ {
+ "id": 268
+ },
+ {
+ "id": 269
+ },
+ {
+ "id": 270
+ },
+ {
+ "id": 271
+ },
+ {
+ "id": 272
+ },
+ {
+ "id": 273
+ },
+ {
+ "id": 274
+ },
+ {
+ "id": 275
+ },
+ {
+ "id": 276
+ },
+ {
+ "id": 277
+ },
+ {
+ "id": 278
+ },
+ {
+ "id": 279
+ },
+ {
+ "id": 280
+ },
+ {
+ "id": 281
+ },
+ {
+ "id": 282
+ },
+ {
+ "id": 283
+ },
+ {
+ "id": 284
+ },
+ {
+ "id": 285
+ },
+ {
+ "id": 286
+ },
+ {
+ "id": 287
+ },
+ {
+ "id": 288
+ },
+ {
+ "id": 289
+ },
+ {
+ "id": 290
+ },
+ {
+ "id": 291
+ },
+ {
+ "id": 292
+ },
+ {
+ "id": 293
+ },
+ {
+ "id": 294
+ },
+ {
+ "id": 295
+ },
+ {
+ "id": 296
+ },
+ {
+ "id": 297
+ },
+ {
+ "id": 298
+ },
+ {
+ "id": 299
+ },
+ {
+ "id": 300
+ },
+ {
+ "id": 301
+ },
+ {
+ "id": 302
+ },
+ {
+ "id": 303
+ },
+ {
+ "id": 304
+ },
+ {
+ "id": 305
+ },
+ {
+ "id": 306
+ },
+ {
+ "id": 307
+ },
+ {
+ "id": 308
+ },
+ {
+ "id": 309
+ },
+ {
+ "id": 310
+ },
+ {
+ "id": 311
+ },
+ {
+ "id": 312
+ },
+ {
+ "id": 313
+ },
+ {
+ "id": 314
+ },
+ {
+ "id": 315
+ },
+ {
+ "id": 316
+ },
+ {
+ "id": 317
+ },
+ {
+ "id": 318
+ },
+ {
+ "id": 319
+ },
+ {
+ "id": 320
+ },
+ {
+ "id": 321
+ },
+ {
+ "id": 322
+ },
+ {
+ "id": 323
+ },
+ {
+ "id": 324
+ },
+ {
+ "id": 325
+ },
+ {
+ "id": 326
+ },
+ {
+ "id": 327
+ },
+ {
+ "id": 328
+ },
+ {
+ "id": 329
+ },
+ {
+ "id": 330
+ },
+ {
+ "id": 331
+ },
+ {
+ "id": 332
+ },
+ {
+ "id": 333
+ },
+ {
+ "id": 334
+ },
+ {
+ "id": 335
+ },
+ {
+ "id": 336
+ },
+ {
+ "id": 337
+ },
+ {
+ "id": 338
+ },
+ {
+ "id": 339
+ },
+ {
+ "id": 340
+ },
+ {
+ "id": 341
+ },
+ {
+ "id": 342
+ },
+ {
+ "id": 343
+ },
+ {
+ "id": 344
+ },
+ {
+ "id": 345
+ },
+ {
+ "id": 346
+ },
+ {
+ "id": 347
+ },
+ {
+ "id": 348
+ },
+ {
+ "id": 349
+ },
+ {
+ "id": 350
+ },
+ {
+ "id": 351
+ },
+ {
+ "id": 352
+ },
+ {
+ "id": 353
+ },
+ {
+ "id": 354
+ },
+ {
+ "id": 355
+ },
+ {
+ "id": 356
+ },
+ {
+ "id": 357
+ },
+ {
+ "id": 358
+ },
+ {
+ "id": 359
+ },
+ {
+ "id": 360
+ },
+ {
+ "id": 361
+ },
+ {
+ "id": 362
+ },
+ {
+ "id": 363
+ },
+ {
+ "id": 364
+ },
+ {
+ "id": 365
+ },
+ {
+ "id": 366
+ },
+ {
+ "id": 367
+ },
+ {
+ "id": 368
+ },
+ {
+ "id": 369
+ },
+ {
+ "id": 370
+ },
+ {
+ "id": 371
+ },
+ {
+ "id": 372
+ },
+ {
+ "id": 373
+ },
+ {
+ "id": 374
+ },
+ {
+ "id": 375
+ },
+ {
+ "id": 376
+ },
+ {
+ "id": 377
+ },
+ {
+ "id": 378
+ },
+ {
+ "id": 379
+ },
+ {
+ "id": 380
+ },
+ {
+ "id": 381
+ },
+ {
+ "id": 382
+ },
+ {
+ "id": 383
+ },
+ {
+ "id": 384
+ },
+ {
+ "id": 385
+ },
+ {
+ "id": 386
+ },
+ {
+ "id": 387
+ },
+ {
+ "id": 388
+ },
+ {
+ "id": 389
+ },
+ {
+ "id": 390
+ },
+ {
+ "id": 391
+ },
+ {
+ "id": 392
+ },
+ {
+ "id": 393
+ },
+ {
+ "id": 394
+ },
+ {
+ "id": 395
+ },
+ {
+ "id": 396
+ },
+ {
+ "id": 397
+ },
+ {
+ "id": 398
+ },
+ {
+ "id": 399
+ },
+ {
+ "id": 400
+ },
+ {
+ "id": 401
+ },
+ {
+ "id": 402
+ },
+ {
+ "id": 403
+ },
+ {
+ "id": 404
+ },
+ {
+ "id": 405
+ },
+ {
+ "id": 406
+ },
+ {
+ "id": 407
+ },
+ {
+ "id": 408
+ },
+ {
+ "id": 409
+ },
+ {
+ "id": 410
+ },
+ {
+ "id": 411
+ },
+ {
+ "id": 412
+ },
+ {
+ "id": 413
+ },
+ {
+ "id": 414
+ },
+ {
+ "id": 415
+ },
+ {
+ "id": 416
+ },
+ {
+ "id": 417
+ },
+ {
+ "id": 418
+ },
+ {
+ "id": 419
+ },
+ {
+ "id": 420
+ },
+ {
+ "id": 421
+ },
+ {
+ "id": 422
+ },
+ {
+ "id": 423
+ },
+ {
+ "id": 424
+ },
+ {
+ "id": 425
+ },
+ {
+ "id": 426
+ },
+ {
+ "id": 427
+ },
+ {
+ "id": 428
+ },
+ {
+ "id": 429
+ },
+ {
+ "id": 430
+ },
+ {
+ "id": 431
+ },
+ {
+ "id": 432
+ },
+ {
+ "id": 433
+ },
+ {
+ "id": 434
+ },
+ {
+ "id": 435
+ },
+ {
+ "id": 436
+ },
+ {
+ "id": 437
+ },
+ {
+ "id": 438
+ },
+ {
+ "id": 439
+ },
+ {
+ "id": 440
+ },
+ {
+ "id": 441
+ },
+ {
+ "id": 442
+ },
+ {
+ "id": 443
+ },
+ {
+ "id": 444
+ },
+ {
+ "id": 445
+ },
+ {
+ "id": 446
+ },
+ {
+ "id": 447
+ },
+ {
+ "id": 448
+ },
+ {
+ "id": 449
+ },
+ {
+ "id": 450
+ },
+ {
+ "id": 451
+ },
+ {
+ "id": 452
+ },
+ {
+ "id": 453
+ },
+ {
+ "id": 454
+ },
+ {
+ "id": 455
+ },
+ {
+ "id": 456
+ },
+ {
+ "id": 457
+ },
+ {
+ "id": 458
+ },
+ {
+ "id": 459
+ },
+ {
+ "id": 460
+ },
+ {
+ "id": 461
+ },
+ {
+ "id": 462
+ },
+ {
+ "id": 463
+ },
+ {
+ "id": 464
+ },
+ {
+ "id": 465
+ },
+ {
+ "id": 466
+ },
+ {
+ "id": 467
+ },
+ {
+ "id": 468
+ },
+ {
+ "id": 469
+ },
+ {
+ "id": 470
+ },
+ {
+ "id": 471
+ },
+ {
+ "id": 472
+ },
+ {
+ "id": 473
+ },
+ {
+ "id": 474
+ },
+ {
+ "id": 475
+ },
+ {
+ "id": 476
+ },
+ {
+ "id": 477
+ },
+ {
+ "id": 478
+ },
+ {
+ "id": 479
+ },
+ {
+ "id": 480
+ },
+ {
+ "id": 481
+ },
+ {
+ "id": 482
+ },
+ {
+ "id": 483
+ },
+ {
+ "id": 484
+ },
+ {
+ "id": 485
+ },
+ {
+ "id": 486
+ },
+ {
+ "id": 487
+ },
+ {
+ "id": 488
+ },
+ {
+ "id": 489
+ },
+ {
+ "id": 490
+ },
+ {
+ "id": 491
+ },
+ {
+ "id": 492
+ },
+ {
+ "id": 493
+ },
+ {
+ "id": 494
+ },
+ {
+ "id": 495
+ },
+ {
+ "id": 496
+ },
+ {
+ "id": 497
+ },
+ {
+ "id": 498
+ },
+ {
+ "id": 499
+ },
+ {
+ "id": 500
+ },
+ {
+ "id": 501
+ },
+ {
+ "id": 502
+ },
+ {
+ "id": 503
+ },
+ {
+ "id": 504
+ },
+ {
+ "id": 505
+ },
+ {
+ "id": 506
+ },
+ {
+ "id": 507
+ },
+ {
+ "id": 508
+ },
+ {
+ "id": 509
+ },
+ {
+ "id": 510
+ },
+ {
+ "id": 511
+ },
+ {
+ "id": 512
+ },
+ {
+ "id": 513
+ },
+ {
+ "id": 514
+ },
+ {
+ "id": 515
+ },
+ {
+ "id": 516
+ },
+ {
+ "id": 517
+ },
+ {
+ "id": 518
+ },
+ {
+ "id": 519
+ },
+ {
+ "id": 520
+ },
+ {
+ "id": 521
+ },
+ {
+ "id": 522
+ },
+ {
+ "id": 523
+ },
+ {
+ "id": 524
+ },
+ {
+ "id": 525
+ },
+ {
+ "id": 526
+ },
+ {
+ "id": 527
+ },
+ {
+ "id": 528
+ },
+ {
+ "id": 529
+ },
+ {
+ "id": 530
+ },
+ {
+ "id": 531
+ },
+ {
+ "id": 532
+ },
+ {
+ "id": 533
+ },
+ {
+ "id": 534
+ },
+ {
+ "id": 535
+ },
+ {
+ "id": 536
+ },
+ {
+ "id": 537
+ },
+ {
+ "id": 538
+ },
+ {
+ "id": 539
+ },
+ {
+ "id": 540
+ },
+ {
+ "id": 541
+ },
+ {
+ "id": 542
+ },
+ {
+ "id": 543
+ },
+ {
+ "id": 544
+ },
+ {
+ "id": 545
+ },
+ {
+ "id": 546
+ },
+ {
+ "id": 547
+ },
+ {
+ "id": 548
+ },
+ {
+ "id": 549
+ },
+ {
+ "id": 550
+ },
+ {
+ "id": 551
+ },
+ {
+ "id": 552
+ },
+ {
+ "id": 553
+ },
+ {
+ "id": 554
+ },
+ {
+ "id": 555
+ },
+ {
+ "id": 556
+ },
+ {
+ "id": 557
+ },
+ {
+ "id": 558
+ },
+ {
+ "id": 559
+ },
+ {
+ "id": 560
+ },
+ {
+ "id": 561
+ },
+ {
+ "id": 562
+ },
+ {
+ "id": 563
+ },
+ {
+ "id": 564
+ },
+ {
+ "id": 565
+ },
+ {
+ "id": 566
+ },
+ {
+ "id": 567
+ },
+ {
+ "id": 568
+ },
+ {
+ "id": 569
+ },
+ {
+ "id": 570
+ },
+ {
+ "id": 571
+ },
+ {
+ "id": 572
+ },
+ {
+ "id": 573
+ },
+ {
+ "id": 574
+ },
+ {
+ "id": 575
+ },
+ {
+ "id": 576
+ },
+ {
+ "id": 577
+ },
+ {
+ "id": 578
+ },
+ {
+ "id": 579
+ },
+ {
+ "id": 580
+ },
+ {
+ "id": 581
+ },
+ {
+ "id": 582
+ },
+ {
+ "id": 583
+ },
+ {
+ "id": 584
+ },
+ {
+ "id": 585
+ },
+ {
+ "id": 586
+ },
+ {
+ "id": 587
+ },
+ {
+ "id": 588
+ },
+ {
+ "id": 589
+ },
+ {
+ "id": 590
+ },
+ {
+ "id": 591
+ },
+ {
+ "id": 592
+ },
+ {
+ "id": 593
+ },
+ {
+ "id": 594
+ },
+ {
+ "id": 595
+ },
+ {
+ "id": 596
+ },
+ {
+ "id": 597
+ },
+ {
+ "id": 598
+ },
+ {
+ "id": 599
+ }
+ ],
+ "links": [
+ {
+ "target": 1,
+ "source": 0
+ },
+ {
+ "target": 2,
+ "source": 1
+ },
+ {
+ "target": 3,
+ "source": 1
+ },
+ {
+ "target": 4,
+ "source": 1
+ },
+ {
+ "target": 5,
+ "source": 1
+ },
+ {
+ "target": 6,
+ "source": 2
+ },
+ {
+ "target": 7,
+ "source": 6
+ },
+ {
+ "target": 8,
+ "source": 5
+ },
+ {
+ "target": 9,
+ "source": 3
+ },
+ {
+ "target": 10,
+ "source": 6
+ },
+ {
+ "target": 11,
+ "source": 9
+ },
+ {
+ "target": 12,
+ "source": 5
+ },
+ {
+ "target": 13,
+ "source": 11
+ },
+ {
+ "target": 14,
+ "source": 6
+ },
+ {
+ "target": 15,
+ "source": 14
+ },
+ {
+ "target": 16,
+ "source": 10
+ },
+ {
+ "target": 17,
+ "source": 10
+ },
+ {
+ "target": 18,
+ "source": 1
+ },
+ {
+ "target": 19,
+ "source": 5
+ },
+ {
+ "target": 20,
+ "source": 3
+ },
+ {
+ "target": 21,
+ "source": 6
+ },
+ {
+ "target": 22,
+ "source": 14
+ },
+ {
+ "target": 23,
+ "source": 13
+ },
+ {
+ "target": 24,
+ "source": 13
+ },
+ {
+ "target": 25,
+ "source": 2
+ },
+ {
+ "target": 26,
+ "source": 9
+ },
+ {
+ "target": 27,
+ "source": 14
+ },
+ {
+ "target": 28,
+ "source": 24
+ },
+ {
+ "target": 29,
+ "source": 19
+ },
+ {
+ "target": 30,
+ "source": 14
+ },
+ {
+ "target": 31,
+ "source": 23
+ },
+ {
+ "target": 32,
+ "source": 3
+ },
+ {
+ "target": 33,
+ "source": 7
+ },
+ {
+ "target": 34,
+ "source": 7
+ },
+ {
+ "target": 35,
+ "source": 14
+ },
+ {
+ "target": 36,
+ "source": 6
+ },
+ {
+ "target": 37,
+ "source": 28
+ },
+ {
+ "target": 38,
+ "source": 22
+ },
+ {
+ "target": 39,
+ "source": 28
+ },
+ {
+ "target": 40,
+ "source": 37
+ },
+ {
+ "target": 41,
+ "source": 25
+ },
+ {
+ "target": 42,
+ "source": 38
+ },
+ {
+ "target": 43,
+ "source": 15
+ },
+ {
+ "target": 44,
+ "source": 40
+ },
+ {
+ "target": 45,
+ "source": 13
+ },
+ {
+ "target": 46,
+ "source": 28
+ },
+ {
+ "target": 47,
+ "source": 43
+ },
+ {
+ "target": 48,
+ "source": 40
+ },
+ {
+ "target": 49,
+ "source": 1
+ },
+ {
+ "target": 50,
+ "source": 26
+ },
+ {
+ "target": 51,
+ "source": 35
+ },
+ {
+ "target": 52,
+ "source": 22
+ },
+ {
+ "target": 53,
+ "source": 39
+ },
+ {
+ "target": 54,
+ "source": 11
+ },
+ {
+ "target": 55,
+ "source": 20
+ },
+ {
+ "target": 56,
+ "source": 24
+ },
+ {
+ "target": 57,
+ "source": 35
+ },
+ {
+ "target": 58,
+ "source": 46
+ },
+ {
+ "target": 59,
+ "source": 8
+ },
+ {
+ "target": 60,
+ "source": 52
+ },
+ {
+ "target": 61,
+ "source": 8
+ },
+ {
+ "target": 62,
+ "source": 5
+ },
+ {
+ "target": 63,
+ "source": 10
+ },
+ {
+ "target": 64,
+ "source": 39
+ },
+ {
+ "target": 65,
+ "source": 0
+ },
+ {
+ "target": 66,
+ "source": 6
+ },
+ {
+ "target": 67,
+ "source": 41
+ },
+ {
+ "target": 68,
+ "source": 61
+ },
+ {
+ "target": 69,
+ "source": 59
+ },
+ {
+ "target": 70,
+ "source": 65
+ },
+ {
+ "target": 71,
+ "source": 29
+ },
+ {
+ "target": 72,
+ "source": 12
+ },
+ {
+ "target": 73,
+ "source": 46
+ },
+ {
+ "target": 74,
+ "source": 19
+ },
+ {
+ "target": 75,
+ "source": 39
+ },
+ {
+ "target": 76,
+ "source": 41
+ },
+ {
+ "target": 77,
+ "source": 35
+ },
+ {
+ "target": 78,
+ "source": 36
+ },
+ {
+ "target": 79,
+ "source": 23
+ },
+ {
+ "target": 80,
+ "source": 8
+ },
+ {
+ "target": 81,
+ "source": 36
+ },
+ {
+ "target": 82,
+ "source": 58
+ },
+ {
+ "target": 83,
+ "source": 23
+ },
+ {
+ "target": 84,
+ "source": 25
+ },
+ {
+ "target": 85,
+ "source": 75
+ },
+ {
+ "target": 86,
+ "source": 28
+ },
+ {
+ "target": 87,
+ "source": 34
+ },
+ {
+ "target": 88,
+ "source": 34
+ },
+ {
+ "target": 89,
+ "source": 20
+ },
+ {
+ "target": 90,
+ "source": 68
+ },
+ {
+ "target": 91,
+ "source": 48
+ },
+ {
+ "target": 92,
+ "source": 73
+ },
+ {
+ "target": 93,
+ "source": 41
+ },
+ {
+ "target": 94,
+ "source": 85
+ },
+ {
+ "target": 95,
+ "source": 84
+ },
+ {
+ "target": 96,
+ "source": 64
+ },
+ {
+ "target": 97,
+ "source": 59
+ },
+ {
+ "target": 98,
+ "source": 46
+ },
+ {
+ "target": 99,
+ "source": 14
+ },
+ {
+ "target": 100,
+ "source": 25
+ },
+ {
+ "target": 101,
+ "source": 66
+ },
+ {
+ "target": 102,
+ "source": 6
+ },
+ {
+ "target": 103,
+ "source": 53
+ },
+ {
+ "target": 104,
+ "source": 22
+ },
+ {
+ "target": 105,
+ "source": 47
+ },
+ {
+ "target": 106,
+ "source": 54
+ },
+ {
+ "target": 107,
+ "source": 47
+ },
+ {
+ "target": 108,
+ "source": 55
+ },
+ {
+ "target": 109,
+ "source": 76
+ },
+ {
+ "target": 110,
+ "source": 34
+ },
+ {
+ "target": 111,
+ "source": 93
+ },
+ {
+ "target": 112,
+ "source": 0
+ },
+ {
+ "target": 113,
+ "source": 58
+ },
+ {
+ "target": 114,
+ "source": 1
+ },
+ {
+ "target": 115,
+ "source": 109
+ },
+ {
+ "target": 116,
+ "source": 89
+ },
+ {
+ "target": 117,
+ "source": 49
+ },
+ {
+ "target": 118,
+ "source": 75
+ },
+ {
+ "target": 119,
+ "source": 78
+ },
+ {
+ "target": 120,
+ "source": 11
+ },
+ {
+ "target": 121,
+ "source": 37
+ },
+ {
+ "target": 122,
+ "source": 20
+ },
+ {
+ "target": 123,
+ "source": 52
+ },
+ {
+ "target": 124,
+ "source": 45
+ },
+ {
+ "target": 125,
+ "source": 93
+ },
+ {
+ "target": 126,
+ "source": 105
+ },
+ {
+ "target": 127,
+ "source": 99
+ },
+ {
+ "target": 128,
+ "source": 48
+ },
+ {
+ "target": 129,
+ "source": 34
+ },
+ {
+ "target": 130,
+ "source": 58
+ },
+ {
+ "target": 131,
+ "source": 97
+ },
+ {
+ "target": 132,
+ "source": 89
+ },
+ {
+ "target": 133,
+ "source": 19
+ },
+ {
+ "target": 134,
+ "source": 106
+ },
+ {
+ "target": 135,
+ "source": 62
+ },
+ {
+ "target": 136,
+ "source": 99
+ },
+ {
+ "target": 137,
+ "source": 97
+ },
+ {
+ "target": 138,
+ "source": 62
+ },
+ {
+ "target": 139,
+ "source": 109
+ },
+ {
+ "target": 140,
+ "source": 101
+ },
+ {
+ "target": 141,
+ "source": 88
+ },
+ {
+ "target": 142,
+ "source": 107
+ },
+ {
+ "target": 143,
+ "source": 81
+ },
+ {
+ "target": 144,
+ "source": 92
+ },
+ {
+ "target": 145,
+ "source": 102
+ },
+ {
+ "target": 146,
+ "source": 60
+ },
+ {
+ "target": 147,
+ "source": 56
+ },
+ {
+ "target": 148,
+ "source": 41
+ },
+ {
+ "target": 149,
+ "source": 84
+ },
+ {
+ "target": 150,
+ "source": 79
+ },
+ {
+ "target": 151,
+ "source": 56
+ },
+ {
+ "target": 152,
+ "source": 110
+ },
+ {
+ "target": 153,
+ "source": 130
+ },
+ {
+ "target": 154,
+ "source": 65
+ },
+ {
+ "target": 155,
+ "source": 66
+ },
+ {
+ "target": 156,
+ "source": 124
+ },
+ {
+ "target": 157,
+ "source": 10
+ },
+ {
+ "target": 158,
+ "source": 17
+ },
+ {
+ "target": 159,
+ "source": 0
+ },
+ {
+ "target": 160,
+ "source": 19
+ },
+ {
+ "target": 161,
+ "source": 115
+ },
+ {
+ "target": 162,
+ "source": 95
+ },
+ {
+ "target": 163,
+ "source": 144
+ },
+ {
+ "target": 164,
+ "source": 22
+ },
+ {
+ "target": 165,
+ "source": 91
+ },
+ {
+ "target": 166,
+ "source": 14
+ },
+ {
+ "target": 167,
+ "source": 34
+ },
+ {
+ "target": 168,
+ "source": 40
+ },
+ {
+ "target": 169,
+ "source": 40
+ },
+ {
+ "target": 170,
+ "source": 100
+ },
+ {
+ "target": 171,
+ "source": 23
+ },
+ {
+ "target": 172,
+ "source": 88
+ },
+ {
+ "target": 173,
+ "source": 78
+ },
+ {
+ "target": 174,
+ "source": 8
+ },
+ {
+ "target": 175,
+ "source": 129
+ },
+ {
+ "target": 176,
+ "source": 160
+ },
+ {
+ "target": 177,
+ "source": 94
+ },
+ {
+ "target": 178,
+ "source": 42
+ },
+ {
+ "target": 179,
+ "source": 33
+ },
+ {
+ "target": 180,
+ "source": 53
+ },
+ {
+ "target": 181,
+ "source": 73
+ },
+ {
+ "target": 182,
+ "source": 112
+ },
+ {
+ "target": 183,
+ "source": 175
+ },
+ {
+ "target": 184,
+ "source": 71
+ },
+ {
+ "target": 185,
+ "source": 65
+ },
+ {
+ "target": 186,
+ "source": 15
+ },
+ {
+ "target": 187,
+ "source": 69
+ },
+ {
+ "target": 188,
+ "source": 1
+ },
+ {
+ "target": 189,
+ "source": 142
+ },
+ {
+ "target": 190,
+ "source": 111
+ },
+ {
+ "target": 191,
+ "source": 6
+ },
+ {
+ "target": 192,
+ "source": 31
+ },
+ {
+ "target": 193,
+ "source": 54
+ },
+ {
+ "target": 194,
+ "source": 128
+ },
+ {
+ "target": 195,
+ "source": 24
+ },
+ {
+ "target": 196,
+ "source": 163
+ },
+ {
+ "target": 197,
+ "source": 160
+ },
+ {
+ "target": 198,
+ "source": 168
+ },
+ {
+ "target": 199,
+ "source": 92
+ },
+ {
+ "target": 200,
+ "source": 80
+ },
+ {
+ "target": 201,
+ "source": 18
+ },
+ {
+ "target": 202,
+ "source": 191
+ },
+ {
+ "target": 203,
+ "source": 65
+ },
+ {
+ "target": 204,
+ "source": 128
+ },
+ {
+ "target": 205,
+ "source": 195
+ },
+ {
+ "target": 206,
+ "source": 126
+ },
+ {
+ "target": 207,
+ "source": 202
+ },
+ {
+ "target": 208,
+ "source": 162
+ },
+ {
+ "target": 209,
+ "source": 54
+ },
+ {
+ "target": 210,
+ "source": 125
+ },
+ {
+ "target": 211,
+ "source": 170
+ },
+ {
+ "target": 212,
+ "source": 150
+ },
+ {
+ "target": 213,
+ "source": 202
+ },
+ {
+ "target": 214,
+ "source": 202
+ },
+ {
+ "target": 215,
+ "source": 83
+ },
+ {
+ "target": 216,
+ "source": 6
+ },
+ {
+ "target": 217,
+ "source": 60
+ },
+ {
+ "target": 218,
+ "source": 209
+ },
+ {
+ "target": 219,
+ "source": 3
+ },
+ {
+ "target": 220,
+ "source": 83
+ },
+ {
+ "target": 221,
+ "source": 18
+ },
+ {
+ "target": 222,
+ "source": 61
+ },
+ {
+ "target": 223,
+ "source": 185
+ },
+ {
+ "target": 224,
+ "source": 62
+ },
+ {
+ "target": 225,
+ "source": 55
+ },
+ {
+ "target": 226,
+ "source": 51
+ },
+ {
+ "target": 227,
+ "source": 21
+ },
+ {
+ "target": 228,
+ "source": 48
+ },
+ {
+ "target": 229,
+ "source": 175
+ },
+ {
+ "target": 230,
+ "source": 3
+ },
+ {
+ "target": 231,
+ "source": 25
+ },
+ {
+ "target": 232,
+ "source": 143
+ },
+ {
+ "target": 233,
+ "source": 229
+ },
+ {
+ "target": 234,
+ "source": 172
+ },
+ {
+ "target": 235,
+ "source": 32
+ },
+ {
+ "target": 236,
+ "source": 56
+ },
+ {
+ "target": 237,
+ "source": 168
+ },
+ {
+ "target": 238,
+ "source": 143
+ },
+ {
+ "target": 239,
+ "source": 1
+ },
+ {
+ "target": 240,
+ "source": 125
+ },
+ {
+ "target": 241,
+ "source": 60
+ },
+ {
+ "target": 242,
+ "source": 150
+ },
+ {
+ "target": 243,
+ "source": 238
+ },
+ {
+ "target": 244,
+ "source": 76
+ },
+ {
+ "target": 245,
+ "source": 129
+ },
+ {
+ "target": 246,
+ "source": 58
+ },
+ {
+ "target": 247,
+ "source": 232
+ },
+ {
+ "target": 248,
+ "source": 80
+ },
+ {
+ "target": 249,
+ "source": 39
+ },
+ {
+ "target": 250,
+ "source": 143
+ },
+ {
+ "target": 251,
+ "source": 47
+ },
+ {
+ "target": 252,
+ "source": 13
+ },
+ {
+ "target": 253,
+ "source": 191
+ },
+ {
+ "target": 254,
+ "source": 60
+ },
+ {
+ "target": 255,
+ "source": 52
+ },
+ {
+ "target": 256,
+ "source": 224
+ },
+ {
+ "target": 257,
+ "source": 109
+ },
+ {
+ "target": 258,
+ "source": 1
+ },
+ {
+ "target": 259,
+ "source": 66
+ },
+ {
+ "target": 260,
+ "source": 2
+ },
+ {
+ "target": 261,
+ "source": 143
+ },
+ {
+ "target": 262,
+ "source": 40
+ },
+ {
+ "target": 263,
+ "source": 202
+ },
+ {
+ "target": 264,
+ "source": 104
+ },
+ {
+ "target": 265,
+ "source": 116
+ },
+ {
+ "target": 266,
+ "source": 154
+ },
+ {
+ "target": 267,
+ "source": 120
+ },
+ {
+ "target": 268,
+ "source": 226
+ },
+ {
+ "target": 269,
+ "source": 245
+ },
+ {
+ "target": 270,
+ "source": 128
+ },
+ {
+ "target": 271,
+ "source": 125
+ },
+ {
+ "target": 272,
+ "source": 216
+ },
+ {
+ "target": 273,
+ "source": 263
+ },
+ {
+ "target": 274,
+ "source": 98
+ },
+ {
+ "target": 275,
+ "source": 118
+ },
+ {
+ "target": 276,
+ "source": 55
+ },
+ {
+ "target": 277,
+ "source": 132
+ },
+ {
+ "target": 278,
+ "source": 173
+ },
+ {
+ "target": 279,
+ "source": 50
+ },
+ {
+ "target": 280,
+ "source": 63
+ },
+ {
+ "target": 281,
+ "source": 197
+ },
+ {
+ "target": 282,
+ "source": 153
+ },
+ {
+ "target": 283,
+ "source": 243
+ },
+ {
+ "target": 284,
+ "source": 195
+ },
+ {
+ "target": 285,
+ "source": 98
+ },
+ {
+ "target": 286,
+ "source": 45
+ },
+ {
+ "target": 287,
+ "source": 274
+ },
+ {
+ "target": 288,
+ "source": 152
+ },
+ {
+ "target": 289,
+ "source": 228
+ },
+ {
+ "target": 290,
+ "source": 49
+ },
+ {
+ "target": 291,
+ "source": 130
+ },
+ {
+ "target": 292,
+ "source": 197
+ },
+ {
+ "target": 293,
+ "source": 162
+ },
+ {
+ "target": 294,
+ "source": 115
+ },
+ {
+ "target": 295,
+ "source": 66
+ },
+ {
+ "target": 296,
+ "source": 181
+ },
+ {
+ "target": 297,
+ "source": 50
+ },
+ {
+ "target": 298,
+ "source": 14
+ },
+ {
+ "target": 299,
+ "source": 101
+ },
+ {
+ "target": 300,
+ "source": 126
+ },
+ {
+ "target": 301,
+ "source": 236
+ },
+ {
+ "target": 302,
+ "source": 195
+ },
+ {
+ "target": 303,
+ "source": 224
+ },
+ {
+ "target": 304,
+ "source": 129
+ },
+ {
+ "target": 305,
+ "source": 171
+ },
+ {
+ "target": 306,
+ "source": 233
+ },
+ {
+ "target": 307,
+ "source": 103
+ },
+ {
+ "target": 308,
+ "source": 36
+ },
+ {
+ "target": 309,
+ "source": 162
+ },
+ {
+ "target": 310,
+ "source": 100
+ },
+ {
+ "target": 311,
+ "source": 130
+ },
+ {
+ "target": 312,
+ "source": 123
+ },
+ {
+ "target": 313,
+ "source": 158
+ },
+ {
+ "target": 314,
+ "source": 258
+ },
+ {
+ "target": 315,
+ "source": 148
+ },
+ {
+ "target": 316,
+ "source": 70
+ },
+ {
+ "target": 317,
+ "source": 159
+ },
+ {
+ "target": 318,
+ "source": 257
+ },
+ {
+ "target": 319,
+ "source": 306
+ },
+ {
+ "target": 320,
+ "source": 307
+ },
+ {
+ "target": 321,
+ "source": 55
+ },
+ {
+ "target": 322,
+ "source": 64
+ },
+ {
+ "target": 323,
+ "source": 319
+ },
+ {
+ "target": 324,
+ "source": 121
+ },
+ {
+ "target": 325,
+ "source": 7
+ },
+ {
+ "target": 326,
+ "source": 207
+ },
+ {
+ "target": 327,
+ "source": 280
+ },
+ {
+ "target": 328,
+ "source": 121
+ },
+ {
+ "target": 329,
+ "source": 13
+ },
+ {
+ "target": 330,
+ "source": 59
+ },
+ {
+ "target": 331,
+ "source": 292
+ },
+ {
+ "target": 332,
+ "source": 267
+ },
+ {
+ "target": 333,
+ "source": 79
+ },
+ {
+ "target": 334,
+ "source": 113
+ },
+ {
+ "target": 335,
+ "source": 250
+ },
+ {
+ "target": 336,
+ "source": 4
+ },
+ {
+ "target": 337,
+ "source": 253
+ },
+ {
+ "target": 338,
+ "source": 34
+ },
+ {
+ "target": 339,
+ "source": 20
+ },
+ {
+ "target": 340,
+ "source": 160
+ },
+ {
+ "target": 341,
+ "source": 138
+ },
+ {
+ "target": 342,
+ "source": 45
+ },
+ {
+ "target": 343,
+ "source": 209
+ },
+ {
+ "target": 344,
+ "source": 173
+ },
+ {
+ "target": 345,
+ "source": 99
+ },
+ {
+ "target": 346,
+ "source": 111
+ },
+ {
+ "target": 347,
+ "source": 273
+ },
+ {
+ "target": 348,
+ "source": 267
+ },
+ {
+ "target": 349,
+ "source": 127
+ },
+ {
+ "target": 350,
+ "source": 310
+ },
+ {
+ "target": 351,
+ "source": 144
+ },
+ {
+ "target": 352,
+ "source": 274
+ },
+ {
+ "target": 353,
+ "source": 339
+ },
+ {
+ "target": 354,
+ "source": 308
+ },
+ {
+ "target": 355,
+ "source": 317
+ },
+ {
+ "target": 356,
+ "source": 130
+ },
+ {
+ "target": 357,
+ "source": 328
+ },
+ {
+ "target": 358,
+ "source": 342
+ },
+ {
+ "target": 359,
+ "source": 20
+ },
+ {
+ "target": 360,
+ "source": 155
+ },
+ {
+ "target": 361,
+ "source": 348
+ },
+ {
+ "target": 362,
+ "source": 119
+ },
+ {
+ "target": 363,
+ "source": 240
+ },
+ {
+ "target": 364,
+ "source": 176
+ },
+ {
+ "target": 365,
+ "source": 344
+ },
+ {
+ "target": 366,
+ "source": 306
+ },
+ {
+ "target": 367,
+ "source": 88
+ },
+ {
+ "target": 368,
+ "source": 56
+ },
+ {
+ "target": 369,
+ "source": 194
+ },
+ {
+ "target": 370,
+ "source": 136
+ },
+ {
+ "target": 371,
+ "source": 100
+ },
+ {
+ "target": 372,
+ "source": 233
+ },
+ {
+ "target": 373,
+ "source": 301
+ },
+ {
+ "target": 374,
+ "source": 373
+ },
+ {
+ "target": 375,
+ "source": 329
+ },
+ {
+ "target": 376,
+ "source": 302
+ },
+ {
+ "target": 377,
+ "source": 87
+ },
+ {
+ "target": 378,
+ "source": 16
+ },
+ {
+ "target": 379,
+ "source": 72
+ },
+ {
+ "target": 380,
+ "source": 144
+ },
+ {
+ "target": 381,
+ "source": 112
+ },
+ {
+ "target": 382,
+ "source": 88
+ },
+ {
+ "target": 383,
+ "source": 374
+ },
+ {
+ "target": 384,
+ "source": 213
+ },
+ {
+ "target": 385,
+ "source": 168
+ },
+ {
+ "target": 386,
+ "source": 14
+ },
+ {
+ "target": 387,
+ "source": 301
+ },
+ {
+ "target": 388,
+ "source": 76
+ },
+ {
+ "target": 389,
+ "source": 140
+ },
+ {
+ "target": 390,
+ "source": 187
+ },
+ {
+ "target": 391,
+ "source": 243
+ },
+ {
+ "target": 392,
+ "source": 249
+ },
+ {
+ "target": 393,
+ "source": 154
+ },
+ {
+ "target": 394,
+ "source": 131
+ },
+ {
+ "target": 395,
+ "source": 322
+ },
+ {
+ "target": 396,
+ "source": 1
+ },
+ {
+ "target": 397,
+ "source": 176
+ },
+ {
+ "target": 398,
+ "source": 187
+ },
+ {
+ "target": 399,
+ "source": 80
+ },
+ {
+ "target": 400,
+ "source": 211
+ },
+ {
+ "target": 401,
+ "source": 17
+ },
+ {
+ "target": 402,
+ "source": 294
+ },
+ {
+ "target": 403,
+ "source": 57
+ },
+ {
+ "target": 404,
+ "source": 135
+ },
+ {
+ "target": 405,
+ "source": 228
+ },
+ {
+ "target": 406,
+ "source": 227
+ },
+ {
+ "target": 407,
+ "source": 245
+ },
+ {
+ "target": 408,
+ "source": 237
+ },
+ {
+ "target": 409,
+ "source": 262
+ },
+ {
+ "target": 410,
+ "source": 66
+ },
+ {
+ "target": 411,
+ "source": 128
+ },
+ {
+ "target": 412,
+ "source": 30
+ },
+ {
+ "target": 413,
+ "source": 37
+ },
+ {
+ "target": 414,
+ "source": 172
+ },
+ {
+ "target": 415,
+ "source": 188
+ },
+ {
+ "target": 416,
+ "source": 191
+ },
+ {
+ "target": 417,
+ "source": 251
+ },
+ {
+ "target": 418,
+ "source": 382
+ },
+ {
+ "target": 419,
+ "source": 138
+ },
+ {
+ "target": 420,
+ "source": 354
+ },
+ {
+ "target": 421,
+ "source": 203
+ },
+ {
+ "target": 422,
+ "source": 220
+ },
+ {
+ "target": 423,
+ "source": 404
+ },
+ {
+ "target": 424,
+ "source": 178
+ },
+ {
+ "target": 425,
+ "source": 72
+ },
+ {
+ "target": 426,
+ "source": 329
+ },
+ {
+ "target": 427,
+ "source": 119
+ },
+ {
+ "target": 428,
+ "source": 206
+ },
+ {
+ "target": 429,
+ "source": 287
+ },
+ {
+ "target": 430,
+ "source": 315
+ },
+ {
+ "target": 431,
+ "source": 62
+ },
+ {
+ "target": 432,
+ "source": 366
+ },
+ {
+ "target": 433,
+ "source": 290
+ },
+ {
+ "target": 434,
+ "source": 196
+ },
+ {
+ "target": 435,
+ "source": 132
+ },
+ {
+ "target": 436,
+ "source": 172
+ },
+ {
+ "target": 437,
+ "source": 286
+ },
+ {
+ "target": 438,
+ "source": 172
+ },
+ {
+ "target": 439,
+ "source": 207
+ },
+ {
+ "target": 440,
+ "source": 316
+ },
+ {
+ "target": 441,
+ "source": 127
+ },
+ {
+ "target": 442,
+ "source": 350
+ },
+ {
+ "target": 443,
+ "source": 114
+ },
+ {
+ "target": 444,
+ "source": 440
+ },
+ {
+ "target": 445,
+ "source": 174
+ },
+ {
+ "target": 446,
+ "source": 324
+ },
+ {
+ "target": 447,
+ "source": 154
+ },
+ {
+ "target": 448,
+ "source": 349
+ },
+ {
+ "target": 449,
+ "source": 170
+ },
+ {
+ "target": 450,
+ "source": 229
+ },
+ {
+ "target": 451,
+ "source": 171
+ },
+ {
+ "target": 452,
+ "source": 271
+ },
+ {
+ "target": 453,
+ "source": 24
+ },
+ {
+ "target": 454,
+ "source": 91
+ },
+ {
+ "target": 455,
+ "source": 61
+ },
+ {
+ "target": 456,
+ "source": 37
+ },
+ {
+ "target": 457,
+ "source": 235
+ },
+ {
+ "target": 458,
+ "source": 412
+ },
+ {
+ "target": 459,
+ "source": 299
+ },
+ {
+ "target": 460,
+ "source": 177
+ },
+ {
+ "target": 461,
+ "source": 447
+ },
+ {
+ "target": 462,
+ "source": 43
+ },
+ {
+ "target": 463,
+ "source": 415
+ },
+ {
+ "target": 464,
+ "source": 363
+ },
+ {
+ "target": 465,
+ "source": 9
+ },
+ {
+ "target": 466,
+ "source": 312
+ },
+ {
+ "target": 467,
+ "source": 138
+ },
+ {
+ "target": 468,
+ "source": 209
+ },
+ {
+ "target": 469,
+ "source": 425
+ },
+ {
+ "target": 470,
+ "source": 376
+ },
+ {
+ "target": 471,
+ "source": 379
+ },
+ {
+ "target": 472,
+ "source": 252
+ },
+ {
+ "target": 473,
+ "source": 129
+ },
+ {
+ "target": 474,
+ "source": 30
+ },
+ {
+ "target": 475,
+ "source": 325
+ },
+ {
+ "target": 476,
+ "source": 411
+ },
+ {
+ "target": 477,
+ "source": 264
+ },
+ {
+ "target": 478,
+ "source": 346
+ },
+ {
+ "target": 479,
+ "source": 468
+ },
+ {
+ "target": 480,
+ "source": 67
+ },
+ {
+ "target": 481,
+ "source": 438
+ },
+ {
+ "target": 482,
+ "source": 374
+ },
+ {
+ "target": 483,
+ "source": 173
+ },
+ {
+ "target": 484,
+ "source": 198
+ },
+ {
+ "target": 485,
+ "source": 22
+ },
+ {
+ "target": 486,
+ "source": 159
+ },
+ {
+ "target": 487,
+ "source": 172
+ },
+ {
+ "target": 488,
+ "source": 13
+ },
+ {
+ "target": 489,
+ "source": 127
+ },
+ {
+ "target": 490,
+ "source": 337
+ },
+ {
+ "target": 491,
+ "source": 59
+ },
+ {
+ "target": 492,
+ "source": 229
+ },
+ {
+ "target": 493,
+ "source": 177
+ },
+ {
+ "target": 494,
+ "source": 117
+ },
+ {
+ "target": 495,
+ "source": 290
+ },
+ {
+ "target": 496,
+ "source": 81
+ },
+ {
+ "target": 497,
+ "source": 247
+ },
+ {
+ "target": 498,
+ "source": 149
+ },
+ {
+ "target": 499,
+ "source": 227
+ },
+ {
+ "target": 500,
+ "source": 393
+ },
+ {
+ "target": 501,
+ "source": 221
+ },
+ {
+ "target": 502,
+ "source": 345
+ },
+ {
+ "target": 503,
+ "source": 413
+ },
+ {
+ "target": 504,
+ "source": 247
+ },
+ {
+ "target": 505,
+ "source": 281
+ },
+ {
+ "target": 506,
+ "source": 294
+ },
+ {
+ "target": 507,
+ "source": 463
+ },
+ {
+ "target": 508,
+ "source": 119
+ },
+ {
+ "target": 509,
+ "source": 72
+ },
+ {
+ "target": 510,
+ "source": 207
+ },
+ {
+ "target": 511,
+ "source": 380
+ },
+ {
+ "target": 512,
+ "source": 409
+ },
+ {
+ "target": 513,
+ "source": 331
+ },
+ {
+ "target": 514,
+ "source": 444
+ },
+ {
+ "target": 515,
+ "source": 334
+ },
+ {
+ "target": 516,
+ "source": 228
+ },
+ {
+ "target": 517,
+ "source": 51
+ },
+ {
+ "target": 518,
+ "source": 12
+ },
+ {
+ "target": 519,
+ "source": 290
+ },
+ {
+ "target": 520,
+ "source": 433
+ },
+ {
+ "target": 521,
+ "source": 312
+ },
+ {
+ "target": 522,
+ "source": 483
+ },
+ {
+ "target": 523,
+ "source": 469
+ },
+ {
+ "target": 524,
+ "source": 7
+ },
+ {
+ "target": 525,
+ "source": 357
+ },
+ {
+ "target": 526,
+ "source": 146
+ },
+ {
+ "target": 527,
+ "source": 251
+ },
+ {
+ "target": 528,
+ "source": 43
+ },
+ {
+ "target": 529,
+ "source": 379
+ },
+ {
+ "target": 530,
+ "source": 439
+ },
+ {
+ "target": 531,
+ "source": 214
+ },
+ {
+ "target": 532,
+ "source": 366
+ },
+ {
+ "target": 533,
+ "source": 56
+ },
+ {
+ "target": 534,
+ "source": 25
+ },
+ {
+ "target": 535,
+ "source": 534
+ },
+ {
+ "target": 536,
+ "source": 162
+ },
+ {
+ "target": 537,
+ "source": 45
+ },
+ {
+ "target": 538,
+ "source": 180
+ },
+ {
+ "target": 539,
+ "source": 56
+ },
+ {
+ "target": 540,
+ "source": 417
+ },
+ {
+ "target": 541,
+ "source": 372
+ },
+ {
+ "target": 542,
+ "source": 534
+ },
+ {
+ "target": 543,
+ "source": 264
+ },
+ {
+ "target": 544,
+ "source": 197
+ },
+ {
+ "target": 545,
+ "source": 496
+ },
+ {
+ "target": 546,
+ "source": 221
+ },
+ {
+ "target": 547,
+ "source": 238
+ },
+ {
+ "target": 548,
+ "source": 97
+ },
+ {
+ "target": 549,
+ "source": 229
+ },
+ {
+ "target": 550,
+ "source": 240
+ },
+ {
+ "target": 551,
+ "source": 213
+ },
+ {
+ "target": 552,
+ "source": 523
+ },
+ {
+ "target": 553,
+ "source": 293
+ },
+ {
+ "target": 554,
+ "source": 287
+ },
+ {
+ "target": 555,
+ "source": 360
+ },
+ {
+ "target": 556,
+ "source": 467
+ },
+ {
+ "target": 557,
+ "source": 419
+ },
+ {
+ "target": 558,
+ "source": 136
+ },
+ {
+ "target": 559,
+ "source": 427
+ },
+ {
+ "target": 560,
+ "source": 20
+ },
+ {
+ "target": 561,
+ "source": 218
+ },
+ {
+ "target": 562,
+ "source": 540
+ },
+ {
+ "target": 563,
+ "source": 30
+ },
+ {
+ "target": 564,
+ "source": 135
+ },
+ {
+ "target": 565,
+ "source": 51
+ },
+ {
+ "target": 566,
+ "source": 450
+ },
+ {
+ "target": 567,
+ "source": 191
+ },
+ {
+ "target": 568,
+ "source": 414
+ },
+ {
+ "target": 569,
+ "source": 338
+ },
+ {
+ "target": 570,
+ "source": 188
+ },
+ {
+ "target": 571,
+ "source": 1
+ },
+ {
+ "target": 572,
+ "source": 498
+ },
+ {
+ "target": 573,
+ "source": 198
+ },
+ {
+ "target": 574,
+ "source": 35
+ },
+ {
+ "target": 575,
+ "source": 207
+ },
+ {
+ "target": 576,
+ "source": 205
+ },
+ {
+ "target": 577,
+ "source": 240
+ },
+ {
+ "target": 578,
+ "source": 330
+ },
+ {
+ "target": 579,
+ "source": 174
+ },
+ {
+ "target": 580,
+ "source": 156
+ },
+ {
+ "target": 581,
+ "source": 441
+ },
+ {
+ "target": 582,
+ "source": 482
+ },
+ {
+ "target": 583,
+ "source": 283
+ },
+ {
+ "target": 584,
+ "source": 448
+ },
+ {
+ "target": 585,
+ "source": 382
+ },
+ {
+ "target": 586,
+ "source": 484
+ },
+ {
+ "target": 587,
+ "source": 493
+ },
+ {
+ "target": 588,
+ "source": 491
+ },
+ {
+ "target": 589,
+ "source": 404
+ },
+ {
+ "target": 590,
+ "source": 9
+ },
+ {
+ "target": 591,
+ "source": 304
+ },
+ {
+ "target": 592,
+ "source": 261
+ },
+ {
+ "target": 593,
+ "source": 398
+ },
+ {
+ "target": 594,
+ "source": 375
+ },
+ {
+ "target": 595,
+ "source": 158
+ },
+ {
+ "target": 596,
+ "source": 149
+ },
+ {
+ "target": 597,
+ "source": 517
+ },
+ {
+ "target": 598,
+ "source": 25
+ },
+ {
+ "target": 599,
+ "source": 545
+ }
+ ]
+}
diff --git a/app_expo/data/roam.json b/app_expo/data/roam.json
new file mode 100644
index 0000000..dd1b617
--- /dev/null
+++ b/app_expo/data/roam.json
@@ -0,0 +1,7138 @@
+{
+ "nodes": [
+ {
+ "id": "c7c9a236-94ab-4210-b417-21daac3f68a5",
+ "file": "/home/thomas/OneDrive/org-roam/what_is_the_paradox_of_phase_transitions.org",
+ "title": "what_is_the_paradox_of_phase_transitions.org"
+ },
+ {
+ "id": "345d7421-0f35-4665-aac5-4e0bb917a89b",
+ "file": "/home/thomas/OneDrive/org-roam/20210125182434-onedrive_org_roam_weekly_todos_org.org",
+ "title": "20210125182434-onedrive_org_roam_weekly_todos_org.org"
+ },
+ {
+ "id": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "file": "/home/thomas/OneDrive/org-roam/20210512160337-my_main_goal_is_to_show_how_the_berry_phase_approximates_topological_phase.org",
+ "title": "My main goal is to show how the Berry phase approximates topological phase"
+ },
+ {
+ "id": "e997346e-b3dd-48da-8597-93acac415fa1",
+ "file": "/home/thomas/OneDrive/org-roam/20210416111039-metric_space.org",
+ "title": "Metric Space"
+ },
+ {
+ "id": "2d657ec8-df42-4209-b009-6b4a4a01dbdb",
+ "file": "/home/thomas/OneDrive/org-roam/20210505155837-domain.org",
+ "title": "Domain"
+ },
+ {
+ "id": "231c3031-c739-4de4-a780-ec509b941280",
+ "file": "/home/thomas/OneDrive/org-roam/20201207163738-meeting_lucie.org",
+ "title": "meeting lucie"
+ },
+ {
+ "id": "5604354b-d609-48b2-9baa-7df8894793ac",
+ "file": "/home/thomas/OneDrive/org-roam/a_tradition_of_natural_kinds.org",
+ "title": "a_tradition_of_natural_kinds.org"
+ },
+ {
+ "id": "a133889b-5982-43d1-a4c5-e46312369b52",
+ "file": "/home/thomas/OneDrive/org-roam/20210302164341-extended_states_conduct_more_when_less_populated.org",
+ "title": "extended states conduct more when less populated"
+ },
+ {
+ "id": "bd8b598f-7c03-4f61-a250-f408e437232c",
+ "file": "/home/thomas/OneDrive/org-roam/20210309161322-reasoning_of_fqhe_is_less_rigorous_than_iqhe.org",
+ "title": "reasoning of FQHE is less rigorous than IQHE"
+ },
+ {
+ "id": "efa73856-a29d-4807-a4cd-91fad04e2a86",
+ "file": "/home/thomas/OneDrive/org-roam/Getting Started with Orgzly.org",
+ "title": "Welcome to Orgzly!"
+ },
+ {
+ "id": "ad600caa-8176-4353-ace6-3c8842260c6c",
+ "file": "/home/thomas/OneDrive/org-roam/20210503100035-proponents_and_opponents_of_thermodynamic_limit.org",
+ "title": "Proponents and opponents of thermodynamic limit"
+ },
+ {
+ "id": "79410b7f-6634-4010-96cd-9d2c81a4cd6c",
+ "file": "/home/thomas/OneDrive/org-roam/isomorphism.org",
+ "title": "Isomorphism"
+ },
+ {
+ "id": "82b954c4-7193-4a7f-aad0-f62f0ac16881",
+ "file": "/home/thomas/OneDrive/org-roam/20210606215454-dingen_meike.org",
+ "title": "Dingen Meike"
+ },
+ {
+ "id": "a8133c82-3286-4af7-9e59-e124f5f5dcc7",
+ "file": "/home/thomas/OneDrive/org-roam/20210606215454-dingen_meike.org",
+ "title": "\"Hollandse\" Rijst waar je je niet voor schaamt"
+ },
+ {
+ "id": "3f0d1d54-5653-4b06-bb64-7b1461a9d1f7",
+ "file": "/home/thomas/OneDrive/org-roam/20210412204350-fireship_analysis.org",
+ "title": "Fireship analysis"
+ },
+ {
+ "id": "0139e8db-0030-43b9-ac14-1eaf850a270c",
+ "file": "/home/thomas/OneDrive/org-roam/20210505155930-range_codomain.org",
+ "title": "Range/Codomain"
+ },
+ {
+ "id": "ac45b6a5-f72f-489c-b2e7-5a5ac1b0b61b",
+ "file": "/home/thomas/OneDrive/org-roam/20201105121011-maximimum_entropy_principle.org",
+ "title": "Maximimum Entropy Principle"
+ },
+ {
+ "id": "d06eff85-7065-41af-b0e4-bb0720f7d4ec",
+ "file": "/home/thomas/OneDrive/org-roam/20210204161139-you_can_only_generalize_if_you_have_sufficient_data.org",
+ "title": "you can only generalize if you have sufficient data"
+ },
+ {
+ "id": "80e95479-ebab-4e5a-bf1f-e56ba9d7cb7d",
+ "file": "/home/thomas/OneDrive/org-roam/20210403182734-open_neighbourhood.org",
+ "title": "Open neighbourhood"
+ },
+ {
+ "id": "45c7759a-0507-48c8-93d4-8a0e568faa1c",
+ "file": "/home/thomas/OneDrive/org-roam/20210106131334-chapter_idealizations_meta.org",
+ "title": "Chapter Idealizations (meta)"
+ },
+ {
+ "id": "59db0283-e476-4fc6-a687-fb3acd020f80",
+ "file": "/home/thomas/OneDrive/org-roam/earman2019.org",
+ "title": "Earman2019: The role of idealizations in the AharonovBohm effect"
+ },
+ {
+ "id": "8de1f04f-19ab-4e2e-93ae-592f3b98e0c5",
+ "file": "/home/thomas/OneDrive/org-roam/20210210143955-reconstruction_of_shech_2019s_argument.org",
+ "title": "reconstruction of Shech 2019s argument"
+ },
+ {
+ "id": "f257174f-e4a0-42f4-b455-0e2ba307c301",
+ "file": "/home/thomas/OneDrive/org-roam/20210416113423-complement.org",
+ "title": "Complement"
+ },
+ {
+ "id": "c1fb832a-c00d-48d5-8397-1cdd1f7617df",
+ "file": "/home/thomas/OneDrive/org-roam/20210223172322-aharonov_bohm_effect.org",
+ "title": "Aharonov Bohm Effect"
+ },
+ {
+ "id": "5441a486-c826-424d-a30a-e08b9208642b",
+ "file": "/home/thomas/OneDrive/org-roam/20210223170728-berry_phase.org",
+ "title": "Berry phase"
+ },
+ {
+ "id": "51a3a4c5-9019-4607-915a-05b1e5c02671",
+ "file": "/home/thomas/OneDrive/org-roam/20210114164133-de_dicto.org",
+ "title": "de dicto"
+ },
+ {
+ "id": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "file": "/home/thomas/OneDrive/org-roam/20210218152909-anyons.org",
+ "title": "Anyons"
+ },
+ {
+ "id": "c7854060-7add-4349-a045-6a63292bc255",
+ "file": "/home/thomas/OneDrive/org-roam/arovas1984.org",
+ "title": "Arovas1984: Fractional Statistics and the Quantum Hall Effect"
+ },
+ {
+ "id": "66fc979f-2e21-4469-8518-88a4aa19be9a",
+ "file": "/home/thomas/OneDrive/org-roam/20210505153349-equivalence_class.org",
+ "title": "Equivalence Class"
+ },
+ {
+ "id": "3a994964-7969-4297-a36c-13317886be47",
+ "file": "/home/thomas/OneDrive/org-roam/earlierthoughts.org",
+ "title": "Early draft on Phase Transitions for Ronnie and Guido"
+ },
+ {
+ "id": "a1bc1ded-7325-4610-85cb-93389f0cb798",
+ "file": "/home/thomas/OneDrive/org-roam/20210108162040-jote_meeting_notes.org",
+ "title": "JOTE meeting notes"
+ },
+ {
+ "id": "c1875006-1a91-4c5d-9f7b-a7427b3b7cba",
+ "file": "/home/thomas/OneDrive/org-roam/20210602231335-you_need_to_actively_choose_to_do_your_current_task_in_order_to_be_happy_and_perform.org",
+ "title": "You need to actively choose to do your current task in order to be happy and perform"
+ },
+ {
+ "id": "1780f5a9-7330-4491-be34-8f8f6e0e010c",
+ "file": "/home/thomas/OneDrive/org-roam/20210223164301-quantum_of_flux.org",
+ "title": "quantum of flux"
+ },
+ {
+ "id": "081e84fc-c850-43cb-af45-1cde2abb3802",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132327-have_an_end_of_day_shutdown_ritual.org",
+ "title": "have an end of day shutdown ritual"
+ },
+ {
+ "id": "e5db852b-a680-4f56-8a2d-cba2f13aecb4",
+ "file": "/home/thomas/OneDrive/org-roam/20201218175548-idealization_vs_approximation.org",
+ "title": "Idealization vs Approximation"
+ },
+ {
+ "id": "04906abc-d7bc-4c68-9da6-235e81c8e78c",
+ "file": "/home/thomas/OneDrive/org-roam/20210602233032-i_keep_forgetting_what_s_important.org",
+ "title": "I keep forgetting what's important"
+ },
+ {
+ "id": "12bf23b8-7c2f-439b-84f1-92807e5f93b3",
+ "file": "/home/thomas/OneDrive/org-roam/20210311183548-every_qh_wf_must_have_the_form_f_z_z1_zn_exp_sum_zi_2.org",
+ "title": "Every QH WF must have the form f_z(z1...zn)exp(-sum|zi|2)"
+ },
+ {
+ "id": "ac38176f-a082-4073-a084-f258b4db6efe",
+ "file": "/home/thomas/OneDrive/org-roam/20210309161743-is_the_neglection_of_electron_interactions_in_iqhe_justified.org",
+ "title": "is the neglection of electron interactions in IQHE justified?"
+ },
+ {
+ "id": "21800b37-489e-4ebb-b6ae-c81122a7c50d",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Shackel: Bertrand's Paradox and the Maximum Entropy Principle"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-1-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "1. Introduction"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-1-4",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Bertrand constructed his chord paradox to pose a challenge to the principle of indiffer- ence by showing that it led to inconsistent probabilities. Despite an extensive literature aimed at resolution, Bertrand’s chord paradox continues to undermine the principle of indifference (Shackel 2007)"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-1-5",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "In this paper I show that even under the most favourable assumptions allowing for that purchase, Bertrand’s chord para- dox undermines the maximum entropy principle"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-2-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "2. The maximum entropy principle"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-2-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Salmon’s Ascertainability criterion requires ‘that there be some method by which, in principle at least, we can ascertain values of probabilities’ (Salmon 1967:64)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-2-2",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Classical probabilists 1 such as Bernoulli (1713) and Laplace (1814/1995) and logical probabilists such as Keynes (1921/2014) have used as their method the principle of indifferenc"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-2-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Unfortunately the principle of indifference falls afoul of a number of paradoxes, most famous of which is Bertrand’s chord paradox."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-2-4",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Objective Bayesians such as Jaynes (2003), Rosenkrantz (1977) and Williamson (2010) have suggested that the maximum entropy principle can replace the principle of indifference."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-3-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "The maximum entropy principle has been applied to some of the paradoxes that trou- ble the principle of indifference and it has been claimed to resolve some of them."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-3-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "nowhere in the literature has there been an analysis of applying the maximum entropy principle to Bertrand’s paradox. By an analysis, I mean showing whether the mathematics of entropy, when applied to Ber- trand’s paradox, determines a unique probability function with maximum entropy. I demonstrate here that it does not."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-3-2",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "To put it crudely, absent this paper, for all we know the maximum entropy princi- ple might yet solve Bertrand’s chord paradox. This paper proves it does not."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-3-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Moreover, the course of the analysis exhibits a further problem for the maximum entropy principle: I pre- sent a new paradox of the chords that arises only for the maximum entropy principle."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-3-4",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "what kind of a problem is non-uniqueness for pro- ponents of the maximum entropy principle?"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-5-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "3. Bertrand’s Paradox"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-5-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "We trace at random a chord in a circle. What is the probability that it would be longer than the side of the inscribed equilateral triangle? (Bertrand 1888: 4)"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-6-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "As is well known, applying the principle of indiff,erence in three different ways gives three different answers for the probability of longer"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-6-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "for our analysis we need only the most fundamental features of the standard measure theoretic formulation of probability."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-7-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "4. The maximum entropy principle applied to Bertrand’s Paradox"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-7-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "he essential problem of Bertrand’s paradox for the principle of indifference is that the set of chords, C, lacks a measure of its own by which to define equi-probability for equal igno- rance over C; instead there is only an infinity of measures we might induce on C and no principled way of picking among them."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-8-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "The apparent virtue of applying the maximum entropy principle is having a way of choosing one over the other"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-8-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "For this to work requires that"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-8-2",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "5. Unknowable maximum entropy probability functions are not acceptable"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-8-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Bertrand’s paradox brings into view the danger that spaces without measures of their own pose to knowing the maximum entropy probability function."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-9-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "One route to knowing the maximum entropy probability function would be to evaluate entropies. Unfortunately, this is blocked by obstinate integrals leading to numerical intractability."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-9-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Numerical intractability, it might be objected, poses a merely practical problem. In principle, numerical evaluation is possible and the intractability is just a matter of it tak- ing a very long time to do the figuring."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-9-2",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "The problem is that to determine the maximum entropy principle in this way would require performing infi- nitely many numerical evaluations and this we cannot do."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-9-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "The other route we might take to knowing the maximum entropy probability function would be having a constructive existence proof of which one it is that does not depend on evaluating entropies."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-10-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Although these several points do not constitute a conclusive proof that (if there is one) the unique maximum entropy probability function for Bertrand’s paradox is unknowable, they are good reason to think that it is not."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-10-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "The nature of the problem here depends on whether the maximum entropy principle is taken to be a purely metaphysical principle or whether it is in part or wholly an epistemic principle."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-11-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "6. Either Bertrand’s paradox returns or we have a revenge paradox of the chords"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-11-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "There is an important difference between entropy for discrete and continuous event spaces: entropy can be unbounded for continuous distributions (more loosely put, can be infinite)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-11-2",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Given the lack of structure in C, pro- vided there is just one such for which the probability of longer > ½ there will be another that is its dual 30 giving the probability of longer < ½. That would immediately give rise to Bertrand’s paradox. So for this strategy to work would require that all the probability functions, P, for which entropy is unbounded give the probability of longer, P(L) = ½."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-11-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "Now consider the following events whose disjunction is the same as not being longer"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-12-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "The only way out of this is to exclude probability functions with unbounded entropies."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-12-2",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "7. Coda: collapse into the original Bertrand’s paradox"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-12-3",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "So now we exclude the induced probability functions on C with unbounded entropies. With this exclusion another problem comes into view: that although all probabilit y func- tions left have finite entropies the set of entropies need not have a maximum."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-13-0",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "8. Conclusion"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/ShackelN,RowbottomD__Bertrand's_Paradox_and_the_Maximum_Entropy_Principle.pdf-annot-13-1",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel.org",
+ "title": "I have shown that applying the maximum entropy principle to Bertrand’s paradox faces grave difficulties."
+ },
+ {
+ "id": "cc7d20ea-a909-4289-b7df-40721476648f",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190125-emacs_modes.org",
+ "title": "Emacs modes"
+ },
+ {
+ "id": "a5a35990-a76d-4822-aa70-6613c9f23616",
+ "file": "/home/thomas/OneDrive/org-roam/20210106121546-objects_and_concepts_share_similar_problems_of_definition.org",
+ "title": "Objects and concepts share similar problems of definition"
+ },
+ {
+ "id": "5013d755-484e-4490-ac06-b2103815566e",
+ "file": "/home/thomas/OneDrive/org-roam/20210430185211-transclusion_test.org",
+ "title": "Transclusion test"
+ },
+ {
+ "id": "69e2c052-8aeb-4b71-9b17-ba64de9f2427",
+ "file": "/home/thomas/OneDrive/org-roam/20210314212915-science_is_too_individual_focused.org",
+ "title": "Science Is Too Individual Focused"
+ },
+ {
+ "id": "ca415422-1727-4863-ac9c-da7f6a588331",
+ "file": "/home/thomas/OneDrive/org-roam/four_vector.org",
+ "title": "Four-vector"
+ },
+ {
+ "id": "c0ab3766-598e-41b5-8721-e659a2b3f3d1",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190252-doom_emacs_in_100_seconds.org",
+ "title": "Doom Emacs in 100 seconds"
+ },
+ {
+ "id": "475c6db1-e5a0-4ebb-8291-5454a9e6d12e",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160455-global_symmetry.org",
+ "title": "Global symmetry"
+ },
+ {
+ "id": "0f99888e-645f-4c9d-8468-1844dd4191fe",
+ "file": "/home/thomas/OneDrive/org-roam/on_the_explanation_for_quantum_statistics.org",
+ "title": "Saunders2006: On the explanation for quantum statistics"
+ },
+ {
+ "id": "1d52c1b9-6924-4272-9b33-a600b103240a",
+ "file": "/home/thomas/OneDrive/org-roam/20210223163548-landau_states_have_a_large_degeneracy.org",
+ "title": "Landau states have a large degeneracy"
+ },
+ {
+ "id": "14706a8f-09ac-470b-bb95-27623dca914e",
+ "file": "/home/thomas/OneDrive/org-roam/20210512232438-i_want_to_be_good_at_everything.org",
+ "title": "I want to be good at everything"
+ },
+ {
+ "id": "ca477b8a-f063-4ddf-8bfd-8d4a8d38de82",
+ "file": "/home/thomas/OneDrive/org-roam/20210209165113-dex_should_be_taken_every_four_hours_not_longer.org",
+ "title": "dex should be taken every four hours, not longer"
+ },
+ {
+ "id": "a702a4a0-1987-4af7-931e-c6db269186b4",
+ "file": "/home/thomas/OneDrive/org-roam/20210602235747-you_have_to_imagine_your_students_experience_in_order_to_teach_well.org",
+ "title": "You have to imagine your students' experience in order to teach well"
+ },
+ {
+ "id": "a2a03229-0b2e-4371-aa78-b3d58abd0530",
+ "file": "/home/thomas/OneDrive/org-roam/20210408185003-emacs_in_100_seconds.org",
+ "title": "Emacs in 100 seconds"
+ },
+ {
+ "id": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "file": "/home/thomas/OneDrive/org-roam/20210319115558-chapter_fqhe.org",
+ "title": "Chapter FQHE"
+ },
+ {
+ "id": "4ad6283e-a148-4176-abea-543ce6e3e921",
+ "file": "/home/thomas/OneDrive/org-roam/20201210134735-evaluation_launch.org",
+ "title": "evaluation launch"
+ },
+ {
+ "id": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "file": "/home/thomas/OneDrive/org-roam/20210223160810-derivation_of_landau_levels_for_qhe.org",
+ "title": "derivation of Landau levels for QHE"
+ },
+ {
+ "id": "6bdcb944-ee23-4a0f-94a8-79d196d035cf",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132414-make_a_scorecard_for_tracking_deep_work_hours.org",
+ "title": "make a scorecard for tracking deep work hours"
+ },
+ {
+ "id": "55aac369-0acc-401e-95d4-0c41e32a7abb",
+ "file": "/home/thomas/OneDrive/org-roam/einstein_summation_notation.org",
+ "title": "Einstein summation notation"
+ },
+ {
+ "id": "652b4828-23da-49ac-ba48-b43d84aeb36a",
+ "file": "/home/thomas/OneDrive/org-roam/20210204162914-talking_about_realism_directly_is_unproductive.org",
+ "title": "talking about realism directly is unproductive"
+ },
+ {
+ "id": "233cb335-bf1c-4a30-8c48-95cc20b560ee",
+ "file": "/home/thomas/OneDrive/org-roam/20210406221919-aaaaaaaaaaa.org",
+ "title": "AAAAAAAAAaa"
+ },
+ {
+ "id": "8fc72829-7ad9-4c8a-b400-229add0957bb",
+ "file": "/home/thomas/OneDrive/org-roam/20210218152105-classical_hall_effect.org",
+ "title": "classical hall effect"
+ },
+ {
+ "id": "db39298a-cd09-457c-b438-f369418c2be2",
+ "file": "/home/thomas/OneDrive/org-roam/20210223154511-lagrangian.org",
+ "title": "Lagrangian"
+ },
+ {
+ "id": "fa5f4b7f-e222-4c6e-94c5-c2008dff7d26",
+ "file": "/home/thomas/OneDrive/org-roam/20210505152606-relation.org",
+ "title": "Relation"
+ },
+ {
+ "id": "822397cd-4004-4cfe-ac87-8e1c9d2a9c28",
+ "file": "/home/thomas/OneDrive/org-roam/Don't read multiple self help books at once, do one a month.org",
+ "title": "Only read one self help book a month"
+ },
+ {
+ "id": "ca761542-373b-4dcb-8198-805513756a5f",
+ "file": "/home/thomas/OneDrive/org-roam/20201106233625-problems_of_mep.org",
+ "title": "Problems of MEP"
+ },
+ {
+ "id": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff",
+ "file": "/home/thomas/OneDrive/org-roam/20210125121853-warming_up_improves_immediate_performance.org",
+ "title": "Warming up improves immediate performance"
+ },
+ {
+ "id": "981201fc-c29a-4120-bf30-105110cd4a29",
+ "file": "/home/thomas/OneDrive/org-roam/20210513124338-monodromy_is_an_infinite_idealization_of_holonomy.org",
+ "title": "Monodromy is an infinite idealization of holonomy"
+ },
+ {
+ "id": "41a6a097-12e9-4a05-a6f6-f496fdf515ff",
+ "file": "/home/thomas/OneDrive/org-roam/20210317122807-poisson_brackets.org",
+ "title": "Poisson Brackets"
+ },
+ {
+ "id": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476",
+ "file": "/home/thomas/OneDrive/org-roam/20210402123014-the_configuration_space_explanation_chapter.org",
+ "title": "The configuration space explanation chapter"
+ },
+ {
+ "id": "77bd5fd3-4f1c-4b8c-a83e-ed8f386ae223",
+ "file": "/home/thomas/OneDrive/org-roam/20210218175112-tags_should_be_about_the_specific_object_of_the_note_to_be_useful.org",
+ "title": "tags should be about the specific object of the note to be useful"
+ },
+ {
+ "id": "50b9ed61-c160-435d-aa77-6ffb6cc7cd27",
+ "file": "/home/thomas/OneDrive/org-roam/20210319114521-the_adiabatic_theorem_might_not_be_an_inf_id_because_it_only_guarantees_something_that_might_happen_anyway.org",
+ "title": "The Adiabatic Theorem might not be an Inf Id because it only guarantees something that might happen anyway"
+ },
+ {
+ "id": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583",
+ "file": "/home/thomas/OneDrive/org-roam/20210219125447-the_integer_quantum_hall_effect_iqhe.org",
+ "title": "the Integer quantum hall effect (IQHE)"
+ },
+ {
+ "id": "6546f4b1-b038-4961-821a-7341495fae1a",
+ "file": "/home/thomas/OneDrive/org-roam/20210505153840-disjoint.org",
+ "title": "Disjoint"
+ },
+ {
+ "id": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "file": "/home/thomas/OneDrive/org-roam/so_2.org",
+ "title": "SO(2)"
+ },
+ {
+ "id": "d9479fe0-dc08-46b3-9454-b06cfd4ced2e",
+ "file": "/home/thomas/OneDrive/org-roam/20210314212657-open_science_should_be_faster.org",
+ "title": "Open Science Should Be Faster"
+ },
+ {
+ "id": "a368aa45-b284-4d99-a7d3-9ea1c69f6545",
+ "file": "/home/thomas/OneDrive/org-roam/the_quantized_hall_effect.org",
+ "title": "the_quantized_hall_effect.org"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/Physics/QHE/HalperinB_1986_The_Quantized_Hall_Effect.pdf-annot-3-0",
+ "file": "/home/thomas/OneDrive/org-roam/the_quantized_hall_effect.org",
+ "title": "The precision of the quantized Hall effect is particularly surprising because the hall resistance is normally very sensitive to small changes. Apparently doesnt care about specifics"
+ },
+ {
+ "id": "64a83699-3a12-4efb-88a2-4c148a0a4b1e",
+ "file": "/home/thomas/OneDrive/org-roam/fletcher2019a.org",
+ "title": "Fletcher2019a: Infinite idealizations in science: an introduction"
+ },
+ {
+ "id": "949cedd8-4c37-46cb-8439-aaa582647ef8",
+ "file": "/home/thomas/OneDrive/org-roam/20210506162317-topology.org",
+ "title": "Topology"
+ },
+ {
+ "id": "a4d107d5-467a-48b1-9385-e3348f07d049",
+ "file": "/home/thomas/OneDrive/org-roam/20210317122727-hamiltonian.org",
+ "title": "Hamiltonian"
+ },
+ {
+ "id": "1336db38-b50d-4165-8ef5-3f90f922c017",
+ "file": "/home/thomas/OneDrive/org-roam/20201108205138-paper_todos.org",
+ "title": "Paper todos"
+ },
+ {
+ "id": "d5074aea-3aab-4aa7-954c-7307e3907a17",
+ "file": "/home/thomas/OneDrive/org-roam/20210302160720-impurities_turn_many_quantum_states_from_extended_to_localized.org",
+ "title": "impurities turn many quantum states from extended to localized"
+ },
+ {
+ "id": "fc0a61f3-2c05-4c30-ac48-08b84203010a",
+ "file": "/home/thomas/OneDrive/org-roam/Introduction.org",
+ "title": "Introduction Chapter"
+ },
+ {
+ "id": "dc71d3f6-5c1b-47d0-9065-1cfdc2c15f6c",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190328-elisp_in_100_seconds.org",
+ "title": "Elisp in 100 seconds"
+ },
+ {
+ "id": "552da469-86ec-401c-9125-5aa40eb89fcf",
+ "file": "/home/thomas/OneDrive/org-roam/unitarity.org",
+ "title": "Unitarity"
+ },
+ {
+ "id": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c",
+ "file": "/home/thomas/OneDrive/org-roam/20210414134239-if_particles_cannot_be_closer_than_the_thickness_of_the_strip_the_configuration_space_is_approximately_2d.org",
+ "title": "If particles cannot be closer than the thickness of the strip, the configuration space is approximately 2D"
+ },
+ {
+ "id": "20f9ca30-46af-44e2-b84b-6296879e7798",
+ "file": "/home/thomas/OneDrive/org-roam/20210128151042-public_perception_of_science.org",
+ "title": "public perception of science"
+ },
+ {
+ "id": "c5da437c-60bb-45a3-86d5-718b14fd6733",
+ "file": "/home/thomas/OneDrive/org-roam/universal_explanation.org",
+ "title": "Universal Explanation"
+ },
+ {
+ "id": "004ae04b-45b8-4a7a-97b9-56bc3a1d93a8",
+ "file": "/home/thomas/OneDrive/org-roam/20210314213401-worthwile_should_not_mean_published_in_academia.org",
+ "title": "\"Worthwile\" should not mean \"Published\" in academia"
+ },
+ {
+ "id": "c0eb984b-d890-4625-884f-c5a1c0c3abd1",
+ "file": "/home/thomas/OneDrive/org-roam/20201105145021-bayes_theorem.org",
+ "title": "Bayes' Theorem"
+ },
+ {
+ "id": "a23060fd-3415-4bc2-9fb8-e62d1238a31e",
+ "file": "/home/thomas/OneDrive/org-roam/20210413183951-creating_an_image_is_a_necessary_condition_for_growth.org",
+ "title": "Creating an image is a necessary condition for growth"
+ },
+ {
+ "id": "a32f6a8b-c6b0-4ecf-ab0d-8657a4c3b295",
+ "file": "/home/thomas/OneDrive/org-roam/20201223151036-todos_until_christmas-archfaceThomas.org",
+ "title": "Todos until new year"
+ },
+ {
+ "id": "10c2686f-c1e0-48bd-bbb5-11d1c0e2d094",
+ "file": "/home/thomas/OneDrive/org-roam/20210212135133-the_role_of_a_teacher_is_to_facilitate_learning.org",
+ "title": "the role of a teacher is to facilitate learning"
+ },
+ {
+ "id": "a4e3963d-0fc5-474b-b8e6-c62d26e00227",
+ "file": "/home/thomas/OneDrive/org-roam/20210131112647-why_are_most_amab_leftist_youtubers_trans_nb.org",
+ "title": "why are most AMAB leftist youtubers trans/NB"
+ },
+ {
+ "id": "4995bc8a-18d9-48d8-93a3-abb275e317c6",
+ "file": "/home/thomas/OneDrive/org-roam/berry1997.org",
+ "title": "Berry1997: Indistinguishability for quantum particles: spin, statistics and the geometric phase"
+ },
+ {
+ "id": "80ec693a-141b-468b-a062-a29cb5a798b4",
+ "file": "/home/thomas/OneDrive/org-roam/representation.org",
+ "title": "Representation"
+ },
+ {
+ "id": "4e5c0118-6450-44e1-bddc-2d2abf1827a9",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1995.org",
+ "title": "Uffink1995: Can the maximum entropy principle be explained as a consistency requirement?"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_1995_Can_the_maximum_entropy_principle_be_explained_as_a_consistency_requirement.pdf-annot-3-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1995.org",
+ "title": "The extension of the principle to the continuum is discussed in section 5"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_1995_Can_the_maximum_entropy_principle_be_explained_as_a_consistency_requirement.pdf-annot-11-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1995.org",
+ "title": "5. The extension to the continuum: maximum relative entropy"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_1995_Can_the_maximum_entropy_principle_be_explained_as_a_consistency_requirement.pdf-annot-11-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1995.org",
+ "title": "First problem: N to infinity"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_1995_Can_the_maximum_entropy_principle_be_explained_as_a_consistency_requirement.pdf-annot-11-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1995.org",
+ "title": "But what if S=R?"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_1995_Can_the_maximum_entropy_principle_be_explained_as_a_consistency_requirement.pdf-annot-11-3",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1995.org",
+ "title": "These problems become more clear when we start from the discrete case rather than jump immediately to the continuous one."
+ },
+ {
+ "id": "8324ce84-88d2-49b3-ae02-30455b5bba71",
+ "file": "/home/thomas/OneDrive/org-roam/20210118165514-weekly_todos-archfaceThomas.org",
+ "title": "Weekly TODOs"
+ },
+ {
+ "id": "8d93c68e-6297-4ec0-b026-90fde4b43c53",
+ "file": "/home/thomas/OneDrive/org-roam/20210416112309-open_set.org",
+ "title": "Open set"
+ },
+ {
+ "id": "4c40816b-3a86-471c-b225-ac7b6f988833",
+ "file": "/home/thomas/OneDrive/org-roam/20210511133056-determinant.org",
+ "title": "Determinant"
+ },
+ {
+ "id": "dcf6aed7-3ff6-4a41-a5ca-150906314204",
+ "file": "/home/thomas/OneDrive/org-roam/20210302155828-physicist_see_real_systems_deviations_from_theory_instead_of_theoretical_models_as_idealizations_from_real_systems.org",
+ "title": "physicist see real systems deviations from theory, instead of theoretical models as idealizations from real systems"
+ },
+ {
+ "id": "41ef8c58-7d6d-413d-8f32-0e2b04c7949d",
+ "file": "/home/thomas/OneDrive/org-roam/20210312123300-quasi_things_have_charge_e_m.org",
+ "title": "Quasi-things Have Charge e/m"
+ },
+ {
+ "id": "4f246e5d-6e31-40a1-add1-41b49684152e",
+ "file": "/home/thomas/OneDrive/org-roam/Shackel2007.org",
+ "title": "Shackel2007: Bertrand's Paradox and the Principle of Indifference"
+ },
+ {
+ "id": "d8a6f6ea-1277-4912-9606-ca5d9f2e75fb",
+ "file": "/home/thomas/OneDrive/org-roam/Scruton 2001 - Kant. A Very Short Introduction.org",
+ "title": "Scruton: Kant: A Very Short Introduction"
+ },
+ {
+ "id": "bda19618-1ac9-40db-8242-6f705cd9295c",
+ "file": "/home/thomas/OneDrive/org-roam/20210128142648-oscu.org",
+ "title": "oscu"
+ },
+ {
+ "id": "50207fe2-18a6-451f-84b8-3d3e934535fa",
+ "file": "/home/thomas/OneDrive/org-roam/20210511130921-vector_bundle.org",
+ "title": "Vector Bundle"
+ },
+ {
+ "id": "2a8826d4-52ec-40da-85c7-76d3deda2ee7",
+ "file": "/home/thomas/OneDrive/org-roam/20210416113831-closed_set.org",
+ "title": "Closed set"
+ },
+ {
+ "id": "e3e6db29-ca5c-438e-9aa9-3ee8b79c230f",
+ "file": "/home/thomas/OneDrive/org-roam/unification_model_of_explanation.org",
+ "title": "Unification model of explanation"
+ },
+ {
+ "id": "05563633-dadc-49d6-a290-b4fe2ab83ec4",
+ "file": "/home/thomas/OneDrive/org-roam/20210403183347-universal_cover_ing_space.org",
+ "title": "Universal cover(ing space)"
+ },
+ {
+ "id": "1acf562b-77cf-458c-bfa1-e9497eae43bb",
+ "file": "/home/thomas/OneDrive/org-roam/20210125115724-grammar_lessons_are_next_to_useless.org",
+ "title": "Grammar lessons are next to useless"
+ },
+ {
+ "id": "ad12f4af-6660-4450-b6b6-28f79429f5fd",
+ "file": "/home/thomas/OneDrive/org-roam/20210314212337-effective_open_science_should_be_reusable_contributable_and_quickly_iterable.org",
+ "title": "Effective Open Science Should be reusable, contributable, quickly iterable and useful immediately"
+ },
+ {
+ "id": "4f189b39-db6c-40b6-89c2-e0294562fc45",
+ "file": "/home/thomas/OneDrive/org-roam/20201215153813-how_to_get_a_grip_on_idealizations.org",
+ "title": "How to get a grip on idealizations"
+ },
+ {
+ "id": "ec0921e8-d9b2-4a4b-a95a-b638970bc679",
+ "file": "/home/thomas/OneDrive/org-roam/20210507154830-flux.org",
+ "title": "Flux"
+ },
+ {
+ "id": "cfe64b55-5624-413f-809b-236e78eeb62c",
+ "file": "/home/thomas/OneDrive/org-roam/20210602233135-meditation_is_a_priority_checkin_ritual.org",
+ "title": "Meditation is a priority checkin ritual"
+ },
+ {
+ "id": "ab5bb5af-cdfc-43c3-9b5c-701c178ef8ba",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190847-dutch_language_in_100_seconds.org",
+ "title": "Dutch Language in 100 seconds"
+ },
+ {
+ "id": "15cba8d5-9f42-4169-9a0a-6d03a2a9a45e",
+ "file": "/home/thomas/OneDrive/org-roam/20210316144058-fermi_dirac_statistics.org",
+ "title": "Fermi-Dirac Statistics"
+ },
+ {
+ "id": "b784af73-3a94-4ee1-9d42-525a60dca48e",
+ "file": "/home/thomas/OneDrive/org-roam/20210602233431-still_water_is_clear_water.org",
+ "title": "Still water is clear water"
+ },
+ {
+ "id": "5e598557-43cc-48c3-ad9d-6b9c639214df",
+ "file": "/home/thomas/OneDrive/org-roam/fermi_surface.org",
+ "title": "Fermi Surface"
+ },
+ {
+ "id": "1e1a5607-0cfe-4ee7-b382-65f9567b13a7",
+ "file": "/home/thomas/OneDrive/org-roam/20210314211202-open_science_should_be_more_show_less_tell.org",
+ "title": "Open Science Should be more Show less Tell"
+ },
+ {
+ "id": "b476726a-277a-49aa-88e3-afe48b85fc14",
+ "file": "/home/thomas/OneDrive/org-roam/countable_infinity.org",
+ "title": "Countable infinity"
+ },
+ {
+ "id": "24f62351-13e0-4179-b628-6e6ae199b1da",
+ "file": "/home/thomas/OneDrive/org-roam/20210418193424-no_one_cares_what_you_think_by_so_convince_them_to_care.org",
+ "title": "No one cares what you think by, so convince them to care"
+ },
+ {
+ "id": "72b645ad-5de5-4f43-97dd-0d48dc6fdd7f",
+ "file": "/home/thomas/OneDrive/org-roam/20210204162559-an_explanation_is_whatever_scientists_call_an_explanation.org",
+ "title": "an explanation is whatever scientists call an explanation"
+ },
+ {
+ "id": "f63020a8-6939-49eb-a653-a4c00e2e46ae",
+ "file": "/home/thomas/OneDrive/org-roam/20210223172219-chern_number.org",
+ "title": "Chern number"
+ },
+ {
+ "id": "896697ec-2e29-446e-9caf-7919b3639bdb",
+ "file": "/home/thomas/OneDrive/org-roam/20210427162825-homotopy_equivalent_paths.org",
+ "title": "Homotopy equivalent paths"
+ },
+ {
+ "id": "32d4f910-5305-4e22-886f-5f823172aca3",
+ "file": "/home/thomas/OneDrive/org-roam/20210516212245-cover.org",
+ "title": "Cover"
+ },
+ {
+ "id": "2edc0c8e-4b45-438f-9b9f-288e2079925f",
+ "file": "/home/thomas/OneDrive/org-roam/20210311180855-the_explanation_of_fqhe_is_an_after_the_fact_justification_rather_than_a_straightforward_derivation.org",
+ "title": "The Explanation of FQHE is an After the Fact Justification Rather Than a Straightforward Derivation"
+ },
+ {
+ "id": "05e035ce-eea9-4100-a381-4bd44a34f730",
+ "file": "/home/thomas/OneDrive/org-roam/20201103134325-definition_of_phase.org",
+ "title": "Definition of Phase"
+ },
+ {
+ "id": "ebd64168-2b8a-48bf-a3fb-812a6ffadb2e",
+ "file": "/home/thomas/OneDrive/org-roam/shech2015b.org",
+ "title": "Shech2015b: Two Approaches to Fractional Statistics in the Quantum Hall Effect: Idealizations and the Curious Case of the Anyon"
+ },
+ {
+ "id": "56d07c1b-54da-4876-b7c5-6b7d0cc08fe2",
+ "file": "/home/thomas/OneDrive/org-roam/20210317122922-canonical_commutation_relation.org",
+ "title": "Canonical Commutation Relation"
+ },
+ {
+ "id": "207301aa-718d-417a-b3c0-103264d7a88f",
+ "file": "/home/thomas/OneDrive/org-roam/20210309112947-sorites_paradox.org",
+ "title": "sorites paradox"
+ },
+ {
+ "id": "22091e98-7210-44d1-8ad9-815573079ceb",
+ "file": "/home/thomas/OneDrive/org-roam/incubate.org",
+ "title": "Someday/maybes"
+ },
+ {
+ "id": "a9492a55-a71e-4840-9f23-75f8d5aa2123",
+ "file": "/home/thomas/OneDrive/org-roam/how to optimize emacs for roam.org",
+ "title": "Obsidian layout"
+ },
+ {
+ "id": "1aad6677-d406-41b6-aecf-be8c0b8e099f",
+ "file": "/home/thomas/OneDrive/org-roam/20210511133012-cross_product.org",
+ "title": "Cross-product"
+ },
+ {
+ "id": "c34664d1-f062-4080-ae76-6a2b8878b67a",
+ "file": "/home/thomas/OneDrive/org-roam/20210131113521-deterministic_gender_model.org",
+ "title": "deterministic gender model"
+ },
+ {
+ "id": "0851b27e-f96a-4c37-836b-2e867c6e6774",
+ "file": "/home/thomas/OneDrive/org-roam/20210511140650-anyonic_exchange_in_the_fqhe_is_not_the_same_as_ab_oscillation.org",
+ "title": "Anyonic exchange in the FQHE is not the same as AB oscillation"
+ },
+ {
+ "id": "b020cd25-a954-4ca5-b853-c435c26203ce",
+ "file": "/home/thomas/OneDrive/org-roam/20210408191034-lax_vs_tense_vowels_in_100_seconds.org",
+ "title": "Lax vs tense vowels in 100 seconds"
+ },
+ {
+ "id": "0a7d3f8a-e26c-4eaf-910f-38a3db8cca30",
+ "file": "/home/thomas/OneDrive/org-roam/20201224120820-the_problem_with_discrete_concepts_in_other_fields.org",
+ "title": "The problem with \"discrete concepts\" in other fields"
+ },
+ {
+ "id": "1c46b3c0-d744-4946-8e9b-656e9373a2aa",
+ "file": "/home/thomas/OneDrive/org-roam/20210403182843-even_cover.org",
+ "title": "Even cover"
+ },
+ {
+ "id": "d3fadbbc-a937-4505-a4e4-2acfe3c5e4ac",
+ "file": "/home/thomas/OneDrive/org-roam/reducing_thermodynamics_to_statistical_mechanics_the_case_of_entropy.org",
+ "title": "callenderReducingThermodynamicsStatistical1999a: Reducing Thermodynamics to Statistical Mechanics: The Case of Entropy"
+ },
+ {
+ "id": "2492a121-3365-4204-b8ad-6d89b38e5c3a",
+ "file": "/home/thomas/OneDrive/org-roam/agenda.org",
+ "title": "Agenda"
+ },
+ {
+ "id": "a9025da3-ae04-41d6-ab0d-fbff1bf35408",
+ "file": "/home/thomas/OneDrive/org-roam/20210223155459-general_hamiltonian_for_a_free_particle_in_a_magnetic_field.org",
+ "title": "general Hamiltonian for a free particle in a magnetic field"
+ },
+ {
+ "id": "e35ecfec-6fe4-4b28-a9c2-d2b0a598ac25",
+ "file": "/home/thomas/OneDrive/org-roam/20210602234248-worrying_about_peoples_opinion_is_not_empathy.org",
+ "title": "Worrying about peoples opinion is not empathy"
+ },
+ {
+ "id": "c3f7a16c-62fa-4b2d-bf47-8ec1832bd118",
+ "file": "/home/thomas/OneDrive/org-roam/20210223172736-experiment_showing_ab_effect.org",
+ "title": "Experiment showing AB effect"
+ },
+ {
+ "id": "51fff562-fc33-4090-95ea-538bb57fbdda",
+ "file": "/home/thomas/OneDrive/org-roam/20210309161558-fermions_cannot_be_in_the_same_quantum_state_pauli_exclusion_principle.org",
+ "title": "fermions cannot be in the same quantum state (Pauli Exclusion Principle)"
+ },
+ {
+ "id": "4b96a02d-61a4-41c7-a626-579bf60d2ae7",
+ "file": "/home/thomas/OneDrive/org-roam/20201231140947-the_hurdle_to_overcome_to_get_to_deep_work.org",
+ "title": "the hurdle to overcome to get to deep work"
+ },
+ {
+ "id": "f1273fc1-07d3-447d-98ee-b8d5b7debb70",
+ "file": "/home/thomas/OneDrive/org-roam/20210513124828-limit_of_the_cone_holonomy.org",
+ "title": "Limit of the cone holonomy"
+ },
+ {
+ "id": "c4cfc3fd-c497-44b6-80b3-a2ae6b35047b",
+ "file": "/home/thomas/OneDrive/org-roam/20210218153716-configuration_space_framework_for_identical_particles.org",
+ "title": "configuration space framework for identical particles"
+ },
+ {
+ "id": "05db1716-8384-4547-9c71-55f5e7277bf4",
+ "file": "/home/thomas/OneDrive/org-roam/20210506174216-path.org",
+ "title": "Path"
+ },
+ {
+ "id": "8038a56e-a471-4d0a-98bf-d3a6b73fbb52",
+ "file": "/home/thomas/OneDrive/org-roam/2021-01-08.org",
+ "title": "#+title: 8 january- 15 january"
+ },
+ {
+ "id": "a5c15858-5eca-4045-aa81-f5fd219ebfe5",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "Strevens2007: Why Explanations Lie: Idealization in Explanation"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-1-9",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "Why?"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-2-11",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "The explanatory use of causally inaccurate models is of special interest to an advocate of the causal approach to explanation."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-2-12",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "I believe that idealization has the power to make an explanation better, more enlightening, a greater contribution to scientific understanding not only as grasped by mere mortal minds, but in the abstract. The aim of this paper is to reconcile these two apparently inconsistent faiths,"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-2-13",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "Idealizations, I will argue, convey explanatorily essential information, that is, information that must be grasped in order to understand perfectly the phenomena to be explained."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-7-15",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "Thus the unificationist account of idealization appears to fall through: our best idealizations seem sometimes not to result in the greatest degree of unification."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-26-14",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "To generalize the discussion of Boyle’s law: the role of an idealization is to assert the explanatory irrelevance, that is, the failure to make a difference, of a salient causal factor."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-26-15",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "1. It is evidently false."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-27-11",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": ". The false claim fills out certain details left unspecified by the canonical explanatory model."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-27-12",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "3. The details are filled out in a certain way: the relevant parameters are assigned a zero, an infinite, or some other default value."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-27-13",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "The content of an idealized model, then, can be divided into two parts"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-27-14",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "1. An idealizing explanation is always better than its veridical counterpart,"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/StrevensM_2007_Why_Explanations_Lie_Idealization_in_Explanation.pdf-annot-32-7",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - Why Explanations Lie.org",
+ "title": "Third, in explanatory models in population biology, infinite populations are assumed. The effect of this assumption is to set the expected rate of genetic drift to zero. What such a model says is that drift, though present, made no difference to the feature of the gene pool to be explained, say, the extinction of an inferior trait."
+ },
+ {
+ "id": "fff6c214-ce92-4f4f-be7f-71eb21efff79",
+ "file": "/home/thomas/OneDrive/org-roam/20210311182300-the_laughlin_wavefunction.org",
+ "title": "The Laughlin Wavefunction"
+ },
+ {
+ "id": "025d3c91-e52f-4ccd-876f-3b5f8749c77d",
+ "file": "/home/thomas/OneDrive/org-roam/proper_time.org",
+ "title": "Proper time"
+ },
+ {
+ "id": "47841dc9-11ab-4565-9189-877bbabf774e",
+ "file": "/home/thomas/OneDrive/org-roam/20201105121148-motivation_for_mep.org",
+ "title": "Motivation for MEP"
+ },
+ {
+ "id": "78088a8e-cdbf-4f1f-8c86-0cc8d37b6afb",
+ "file": "/home/thomas/OneDrive/org-roam/20210223154859-general_lagrangian_for_free_particles_in_a_magnetic_field.org",
+ "title": "general Lagrangian for free particles in a magnetic field"
+ },
+ {
+ "id": "f0ce7198-1613-4572-8279-6d7742e767eb",
+ "file": "/home/thomas/OneDrive/org-roam/20201215160327-how_do_idealizations_explain.org",
+ "title": "How do idealizations explain"
+ },
+ {
+ "id": "f3c3745d-d8f5-43f3-8022-c021d1c4e5e9",
+ "file": "/home/thomas/OneDrive/org-roam/20210408191932-not_showing_your_face_makes_jumpcuts_not_jarring_at_all.org",
+ "title": "Not showing your face makes jumpcuts not jarring at all"
+ },
+ {
+ "id": "ec241de1-fcb9-4020-9004-350e7113f3bf",
+ "file": "/home/thomas/OneDrive/org-roam/20210314213638-how_to_define_useful_research_fruits.org",
+ "title": "How to Define Useful Research Fruits"
+ },
+ {
+ "id": "b8d3a7f4-19c1-44d9-b586-f01bcd6a44f1",
+ "file": "/home/thomas/OneDrive/org-roam/20210114135414-phd_cv.org",
+ "title": "phd_cv"
+ },
+ {
+ "id": "aab0c4d1-c818-42bc-bd77-6523be73f08f",
+ "file": "/home/thomas/OneDrive/org-roam/infinitesimal_idealization_easy_road_nominalism_and_fractional_quantum_statistics.org",
+ "title": "Shech2019: Infinitesimal idealization, easy road nominalism, and fractional quantum statistics"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/ShechE_2019_Infinitesimal_idealization,_easy_road_nominalism,_and_fractional_quantum_statistics.pdf-annot-16-3",
+ "file": "/home/thomas/OneDrive/org-roam/infinitesimal_idealization_easy_road_nominalism_and_fractional_quantum_statistics.org",
+ "title": "Given that we know of cases where the success of a theory is not due to the actual existence of the ideal objects it hypothesizes, but rather due to the way in which these convenient “myths” allow us to represent some facts about real objects, is this not enough to throw into question the claim that the existence of ideal continuous fluids should be considered as confirmed by the success of fluid dynamics?"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/ShechE_2019_Infinitesimal_idealization,_easy_road_nominalism,_and_fractional_quantum_statistics.pdf-annot-15-15",
+ "file": "/home/thomas/OneDrive/org-roam/infinitesimal_idealization_easy_road_nominalism_and_fractional_quantum_statistics.org",
+ "title": "Connecting with Leng’s (2010, 2012) notion of structural explanation we may say that (a) physical FQHE systems instantiated the structure corresponding to the config- uration space of identical particles in two-dimensions (since there is little to no motion in the third spatial direction), and that (b) the existence of fractional statistics is a con- sequence of two facts: (1) the phase factor characterizing quantum statistics is the one-dimensional unitary representation of the fundamental group of a system’s con- figuration space and (2) in two dimensions the fundamental group is the braid group. However, and importantly, it is no longer clear that we can dispense with reifying the explanatory mathematical structure. The reason is that, although FQHE systems are approximately two-dimensional and seem to manifest behavior consistent with frac- tional statistics, still, it is not the case that the mathematical structure is “approximately instantiated” as Leng’s account necessitates. The fundamental group of the configura- tion space of identical particles in approximately two dimensions is the same as that of three dimensions, the permutation group S N . In order to allow for fractional statistics we need the fundamental group to be the braid group B N , and this can only occur in exactly two dimensions. Yet, physical systems are not exactly two-dimensional. Thus, it cannot be said that a physical system “approximately instantiates” the braid group structure necessary for fractional statistics."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/ShechE_2019_Infinitesimal_idealization,_easy_road_nominalism,_and_fractional_quantum_statistics.pdf-annot-16-4",
+ "file": "/home/thomas/OneDrive/org-roam/infinitesimal_idealization_easy_road_nominalism_and_fractional_quantum_statistics.org",
+ "title": "It seems to me that, unless one can successfully apply a developed NSR account, such as the expounded version of Leng’s approach, then the default answers to such questions—in the context of the case study of anyons and fractional statistics that I consider—ought to be “no.”"
+ },
+ {
+ "id": "cca4542a-6f78-45e9-ad82-e273826c0c56",
+ "file": "/home/thomas/OneDrive/org-roam/20210506192634-org_roam_radio_targets.org",
+ "title": "org-roam-radio-targets"
+ },
+ {
+ "id": "0f8d8982-4c57-4aca-8803-bc6d0eef3e42",
+ "file": "/home/thomas/OneDrive/org-roam/20210319114828-the_discretization_of_quantum_states_is_the_biggest_discontinuity_in_physics.org",
+ "title": "The Discretization of Quantum States is the biggest discontinuity in physics"
+ },
+ {
+ "id": "e5951430-da06-4482-a7d3-7ac17c718d65",
+ "file": "/home/thomas/OneDrive/org-roam/20210513123625-monodromy.org",
+ "title": "Monodromy"
+ },
+ {
+ "id": "fa1238e2-29b2-4685-816a-ec82b5e49e46",
+ "file": "/home/thomas/OneDrive/org-roam/20210602234130-actively_imagining_what_other_people_think_will_lead_to_better_results_and_a_more_enjoyable_process.org",
+ "title": "Actively imagining what other people think will lead to better results and a more enjoyable process"
+ },
+ {
+ "id": "d3cb6e55-c56d-4933-a4d8-d778238b2248",
+ "file": "/home/thomas/OneDrive/org-roam/20210511131014-connection.org",
+ "title": "Connection"
+ },
+ {
+ "id": "15bca012-860d-4685-8ff4-bda2dbf2fca7",
+ "file": "/home/thomas/OneDrive/org-roam/20210507154728-terms_i_don_t_fully_get_yet.org",
+ "title": "Terms I don't fully get yet"
+ },
+ {
+ "id": "3f765d0a-12aa-4c1c-b7b0-6e633a7ebbfe",
+ "file": "/home/thomas/OneDrive/org-roam/20210403184843-closure_group.org",
+ "title": "Closure (group)"
+ },
+ {
+ "id": "e358c53a-eddc-46f4-b693-d4cc93d7210c",
+ "file": "/home/thomas/OneDrive/org-roam/20210330162807-physical_theories_must_be_globally_symmetric_and_can_be_locally_symmetric.org",
+ "title": "Physical theories must be globally symmetric and can be locally symmetric"
+ },
+ {
+ "id": "2e82330a-c348-43c7-bd93-213859d832c5",
+ "file": "/home/thomas/OneDrive/org-roam/20210413190911-simple_does_not_mean_easy.org",
+ "title": "Simple does not mean easy"
+ },
+ {
+ "id": "be531c4b-59b0-4392-a134-0da5828a7692",
+ "file": "/home/thomas/OneDrive/org-roam/20210125123111-switching_tasks_takes_more_time_than_you_think.org",
+ "title": "Switching tasks takes (more) time than you think"
+ },
+ {
+ "id": "bce603cd-3eea-4dbc-b188-153845a24e16",
+ "file": "/home/thomas/OneDrive/org-roam/20210223154027-landau_levels.org",
+ "title": "Landau levels"
+ },
+ {
+ "id": "ecb99e35-f821-48bc-84c9-2db2559d3bee",
+ "file": "/home/thomas/OneDrive/org-roam/20210330163455-local_internal_symmetries_are_not_directly_observable.org",
+ "title": "Local internal symmetries are not directly observable"
+ },
+ {
+ "id": "82518b1f-cfb4-4e5f-b47e-9e3ebc665115",
+ "file": "/home/thomas/OneDrive/org-roam/20210204161710-eia_needs_to_be_tackled_on_both_premise_1_and_2.org",
+ "title": "EIA needs to be tackled on both premise 1 and 2"
+ },
+ {
+ "id": "0b0dbc3b-2ac1-4005-868c-48241f61b80c",
+ "file": "/home/thomas/OneDrive/org-roam/20210316154419-you_must_think_more_than_you_want_to_but_less_than_you_fear_you_have_to.org",
+ "title": "You Must Think More Than You Want To, But Less Than You Fear You Have To"
+ },
+ {
+ "id": "3ca6c917-fb1a-48c9-80ff-228ba5f937a0",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190957-dutch_spelling_in_100_seconds.org",
+ "title": "Dutch Spelling in 100 seconds"
+ },
+ {
+ "id": "0e9ad6f0-a085-4a02-a889-d3ac0ceb907b",
+ "file": "/home/thomas/OneDrive/org-roam/20210309145524-writing_sucks_that_s_why_you_should_do_it.org",
+ "title": "writing sucks, that's why you should do it"
+ },
+ {
+ "id": "c84253b5-9a2c-4a6c-ac82-74d2888a4f57",
+ "file": "/home/thomas/OneDrive/org-roam/read_one_self_help_book_at_a_time.org",
+ "title": "Only read one self help book at a time"
+ },
+ {
+ "id": "37bfaecb-92e6-4cd7-9735-2b6c940c0e03",
+ "file": "/home/thomas/OneDrive/org-roam/20210309112810-infinite_idealizations_resemble_sorites_because_both_have_discontinuous_transitions.org",
+ "title": "Infinite idealizations resemble Sorites because both have discontinuous transitions"
+ },
+ {
+ "id": "5b5b1d93-8293-4d05-89b2-b0415c186d92",
+ "file": "/home/thomas/OneDrive/org-roam/20210114173706-results_of_daily_wittgenstein.org",
+ "title": "results of daily wittgenstein"
+ },
+ {
+ "id": "bfda1a66-cc3e-4992-b4a2-bdf59d17aa62",
+ "file": "/home/thomas/OneDrive/org-roam/don't think in terms of blame, but contribution.org",
+ "title": "don't think in terms of blame, but contribution"
+ },
+ {
+ "id": "c7c6e9b7-5cac-4733-8b14-cc323ea15142",
+ "file": "/home/thomas/OneDrive/org-roam/20210423164849-minutes_jote.org",
+ "title": "minutes jote"
+ },
+ {
+ "id": "5bca3bd1-1312-4977-82e9-c5068fde1d9b",
+ "file": "/home/thomas/OneDrive/org-roam/GTD.org",
+ "title": "Get Things Done with Emacs"
+ },
+ {
+ "id": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "file": "/home/thomas/OneDrive/org-roam/20210309144912-stuck_in_my_thesis_hub.org",
+ "title": "stuck in my thesis hub"
+ },
+ {
+ "id": "1be7a59b-6157-45db-8f67-4b242d4c84d0",
+ "file": "/home/thomas/OneDrive/org-roam/20210426104938-ronnie_and_guido_feedback_on_anyon_chapter.org",
+ "title": "Ronnie and Guido feedback on anyon chapter"
+ },
+ {
+ "id": "fd2450df-e046-4d9c-a350-2be198e7fd04",
+ "file": "/home/thomas/OneDrive/org-roam/20210511110305-holonomy.org",
+ "title": "Holonomy"
+ },
+ {
+ "id": "479d3088-01ee-4224-86e8-e7ada158f9fe",
+ "file": "/home/thomas/OneDrive/org-roam/20210218152830-fractional_quantum_statistics.org",
+ "title": "fractional quantum statistics"
+ },
+ {
+ "id": "78d1b656-ccea-4028-9813-0b449b2d8922",
+ "file": "/home/thomas/OneDrive/org-roam/20210223172138-berry_phase_example.org",
+ "title": "Berry phase example"
+ },
+ {
+ "id": "2d68e306-1028-4c93-89a6-479a2e82379d",
+ "file": "/home/thomas/OneDrive/org-roam/20210219115500-a_good_note_should_be_concise_future_text_oriented_and_your_own_words.org",
+ "title": "A good note should be concise, future text oriented, and your own words"
+ },
+ {
+ "id": "28fea2f6-4d0f-4e52-9301-dfc37b49d46d",
+ "file": "/home/thomas/OneDrive/org-roam/thouless1982.org",
+ "title": "Thouless1982: Quantized Hall Conductance in a Two-Dimensional Periodic Potential"
+ },
+ {
+ "id": "0448eeeb-d0dc-45ca-a850-caa8413b3640",
+ "file": "/home/thomas/OneDrive/org-roam/20210601145016-3d_quantum_hall_effect.org",
+ "title": "3D Quantum Hall Effect"
+ },
+ {
+ "id": "af079d12-b7c8-494d-945e-3b85299bd68f",
+ "file": "/home/thomas/OneDrive/org-roam/20210408192120-talk_quickly_but_avoid_etceteraing.org",
+ "title": "Talk quickly, but avoid etceteraing"
+ },
+ {
+ "id": "bb158d72-0b4b-4f9b-bd13-a0afb3ffbee3",
+ "file": "/home/thomas/OneDrive/org-roam/20210415141056-harvard_on_infinities.org",
+ "title": "Harvard on Infinities"
+ },
+ {
+ "id": "f5640b4e-737d-48e5-a8c0-512c284f986c",
+ "file": "/home/thomas/OneDrive/org-roam/20210223170018-symmetry_gauge.org",
+ "title": "symmetry gauge"
+ },
+ {
+ "id": "625136f8-9529-46ab-9f18-204fcca628df",
+ "file": "/home/thomas/OneDrive/org-roam/20210330145048-the_configuration_space_explanation_approach_requires_a_certain_stance_on_the_ontology_of_symmetries.org",
+ "title": "The configuration space explanation approach requires a certain stance on the ontology of symmetries"
+ },
+ {
+ "id": "84779137-ff6a-463e-82cd-741475be1140",
+ "file": "/home/thomas/OneDrive/org-roam/metric.org",
+ "title": "Metric"
+ },
+ {
+ "id": "08b939e1-be1c-4614-9a61-60fa2fd40c66",
+ "file": "/home/thomas/OneDrive/org-roam/causal_mechanical_explanation.org",
+ "title": "Causal-mechanical explanation"
+ },
+ {
+ "id": "f6d3d383-e00c-418f-bf97-ccb6c62a2414",
+ "file": "/home/thomas/OneDrive/org-roam/taking_thermodynamics_too_seriously.org",
+ "title": "Callender2001: Taking Thermodynamics Too Seriously"
+ },
+ {
+ "id": "39621947-ed87-43ad-86d6-14a5e4f2b8c2",
+ "file": "/home/thomas/OneDrive/org-roam/20210311184105-the_fqh_state_is_interpreted_as_a_plasma_to_allow_for_intuitions.org",
+ "title": "The FQH State Is Interpreted as a Plasma to Allow for Intuitions and Computation"
+ },
+ {
+ "id": "a0bc11b4-c385-4284-8c52-2c1e3cc031ed",
+ "file": "/home/thomas/OneDrive/org-roam/20210512232633-i_hate_feeling_left_out.org",
+ "title": "I hate feeling left out"
+ },
+ {
+ "id": "f42afdf5-004d-49d9-979f-86f01826c319",
+ "file": "/home/thomas/OneDrive/org-roam/20201207153157-something.org",
+ "title": "something"
+ },
+ {
+ "id": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "file": "/home/thomas/OneDrive/org-roam/20210302154345-impurities_cause_iqhe_plateaux.org",
+ "title": "impurities cause IQHE plateaux"
+ },
+ {
+ "id": "3a0c98e2-d00e-4199-80c8-5e19d0d30bb0",
+ "file": "/home/thomas/OneDrive/org-roam/20210602232823-retrievability_not_storage_capacity_is_what_makes_memory_useful.org",
+ "title": "Retrievability, not storage capacity, is what makes memory useful"
+ },
+ {
+ "id": "2e3c5d06-832e-4f7d-aa12-a8fbb9c4bdb3",
+ "file": "/home/thomas/OneDrive/org-roam/20210505161914-inverse_function.org",
+ "title": "Inverse function"
+ },
+ {
+ "id": "76e4a9a1-244c-4c89-b0b5-e67fdb452625",
+ "file": "/home/thomas/OneDrive/org-roam/20201210190916-tags_over_categories.org",
+ "title": "Tags over categories"
+ },
+ {
+ "id": "9bf1101b-fbba-4740-b101-7c98e9b0df41",
+ "file": "/home/thomas/OneDrive/org-roam/20210505162715-preimage.org",
+ "title": "Preimage"
+ },
+ {
+ "id": "a0465da7-e969-4033-a102-55905c99769a",
+ "file": "/home/thomas/OneDrive/org-roam/20210501110119-finding_a_rival_partner_is_the_quickest_way_to_get_better_at_something.org",
+ "title": "Finding a rival/partner is the quickest way to get better at something"
+ },
+ {
+ "id": "0638c5b6-5081-46c5-ac18-03133cef5786",
+ "file": "/home/thomas/OneDrive/org-roam/20210405145102-ibe_is_a_special_case_of_eia.org",
+ "title": "IBE is a special case of EIA"
+ },
+ {
+ "id": "6734d031-a55d-4428-99f9-16cd9525a8f7",
+ "file": "/home/thomas/OneDrive/org-roam/20210223161622-gauge_potential.org",
+ "title": "gauge potential"
+ },
+ {
+ "id": "f5e4542f-0c24-4f50-bdfc-5e6d39ab8001",
+ "file": "/home/thomas/OneDrive/org-roam/20210204155921-if_you_cant_loop_back_to_your_introduction_make_shit_up_in_your_conclusion.org",
+ "title": "if you cant loop back to your introduction, make shit up in your conclusion"
+ },
+ {
+ "id": "b9c034ae-c43c-488b-8c96-996789ac2695",
+ "file": "/home/thomas/OneDrive/org-roam/20210223141818-filling_factor.org",
+ "title": "filling factor"
+ },
+ {
+ "id": "b0c5254c-045f-4194-bb5c-022772f85a7a",
+ "file": "/home/thomas/OneDrive/org-roam/o_2.org",
+ "title": "O(2)"
+ },
+ {
+ "id": "592de697-f611-46b4-bf0e-7069b9d02683",
+ "file": "/home/thomas/OneDrive/org-roam/20210418193116-a_lot_of_academic_writing_is_obtuse_because_academics_have_not_learned_to_write_for_an_audience.org",
+ "title": "A lot of academic writing is obtuse because academics have not learned to write for an audience"
+ },
+ {
+ "id": "c1a2779f-73d4-491e-8d7b-02f04dd20776",
+ "file": "/home/thomas/OneDrive/org-roam/20210223162026-the_dimensions_of_the_hall_system_is_set_to_2_from_the_start.org",
+ "title": "The dimensions of the Hall system is set to 2 from the start"
+ },
+ {
+ "id": "013d6de0-7da7-4894-be91-ef3705945daa",
+ "file": "/home/thomas/OneDrive/org-roam/20210210141222-approximate_instantiation_as_an_argument_against_platonism.org",
+ "title": "approximate instantiation as an argument against Platonism"
+ },
+ {
+ "id": "42184757-79ca-41a2-bf68-435b2426dc7d",
+ "file": "/home/thomas/OneDrive/org-roam/20210408155038-presentation_open_source_jote.org",
+ "title": "Presentation Open Source JOTE"
+ },
+ {
+ "id": "02b6ff5c-6cae-468c-960b-6067c494c9d6",
+ "file": "/home/thomas/OneDrive/org-roam/20210511135143-quantum_hall_effects_show_broken_time_reversal_symmetry_which_is_interesting.org",
+ "title": "Quantum Hall effects show broken time-reversal symmetry, which is interesting"
+ },
+ {
+ "id": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "file": "/home/thomas/OneDrive/org-roam/20210407150939-structure_fqhe_anyon_chapter.org",
+ "title": "Structure FQHE/anyon chapter"
+ },
+ {
+ "id": "a3ef6468-2bf3-42c8-a90c-2e9bd5f22941",
+ "file": "/home/thomas/OneDrive/org-roam/20210218154017-braid_group.org",
+ "title": "braid group"
+ },
+ {
+ "id": "76a2711e-8e05-4058-9808-3cefeffce717",
+ "file": "/home/thomas/OneDrive/org-roam/20210405144616-eia_allows_us_to_verify_dn_premises.org",
+ "title": "EIA allows us to verify DN premises"
+ },
+ {
+ "id": "99fcdb29-67ed-4ce3-8258-64e7c3ab63e3",
+ "file": "/home/thomas/OneDrive/org-roam/James 1916 - Some Problems of Philosophy.org",
+ "title": "James1916: Some Problems of Philosophy"
+ },
+ {
+ "id": "313b3f11-4c94-43af-a5fc-5712f3c02e10",
+ "file": "/home/thomas/OneDrive/org-roam/20210311182119-the_laughlin_wf_only_applies_to_v_1_m.org",
+ "title": "the Laughlin WF only applies to v=1/m"
+ },
+ {
+ "id": "017be746-f4e9-4678-a67d-5fb8b255cd92",
+ "file": "/home/thomas/OneDrive/org-roam/20210403185137-associativity.org",
+ "title": "Associativity"
+ },
+ {
+ "id": "afbe098d-aaae-4a63-8f16-80e750363f54",
+ "file": "/home/thomas/OneDrive/org-roam/20210114172629-to_get_better_at_filtering_out_important_information_i_need_to_practice_deep_work.org",
+ "title": "To get better at filtering out important information, I need to practice Deep Work"
+ },
+ {
+ "id": "5ff6e7ef-717d-40b1-a4de-daf4d3ac038a",
+ "file": "/home/thomas/OneDrive/org-roam/20210319112842-you_might_be_able_to_improve_simultaneous_expertise_by_linking_them_more_strongly.org",
+ "title": "You might be able to improve simultaneous expertise by linking them more strongly"
+ },
+ {
+ "id": "4b5c6424-14de-4ac9-92ad-98c4881a1879",
+ "file": "/home/thomas/OneDrive/org-roam/20210520180604-on_computing_the_geometric_phase_in_the_fqhe.org",
+ "title": "On computing the geometric phase in the FQHE"
+ },
+ {
+ "id": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e",
+ "file": "/home/thomas/OneDrive/org-roam/20210218153905-fundamental_group.org",
+ "title": "fundamental group"
+ },
+ {
+ "id": "2723ec6f-1ac6-4e34-92c3-70549cd3b3cd",
+ "file": "/home/thomas/OneDrive/org-roam/20210421114258-inspirations.org",
+ "title": "Inspirations"
+ },
+ {
+ "id": "be8fce0d-6f12-44ac-81df-8f4a17cd8821",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160547-global_symmetries_are_invariant_over_spacetime.org",
+ "title": "Global symmetries are invariant over spacetime"
+ },
+ {
+ "id": "3a80df2a-77b4-4626-a9fe-933257549a07",
+ "file": "/home/thomas/OneDrive/org-roam/20201221131054-continuity_vs_vagueness.org",
+ "title": "Continuity vs. Vagueness"
+ },
+ {
+ "id": "043b108a-c253-48f1-904e-fa171e656c72",
+ "file": "/home/thomas/OneDrive/org-roam/20210117164945-steps_that_need_to_be_taken-archfaceThomas.org",
+ "title": "20210117164945-steps_that_need_to_be_taken-archfaceThomas.org"
+ },
+ {
+ "id": "6695b04e-7e0f-44b9-8402-266e5cc6ab02",
+ "file": "/home/thomas/OneDrive/org-roam/minkowski_spacetime.org",
+ "title": "Minkowski Spacetime"
+ },
+ {
+ "id": "938cd116-d01e-4f84-828e-cb0bce730afa",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Uffink2011: Subjective Probability and Statistical Physics"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-1-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "A first sense in which a quantity, quality, attribute, or predicate of a physical system (or event, or state) may be called objective is that it corresponds to a property of the object (or event, or state)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-2-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "However, one often also reads that the theorems of mathematics or logic are ‘objective,’ even though they do not refer to any concrete object at all. What seems to be intended in such cases is that they follow strictly from axioms and proof protocols, so that no one accepting these rules could dispute the validity of these results."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-2-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "By contrast, then, the predicate ‘subjective’ is used in this second sense for statements that do not have a rationally compelling justification."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-3-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Bernoulli’s view on the meaning of probability was more or less common to all later authors until and including Laplace, and is often called ‘classical."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-3-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Of course, this question, how to assign values to probabilities in a given state of knowledge, is the really hard one for the classical interpretation. In fact, there is only one obvious candidate for such a rule: the so-called Principle of Insufficient Reason (or Principle of Indifference)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-4-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "This principle is fraught with difficulty, and many authors have commented on its subtle and elusive meaning."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-6-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "However, Bernoulli’s Law of Large Numbers fails to deliver what Bernoulli might have hoped it would, namely, a method for assigning probabilities on the basis of observed data alone as an alternative to the Principle of Insufficient Reason"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-7-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "P ROBLEM : Given the number of times in which an unknown event has happened and failed: Required the chance that the probability of its happening in a single trial lies between any two degrees of probability that can be named. And he elucidated: By chance I mean the same as probability."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-10-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Today, the name of Bayes is often associated with the subjective view on probability. We have already seen that this subjective view was in fact much older, and explicitly stated by Bernoulli. In contrast, Bayes was much more vague and uncommitted about what he meant by ‘probability.’"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-10-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "3 Modern subjectivism: Ramsey and de Finetti"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-10-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "espouse a view of probability that makes no claim that all rational minds, in the possession of the same information, should agree upon their evaluation of probabilities. Rather, this view, sometimes called ‘personalist,’ holds that any system of beliefs that a person wishes to entertain, whether based on empirical information, expert opinion, or sheer prejudice, is equally allowed. Thus, there is no need for a principle like that of Insufficient Reason."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-11-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "De Finetti was a subjectivist of a more radical approach than Bayes or Bernoulli had ever been. He utterly rejected the notion of unknown probabilities, and hence the very basis of Bayes’ approach to the above problem."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-13-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "In de Finetti’s analysis, however, it is quite clear that a sequence of days on which I am either alive or dead would not be regarded as exchangeable. Thus, precisely because his theorem has a presupposition that may fail, the application of its result is more clearly restricted and delineated than in Bayes’ approach."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-13-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "4 Subjective probability in statistical physics"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-16-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "4.1 Boltzmann"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-16-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Boltzmann never championed a subjective view on probability."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-16-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "it is clear that Boltzmann had less patience with the classical, subjective, notion of probability than Maxwell. Indeed, one of the few instances in which he criticized Maxwell was precisely Maxwell’s (1867) appeal to Insuf- ficient Reason (Boltzmann 1872). For Boltzmann, probability was an objective quantity. However, this does not mean that he had a clear and consistent concept of probability"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-18-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "His major claim to fame is that he designed a principle to deal with import of observational data that is quite different from the Bayes–Laplace view, and generalizes the Principle of Insufficient Reason. Maximum-Entropy Principle ( MEP )"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-19-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "However, I would like to dwell on the worry whether the MEP is compatible with Bayesian procedures. The issue is subtle,"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-19-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "The problem is, in essence, where the constraint comes from or what it represents."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-19-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Extensions of this principle to the case where the number of possibilities are countably or uncountably infinite involve much more work, which I will skip in this context (see Uffink 1995 for details)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-21-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Now, while I agree with Jaynes that a sharp distinction between events and constraints is advisable, it is hard to reconcile this distinction with Jaynes’ own proposal in the example above to ‘interpret’ a statement about the occurrence of some event as a statement about a constraint."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-21-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "5 Discussion"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-21-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "The subjective view on probability in statistical physics has often been regarded as dangerous or unwanted precisely because it would introduce subjective ele- ments in an otherwise objective scientific theory."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-22-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Subjective interpreters like Jaynes have often stressed forcefully that a sub- jective view on probability in statistical physics means that this theory is no longer purely a traditional theory of physics"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-22-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "o, in contrast to Popper and Albert, I would argue that the subjective view in statistical physics is clearly a coherent and viable option. This is not to say that it is without internal problems."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-22-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "But apart from viability, one might also ask whether a subjective view on probability advances the theory of statistical physics in any waf"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-22-3",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "There is at least one issue where one might expect the subjective view to be helpful: ergodicity."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-22-4",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "Therefore, the Birkhoff–von Neumann Ergodic Theorem, which specifies under which conditions this equality holds, and generalizations of this theorem in ergodic theory, are often regarded as highly relevant in an objective approach"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-23-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "In contrast, adherents of the subjective view often take pride that their view has no such qualms. The motivation for adopting an ensemble, in this view, is not that it has any empirical relevance but rather that it adequately reflects our epistemic judgment about the system."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-23-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "However, the issue is not that simple."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-23-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "A more controversial issue in the question whether the subjective view may be superior to the objective view is Jaynes’ claim that his Maximum Entropy approach would yield an ‘almost unbelievably short’ proof of the Second Law of Thermodynamics"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-24-0",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "To me, the main weakness seems to be the reference to a supposed process of equilibration."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-24-1",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "To sum up, a subjective view on probability in statistical physics is clearly a viable view to take, when dealing with ensembles. But substantial issues within this approach remain: whether one takes a Bayesian, a de Finettian, or a Jaynesian approach on how to model the impact of empirical evidence."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-24-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "new problem. If all probability distributions over phase space are equally admissible because they all represent a possible state of mind for some rational agent, then how does one explain that statistical mechanics has such extraordi- nary success in reproducing, and sometimes even predicting, the properties of"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-1-2",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink2011.org",
+ "title": "ubjective attributes of an object thus seem to reside in the mind perceiving or contemplating the object rather than to be inherent in the object itself,"
+ },
+ {
+ "id": "96aec7c9-c31b-48da-9872-2690b057e7ca",
+ "file": "/home/thomas/OneDrive/org-roam/20210219125647-quantum_of_resistance.org",
+ "title": "quantum of resistance"
+ },
+ {
+ "id": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e",
+ "file": "/home/thomas/OneDrive/org-roam/20210403175539-group.org",
+ "title": "Group"
+ },
+ {
+ "id": "0b697698-9e37-4bd7-a833-5580e878925e",
+ "file": "/home/thomas/OneDrive/org-roam/20210119122414-idealizations_should_be_distinguished_by_outcome_not_by_operation.org",
+ "title": "idealizations should be distinguished by outcome, not by operation"
+ },
+ {
+ "id": "a12d8d0a-5036-4f17-b3e4-910afa0269fa",
+ "file": "/home/thomas/OneDrive/org-roam/20210114163638-supervaluationism.org",
+ "title": "supervaluationism"
+ },
+ {
+ "id": "d251fd60-bb9d-4eb1-a921-6b57980fd9e7",
+ "file": "/home/thomas/OneDrive/org-roam/20210212141329-being_right_is_much_less_important_than_being_cooperative.org",
+ "title": "Being right is much less important than being cooperative"
+ },
+ {
+ "id": "f9b6b3d9-46b8-4e98-92fc-581b25d8e397",
+ "file": "/home/thomas/OneDrive/org-roam/An_Idea_Of_My_Structure.org",
+ "title": "Specific Feedback Questions"
+ },
+ {
+ "id": "26cf4180-c383-462c-8a35-2698bc11003a",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Strevens2019a: The structure of asymptotic idealization"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-1-22",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "“asymptotic explanations” (Batterman 2002). Such idealizations, he claims dramatically, though they rest on infinities that do not exist in the physical world, are essential for explaining certain physical behaviors; they do this by revealing emergent qualitative features of the situation that dominate the relevant actual physics and so “constrain and largely determine” what happens, or at least those aspects of what happens that are to be explained."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-2-14",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "This essay attempts to make a contribution to the topic by posing the following question: is there any interesting difference between the rules that govern idealization in such canonical non-infinitary cases as frictionless planes and ideal gases, on the one hand, and Batterman’s asymptotic cases, on the other?"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-2-15",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "2 Simple idealization"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-2-16",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "These fictions [false representations in models] are called (at least when deliberate rather than inadvertent) idealizations."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-3-32",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "in addition to simplification: idealizations call attention to factors that are explanatorily irrelevant to the target phenomenon"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-3-33",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "I will introduce asymptotic idealization by contrasting it with what I will call sim- ple idealization."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-3-34",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "I say that a simple idealization notionally begins with a non-idealized model of the target phenomenon"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-3-35",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Now an idealization is made—the veridical model is altered in some way that makes it no longer veridical. In a simple idealization, this is achieved by the straightforward operation of setting some parameter or parameters in the model to non-actual values, often zero."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-20",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": ". If the idealization is a valid one, the new model is, like the old veridical model, a good model of the target phenomenon"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-21",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Further, the new model will do whatever idealized models are supposed to do: it will ease calculations, or it will effectively spotlight irrelevant factors."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-22",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "The salient characteristic of a simple idealization, then, is that a simple operation, namely, a change in the parameters of the veridical model, creates a new, partly fictional model that continues to model and indeed to explain the target phenomenon."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-23",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "In asymptotic idealization, by contrast, a fiction is introduced by taking some sort of limit."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-24",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "a limit is taken as that parameter approaches zero. In some cases, taking a limit in this way is merely a roundabout path to a destination that can be more easily reached by simple idealization."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-25",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Asymptotic idealization is an interesting proposition, then, only in those cases where a simple substitution cannot be performed, which is to say only in those cases where a veridical model for mathematical reasons falls apart or otherwise behaves badly at the limiting value."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-26",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Norton (2012) has recently argued, however, that in these “interesting” cases, an asymptotically derived structure cannot be regarded as a genuine explanatory model of the system in question"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-27",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "To assess Norton’s argument, we need a more precise understanding of asymp- totic idealizing explanation."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-4-28",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "to counter Norton and to affirm Batterman, showing that not all idealization is simple idealization."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-5-20",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "3 Population genetics and determinism"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-21",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "In order to “idealize away” drift simply, what is wanted is a parameter in such a probability distribution that can be set to zero (or some other value) to obtain a deterministic process"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-22",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "But there is, in general, no such parameter. There is no sim- ple idealization, then, that transforms a more realistic, hence stochastic, population genetics model (let alone a veridical model) into a deterministic model."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-23",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "One way forward is to build a deterministic model from scratch, and to rationalize the use of the model to explain by poinyinh out that its behavior closely tracks the behavior of the real system in the relevant aspects."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-24",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "This strategy is what Norton calls “approximation”"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-25",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "An alternative strategy employed by some population geneticists is, by contrast, explicitly asymptotic"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-26",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Deterministic models can be viewed as derived from more realistic models under the assumption that population size is infinite—since in an infinite population, there is no drift."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-27",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Drift cannot be set to zero directly, then, but it can zeroed indirectly by taking population size, another parameter in stochastic models, to be infinitely large."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-6-28",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "That may sound like a simple idealization. As I will show you in the next section, however, it is not: the population size in a stochastic model cannot be set to infinity, not even by allowing the structure of the model to creep up to infinity by way of a lim- iting process."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-7-19",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "4 Interpreting the infinite population idealization"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-9-19",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "when the population size becomes infinite, the structure over which the models assign probabilities disintegrates."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-9-20",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Relative frequencies (other than zero and one) are defined only for finite populations: if there are infinitely many As and infinitely many Bs, there is no determinate ratio of one to the other"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-9-21",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "In an infinite population, probability mathematicians therefore turn to limiting fre- quencies. But a limiting frequency is defined only relative to an ordering of outcomes"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-9-22",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Consequently, the infinite population idealization cannot be treated as a simple idealization in which the population is set to infinity. How, then, to understand it? There are three options:"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-9-23",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "3. The infinite population idealization is a successful idealization, but it is not a simple idealization."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-10-26",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Perhaps the least satisfying feature of this revisionary approach is its implication that no evolutionary events can be properly understood using a deterministic population genetics model—since such a construct is not itself a legitimate model of the system, but is rather only a mathematical heuristic to calculate what a certain legitimate model will predict."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-11-23",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "The first two interpretations of the infinite population idealization, then, are inad- equate. If my reading is correct, then population geneticists such as Gillespie and Edwards treat deterministic models as genuine models that can be used (when cir- cumstances are right) to explain real events."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-11-24",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "We must therefore embrace the third option presented above: the infinite population idealization is a genuine idealization, but not a simple idealization. It is an asymptotic idealization."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-11-25",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "5 Infinite populations as asymptotic extrapolations"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-11-26",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Simple idealization is achieved by a simple act of parameter substitution: the scientist takes the veridical model and alters the value of one or more parameters."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-12-20",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Asymptotic idealization is achieved by a more complex process that I will call asymp- totic extrapolation."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-12-21",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "First—of course—asymptotic extrapolation applied to a stochastic population genetics model should lead to a derministic model without being illogical."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-12-22",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Second, asymptotic extrapolation should go over and above simple idealization: it's not just simple idealization in disguise, as Norton things;"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-12-23",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Third, asymptotic extrapolation should be to Batterman's liking (I like this one the least)"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-12-24",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Fourth, the account of asymp- totic extrapolation ought to be compatible with just about any philosophical approach to explanation, idealization, or the nature of scientific models. (I dig this, we shouldn't favor a specific account of explanation)"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-12-25",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "And fifth, the operation should more or less capture the intuitive line of thought, associated with Fig. 1, that leads population geneticists to say that in infinite populations there is no drift. (so there is no option to say that what they're doing is wrong, how boring)"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-15-21",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "The question, then: in virtue of what ought we to regard such models as repre- senting the behavior of infinite populations? I propose a conventionalist answer: the assumption of infinitude is simply built in to the practice of asymptotic idealization."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-15-22",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Idealization, I suggest, is a rhetorical strategy to underline a fac- tor’s explanatory irrelevance."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/Idealizations_Proper/StrevensM_2019_The_structure_of_asymptotic_idealization.pdf-annot-16-14",
+ "file": "/home/thomas/OneDrive/org-roam/Strevens 2007 - The Structure of Asymptotic Idealization.org",
+ "title": "Mere fiction is, however, not always sufficient to alert the scientific community to an idealization—the falsehood might, after all, be an inadvertent error. There is a certain conventional code, therefore, for indicating deliberate idealizations: where possible, set the parameter in question, or some appropriately related parameter, to zero or infinity."
+ },
+ {
+ "id": "9b6689ee-0f75-41c3-836e-eedd79ff8a55",
+ "file": "/home/thomas/OneDrive/org-roam/20210419013917-predictions_are_one_of_the_clearer_products_of_academia.org",
+ "title": "Predictions are one of the clearer products of academia"
+ },
+ {
+ "id": "3fac15f8-0852-48db-a6c6-9c1389cf85c8",
+ "file": "/home/thomas/OneDrive/org-roam/20210114172629-how_to_get_better_at_filtering_out_important_information.org",
+ "title": "How to get better at filtering out important information"
+ },
+ {
+ "id": "5ef0b428-994c-4b5b-bf8f-c8b2491baf24",
+ "file": "/home/thomas/OneDrive/org-roam/20210302155202-impurities_break_the_degeneracy_of_the_landau_levels.org",
+ "title": "impurities break the degeneracy of the landau levels"
+ },
+ {
+ "id": "fa45cb8a-e6d2-4635-b106-7330b85ae749",
+ "file": "/home/thomas/OneDrive/org-roam/doom dream color scheme.org",
+ "title": "doom dream color scheme.org"
+ },
+ {
+ "id": "8f75ad04-3266-4fbc-8159-9a5b7532ccb4",
+ "file": "/home/thomas/OneDrive/org-roam/20210414155618-how_to_justify_particles_not_being_able_to_escape.org",
+ "title": "How to justify particles not being able to escape"
+ },
+ {
+ "id": "072542d6-2d83-41af-9495-aa46583c1ac9",
+ "file": "/home/thomas/OneDrive/org-roam/20210219122634-notes_do_not_have_to_be_original_thoughts_or_the_two_kinds_of_notes.org",
+ "title": "Notes do not have to be original thoughts, or 'the two kinds of notes'"
+ },
+ {
+ "id": "305bf122-f5a3-4b64-a465-1d24d54b693c",
+ "file": "/home/thomas/OneDrive/org-roam/20210330144824-attack_shech_s_cf_approach_by_showing_his_commitments_or_by_defending_my_premise.org",
+ "title": "Attack Shech's CF approach by showing his commitments, or by defending my premise"
+ },
+ {
+ "id": "fabbeef8-31fe-4144-860f-f01a4ee4aaf1",
+ "file": "/home/thomas/OneDrive/org-roam/20210316151605-the_quantum_statistics_of_a_particle_are_determined_by_the_1d_representation_of_its_fundamental_group.org",
+ "title": "The Quantum Statistics of a Particle are Determined by the 1D representation of its Fundamental Group"
+ },
+ {
+ "id": "55712cb2-9e39-44e3-b5a7-ad610f673b4d",
+ "file": "/home/thomas/OneDrive/org-roam/20210115131532-jote_marketing.org",
+ "title": "JOTE Marketing"
+ },
+ {
+ "id": "761df6b4-1623-47aa-a996-6e6d50ac0e8e",
+ "file": "/home/thomas/OneDrive/org-roam/20210416112750-boundary_points.org",
+ "title": "Boundary points"
+ },
+ {
+ "id": "5c4fd471-7b3f-46c0-9f65-0124e05e98bf",
+ "file": "/home/thomas/OneDrive/org-roam/Kadanoff.org",
+ "title": "Statistical physics: Statics, dynamics and renormalization"
+ },
+ {
+ "id": "f4e81ed9-51d5-4767-b920-6f983e58ca96",
+ "file": "/home/thomas/OneDrive/org-roam/20210602235639-imaging_the_experience_of_your_partner_makes_you_better_at_sex.org",
+ "title": "Imaging the experience of your partner makes you better at sex"
+ },
+ {
+ "id": "8e6fb4f6-eff9-449f-9ffb-9461e9598125",
+ "file": "/home/thomas/OneDrive/org-roam/20201218154917-big_notes.org",
+ "title": "Big notes"
+ },
+ {
+ "id": "82421513-2120-423d-8ab4-0c43067b6351",
+ "file": "/home/thomas/OneDrive/org-roam/Sober 1980 - Evolution, Population Thinking, and Essentialism.org",
+ "title": "Sober1980: Evolution, Population Thinking, and Essentialism"
+ },
+ {
+ "id": "a74a30a1-8019-4c11-a537-216fa938d638",
+ "file": "/home/thomas/OneDrive/org-roam/20201218181839-what_properties_are_relevant_when_discussing_conflicting_models.org",
+ "title": "what properties are relevant when discussing conflicting models"
+ },
+ {
+ "id": "8ccaf75e-109d-49f9-9137-a6009be595f3",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg2011.org",
+ "title": "Frigg2011: Entropy - A Guide for the Perplexed"
+ },
+ {
+ "id": "a53911c6-5516-4467-8c9c-e3b078acdb4c",
+ "file": "/home/thomas/OneDrive/org-roam/20210505175610-neighborhood.org",
+ "title": "Neighborhood"
+ },
+ {
+ "id": "c159137f-8cbc-4318-aba2-d46bc1ed1efd",
+ "file": "/home/thomas/OneDrive/org-roam/20210501105825-cleaning_makes_you_more_focused_as_there_are_less_unnecessary_distractions_around.org",
+ "title": "Cleaning makes you more focused, as there are less unnecessary distractions around"
+ },
+ {
+ "id": "905665b3-dcf5-4c1e-99e6-86831cc228a0",
+ "file": "/home/thomas/OneDrive/org-roam/20210505152706-cartesian_product.org",
+ "title": "Cartesian Product"
+ },
+ {
+ "id": "4d995fff-8489-4b23-b73a-545f6b5c5055",
+ "file": "/home/thomas/OneDrive/org-roam/20201211114726-thought_experiments.org",
+ "title": "thought experiments?"
+ },
+ {
+ "id": "87f8854f-0fbb-4e29-b024-e1049ffc4e27",
+ "file": "/home/thomas/OneDrive/org-roam/20210131114339-gender_height_thought_experiment.org",
+ "title": "gender height thought experiment"
+ },
+ {
+ "id": "a5805690-630c-4146-a677-ce8b3ba12700",
+ "file": "/home/thomas/OneDrive/org-roam/20210505154117-empty_set.org",
+ "title": "Empty set"
+ },
+ {
+ "id": "273c7d2a-e23c-4991-b680-6af3cb1d9162",
+ "file": "/home/thomas/OneDrive/org-roam/20210528160149-outline_anyons.tmp6aVMYQ.org",
+ "title": "Outline Anyons bad"
+ },
+ {
+ "id": "96755e37-c423-453f-ab1b-1581f557aff0",
+ "file": "/home/thomas/OneDrive/org-roam/20210316162136-force_open_science_through_academic_copyleft_licences.org",
+ "title": "Force Open Science Through Academic CopyLeft Licences"
+ },
+ {
+ "id": "53544d19-a9ac-4e60-ae44-d0278698d130",
+ "file": "/home/thomas/OneDrive/org-roam/20210218154202-the_fundamental_group_of_2d_space_for_identical_particles_is_the_braid_group.org",
+ "title": "the fundamental group of 2D space for identical particles is the braid group"
+ },
+ {
+ "id": "965ea284-5b1b-41f0-900b-9611b1c0f897",
+ "file": "/home/thomas/OneDrive/org-roam/Shimony1985.org",
+ "title": "Shimony1985: The status of the principle of maximum entropy"
+ },
+ {
+ "id": "71b7fa31-7712-4a3a-a3ff-825298ed86cd",
+ "file": "/home/thomas/OneDrive/org-roam/20210511111338-parallel_transport.org",
+ "title": "Parallel transport"
+ },
+ {
+ "id": "dd6f3089-995d-4354-9140-fb6e4875a294",
+ "file": "/home/thomas/OneDrive/org-roam/20210501110537-i_hate_losing_when_i_think_i_can_win.org",
+ "title": "I hate losing when I think I can win"
+ },
+ {
+ "id": "e43d28d7-eac9-46ad-9214-038615fb7a05",
+ "file": "/home/thomas/OneDrive/org-roam/Boyd 1991 - Realism, Anti-Foundationalism and the enthusiasm for natural kinds.org",
+ "title": "Boyd1991: Realism, anti-foundationalism and the enthusiasm for natural kinds"
+ },
+ {
+ "id": "cec627c3-5d81-44ed-9fb2-26742662d7cb",
+ "file": "/home/thomas/OneDrive/org-roam/20210204162417-pragmatic_explanations_cannot_lead_to_platonic_conclusions.org",
+ "title": "pragmatic explanations cannot lead to platonic conclusions"
+ },
+ {
+ "id": "8e277bff-8677-4c12-aafa-88d819291ff3",
+ "file": "/home/thomas/OneDrive/org-roam/concepts_and_continuity_onto_epistemology_in_william_james.org",
+ "title": "Duvernoy2015: `Concepts' and Continuity: Onto-Epistemology in William James"
+ },
+ {
+ "id": "02e9671c-5b26-41de-9adb-395e46900d6a",
+ "file": "/home/thomas/OneDrive/org-roam/20210512232004-i_can_juggle_5_projects_at_the_most.org",
+ "title": "I can juggle 5 projects at the most"
+ },
+ {
+ "id": "a4e0561b-4adb-473c-9d35-8cb29c429c96",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160309-external_symmetry.org",
+ "title": "External Symmetry"
+ },
+ {
+ "id": "f56aa075-d63a-41f7-b4dd-f3d6e84c4794",
+ "file": "/home/thomas/OneDrive/org-roam/emergence_and_mechanism_in_the_fractional_quantum_hall_effect.org",
+ "title": "Bain2016: Emergence and mechanism in the fractional quantum Hall effect"
+ },
+ {
+ "id": "b6fe9876-1fa4-43b5-b2d5-471733531aac",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190539-org_roam_in_100_seconds.org",
+ "title": "org-roam in 100 seconds"
+ },
+ {
+ "id": "e9b44c4b-4aa1-40e9-b52b-064df8e159a5",
+ "file": "/home/thomas/OneDrive/org-roam/20201103124132-sm_essay_3.org",
+ "title": "SM Essay 3"
+ },
+ {
+ "id": "ec2782b6-bd0d-46b2-a01f-9fe2f38f5c8c",
+ "file": "/home/thomas/OneDrive/org-roam/actionable.org",
+ "title": "actionable.org"
+ },
+ {
+ "id": "6221cc53-b4ae-46a6-8988-daf3830a628e",
+ "file": "/home/thomas/OneDrive/org-roam/20210421144503-lwf_hole.org",
+ "title": "LWF hole"
+ },
+ {
+ "id": "c615103d-1e0a-4b27-917c-70d935e267a6",
+ "file": "/home/thomas/OneDrive/org-roam/20210505160649-injective.org",
+ "title": "Injective / one-to-one"
+ },
+ {
+ "id": "aaac0977-9de1-4e8e-a921-53a1419430a7",
+ "file": "/home/thomas/OneDrive/org-roam/pages/contents.org",
+ "title": "What's **Contents**?"
+ },
+ {
+ "id": "f7163c66-dc73-4cd2-9599-221492797e78",
+ "file": "/home/thomas/OneDrive/org-roam/Uffink1996.org",
+ "title": "Uffink1996: The constraint rule of the maximum entropy principle"
+ },
+ {
+ "id": "8bc70aa3-afcb-422f-a92c-8b06f562df24",
+ "file": "/home/thomas/OneDrive/org-roam/20210312121728-the_fqh_plasma_is_liquid_for_m_70_and_solid_above.org",
+ "title": "The FQH \"Plasma\" Is Liquid for m<70 and Solid Above"
+ },
+ {
+ "id": "1e91a98f-e6c1-4072-b9e2-1a35cfb68cb8",
+ "file": "/home/thomas/OneDrive/org-roam/what_is_mathematics_and_what_should_it_be.org",
+ "title": "what_is_mathematics_and_what_should_it_be.org"
+ },
+ {
+ "id": "66d70402-8e8d-4284-a65b-6c621a766e52",
+ "file": "/home/thomas/OneDrive/org-roam/20210128151146-marketing_is_hard.org",
+ "title": "Marketing is hard"
+ },
+ {
+ "id": "b92ab975-c5e1-44e4-b0dd-bf9a9d92d218",
+ "file": "/home/thomas/OneDrive/org-roam/20210118211516-three_categories_for_thinking_of_tags_broad_specific_and_type.org",
+ "title": "three categories for thinking of tags, broad, specific, and type"
+ },
+ {
+ "id": "2f096a65-ca7b-445b-9d83-44f33953f9c9",
+ "file": "/home/thomas/OneDrive/org-roam/how_to_take_smart_notes_one_simple_technique_to_boost_writing_learning_and_thinking_for_students_academics_and_nonfiction_book_writers.org",
+ "title": "Ahrens2017: How to Take Smart Notes: One Simple Technique to Boost Writing, Learning and Thinking for Students, Academics and Nonfiction Book Writers"
+ },
+ {
+ "id": "../HPS/Thesis/Papers/Self_help/AhrensS_2017_How_to_Take_Smart_Notes_One_Simple_Technique_to_Boost_Writing,_Learning_and_Thinking_–_for_Students,_Academics_and_Nonfiction_Book_Writers.pdf-annot-12-0",
+ "file": "/home/thomas/OneDrive/org-roam/how_to_take_smart_notes_one_simple_technique_to_boost_writing_learning_and_thinking_for_students_academics_and_nonfiction_book_writers.org",
+ "title": "1 Everything You Need to Know"
+ },
+ {
+ "id": "ef266837-dfb6-4cb7-b21c-28065c4457c9",
+ "file": "/home/thomas/OneDrive/org-roam/somethign.org",
+ "title": "Zeh2010: Quantum Discreteness is an Illusion"
+ },
+ {
+ "id": "d6c7efd2-014f-4692-9538-f3569e5283d3",
+ "file": "/home/thomas/OneDrive/org-roam/20201105155943-shannon_entropy.org",
+ "title": "Shannon Entropy"
+ },
+ {
+ "id": "82251b8e-2856-490d-82e2-de0da38f71d8",
+ "file": "/home/thomas/OneDrive/org-roam/20210501110647-i_love_underdogs.org",
+ "title": "I love underdogs"
+ },
+ {
+ "id": "a283fa45-22fc-4aec-b5a1-ac6c0af9950c",
+ "file": "/home/thomas/OneDrive/org-roam/20210311190300-i_will_work_well_if_i_take_my_meds_and_block_out_everything_for_an_hour.org",
+ "title": "I will work well if I take my meds and block out everything for an hour"
+ },
+ {
+ "id": "e77cb6cb-9224-457a-9d90-93f5b901f4de",
+ "file": "/home/thomas/OneDrive/org-roam/20201222192309-meeting_docenten.org",
+ "title": "Meeting Docenten"
+ },
+ {
+ "id": "0facab0b-4652-478e-962a-afb8cf9818bb",
+ "file": "/home/thomas/OneDrive/org-roam/20210505163129-continuity_function.org",
+ "title": "Continuity (function)"
+ },
+ {
+ "id": "2562a804-ec65-45e4-bae7-be73e0980e97",
+ "file": "/home/thomas/OneDrive/org-roam/20210317123047-harmonic_oscillator.org",
+ "title": "Harmonic Oscillator"
+ },
+ {
+ "id": "b93fa016-999a-4f1a-a471-8c631db1879a",
+ "file": "/home/thomas/OneDrive/org-roam/20210330165010-the_deductive_nomological_model_of_explanation.org",
+ "title": "The deductive-nomological model of explanation"
+ },
+ {
+ "id": "2fa90488-38aa-478f-bc3a-2290fb9def10",
+ "file": "/home/thomas/OneDrive/org-roam/20210219125155-the_fractional_quantum_hall_effect_fqhe.org",
+ "title": "the Fractional quantum hall effect (FQHE)"
+ },
+ {
+ "id": "480b61a1-987c-4dfd-8933-57b9613868bd",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132258-set_an_endpoint_for_working_everyday-archfaceThomas.org",
+ "title": "set an endpoint for working everyday"
+ },
+ {
+ "id": "196a4e47-9e68-4022-afee-85dcc611172d",
+ "file": "/home/thomas/OneDrive/org-roam/20210316153041-thin_conducting_slab_and_strong_magnetic_field_cause_undisentangalable_worldlines.org",
+ "title": "Thin conducting slab and strong magnetic field cause undisentangalable worldlines"
+ },
+ {
+ "id": "9a102d0f-bbd5-421d-af39-854eb34cb8a3",
+ "file": "/home/thomas/OneDrive/org-roam/20210606144410-critique_of_the_configuration_space_explanation.org",
+ "title": "Critique of the configuration space explanation"
+ },
+ {
+ "id": "78ecef7c-f9d9-4384-b6dc-7a5031414fff",
+ "file": "/home/thomas/OneDrive/org-roam/20210330125526-symmetry_arguments_are_more_interesting_than_symmetry_properties.org",
+ "title": "Symmetry arguments are more interesting than symmetry properties"
+ },
+ {
+ "id": "b77047a2-24b9-4b2b-8891-e6b45c4e43fa",
+ "file": "/home/thomas/OneDrive/org-roam/20210413190503-telling_people_the_intended_result_is_not_useful_advice.org",
+ "title": "Telling people the intended result is not useful advice"
+ },
+ {
+ "id": "387f8c62-c2ce-422e-b43e-d5ba4d66f05b",
+ "file": "/home/thomas/OneDrive/org-roam/20201105133921-principle_of_insufficient_reason.org",
+ "title": "Principle of Insufficient Reason"
+ },
+ {
+ "id": "4662474c-94fb-4b53-b00a-8d3dccadb01c",
+ "file": "/home/thomas/OneDrive/org-roam/pinker2015.org",
+ "title": "Pinker2015: The Sense of Style: The Thinking Person's Guide to Writing in the 21st Century"
+ },
+ {
+ "id": "17e6b417-96b9-4f5c-9cc1-e9acbfbfe2ce",
+ "file": "/home/thomas/OneDrive/org-roam/What is a thought_.org",
+ "title": "What is a thought_.org"
+ },
+ {
+ "id": "1d2d3aac-4dcf-4533-9358-f099a69878af",
+ "file": "/home/thomas/OneDrive/org-roam/20210223151818-spin_is_often_neglected_in_qhe_descriptions.org",
+ "title": "spin is often neglected in QHE descriptions"
+ },
+ {
+ "id": "c18acba0-88cd-48c2-bfa7-755bb15bee31",
+ "file": "/home/thomas/OneDrive/org-roam/20210330155645-gauge_symmetry.org",
+ "title": "Gauge symmetry"
+ },
+ {
+ "id": "77500c70-6cfc-44f6-b343-e950f2cb5f95",
+ "file": "/home/thomas/OneDrive/org-roam/good tweets.org",
+ "title": "good tweets.org"
+ },
+ {
+ "id": "1959e9a1-8e14-4ce7-981b-b04ea9d98bff",
+ "file": "/home/thomas/OneDrive/org-roam/special_relativity.org",
+ "title": "Special Relativity"
+ },
+ {
+ "id": "b502892a-411c-4fa7-a88c-7141b640d0e7",
+ "file": "/home/thomas/OneDrive/org-roam/20210223142404-the_filling_factor_is_integer_by_definition_because_quantum_of_resistance_is_defined_by_qh_experiments.org",
+ "title": "The Filling Factor Is Integer by Definition Because Quantum of Resistance is Defined by QH experiments"
+ },
+ {
+ "id": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "file": "/home/thomas/OneDrive/org-roam/20210125120926-warm_up_effectively.org",
+ "title": "warm up effectively"
+ },
+ {
+ "id": "d7a33815-5514-4e35-9321-fadd445f2683",
+ "file": "/home/thomas/OneDrive/org-roam/latex.org",
+ "title": "Latex"
+ },
+ {
+ "id": "91904bdf-bd1d-40d7-9c59-7c900c1cad68",
+ "file": "/home/thomas/OneDrive/org-roam/20210213142841-horse_paper_notes.org",
+ "title": "Horse paper notes"
+ },
+ {
+ "id": "0035acdd-b286-4942-a440-30b854b236ab",
+ "file": "/home/thomas/OneDrive/org-roam/20210501111956-org_roam_server_todos.org",
+ "title": "org-roam-server todos"
+ },
+ {
+ "id": "fc6c2fbc-08ff-4692-95a7-69d1cdff4c6c",
+ "file": "/home/thomas/OneDrive/org-roam/projects.org",
+ "title": "Projects"
+ },
+ {
+ "id": "8bbe288c-6531-49b4-b9be-8856bf55aa32",
+ "file": "/home/thomas/OneDrive/org-roam/20210125131100-one_thought_per_note.org",
+ "title": "one thought per note"
+ },
+ {
+ "id": "d088307e-61f8-4bfd-8417-62f19d068767",
+ "file": "/home/thomas/OneDrive/org-roam/I WANT TO BE GOOD AT EVERYTHING.org",
+ "title": "DESIGN"
+ },
+ {
+ "id": "c56b569d-53b1-41bd-bd57-43af9c07882a",
+ "file": "/home/thomas/OneDrive/org-roam/20210223161425-purely_algebraic_derivation_of_landau_levels.org",
+ "title": "purely algebraic derivation of Landau levels"
+ },
+ {
+ "id": "af98c8b8-d6d1-4443-893a-0a516b3664d2",
+ "file": "/home/thomas/OneDrive/org-roam/20210511130045-geometric_phase.org",
+ "title": "Geometric Phase"
+ },
+ {
+ "id": "c79acc9d-b1d6-4054-9031-ea6bd6a00b4e",
+ "file": "/home/thomas/OneDrive/org-roam/20210125131813-make_emacs_look_like_obsidian.org",
+ "title": "make emacs look like obsidian"
+ },
+ {
+ "id": "9a6bd1ee-8403-43af-9a53-f68faf686e27",
+ "file": "/home/thomas/OneDrive/org-roam/20210505161024-surjective_onto.org",
+ "title": "Surjective / Onto"
+ },
+ {
+ "id": "02efc391-fd46-4d2e-84e2-e191e90cc0c7",
+ "file": "/home/thomas/OneDrive/org-roam/20210316141305-shech_s_argument_for_fqhe_requires_exact_2d.org",
+ "title": "Shech's argument for FQHE Requires EXACT 2D"
+ },
+ {
+ "id": "3c3b33a1-b8db-4be9-8acc-244cc7230172",
+ "file": "/home/thomas/OneDrive/org-roam/20210119144549-categorization_of_idealizations.org",
+ "title": "Categorization of idealizations"
+ },
+ {
+ "id": "01eb74dc-02eb-4f6b-8c55-a13a45ea5086",
+ "file": "/home/thomas/OneDrive/org-roam/Duvernoy 2015 - Concepts and Continuity. Onto-Epistemology in William James.org",
+ "title": "Duvernoy2015: `Concepts' and Continuity: Onto-Epistemology in William James"
+ },
+ {
+ "id": "81c97242-4245-43e1-96d6-d2a02998d903",
+ "file": "/home/thomas/OneDrive/org-roam/20210125123204-multitasking_is_not_possible.org",
+ "title": "multitasking is not possible"
+ },
+ {
+ "id": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "file": "/home/thomas/OneDrive/org-roam/20210218151906-descripion_of_qhe.org",
+ "title": "descripion of QHE"
+ },
+ {
+ "id": "b81a0d48-8583-41cb-91ee-a95045036401",
+ "file": "/home/thomas/OneDrive/org-roam/20201211155842-two_step_process_of_models.org",
+ "title": "Two step process of models"
+ },
+ {
+ "id": "1c8a6a1c-1a78-469f-91f6-94ba3116aa04",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "Frigg: A Field Guide to Recent Work in the Foundations of Statistical Mechanics"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-72-0",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "The questions then are: in what way a probability distribution encodes a lack of knowledge; according to what principles the correct distribution is determined; and how this way of thinking about probabilities sheds any light on the founda- tion of SM."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-72-3",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "Indeed, I do not see Predictive Statistical Mechanics and Statistical Inference as differ- ent subjects at all; the former is only a particular realization of the latter [...] Today, not only do Statistical Mechanics and Statistical Inference not appear to be two different fields, even the term ‘statistical’ is not entirely appropriate. Both are special cases of a simple and general procedure that ought to be called, simply, “inference”. (Jaynes 1983, pp. 2–3)"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-72-1",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "3.3.6.1 The Shannon Entropy"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-72-4",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "Sometimes we are given X but fail to know the p(x i ). In this case Jaynes’s maximum entropy principle (MEP) instructs us to choose that distribution p(x i ) P m for which the Shannon entropy is maximal (under the constraint i=1 p(x i ) = 1)"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-72-2",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "This can be generalised to the case of a continuous variable, i.e. X = (a, b), where (a, b) is an interval of real numbers (the boundaries of this interval can be finite or infinite)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-73-0",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "Why is MEP compelling? The intuitive idea is that we should always choose the distribution that corresponds to a maximal amount of uncertainty, i.e. is maximally non-committal with respect to the missing information."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-73-1",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "ut why is this a sound rule? In fact MEP is fraught with controversy; and, to date, no consensus on its significance, or even cogency, has been reached"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/FriggR__A_Field_Guide_to_Recent_Work_in_the_Foundations_of_Statistical_Mechanics.pdf-annot-73-2",
+ "file": "/home/thomas/OneDrive/org-roam/Frigg.org",
+ "title": "for discussions see, for instance, Lavis (1977), Denbigh and Denbigh (1985), Lavis and Milligan (1985, §5), Shimony (1985), Seidenfeld (1986), Uffink (1995a; 1996a), Howson and Urbach (2006, pp. 276–88)."
+ },
+ {
+ "id": "3f8656b0-7344-43e3-8d25-f837674dc739",
+ "file": "/home/thomas/OneDrive/org-roam/20210316144720-worldlines.org",
+ "title": "Worldlines"
+ },
+ {
+ "id": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7",
+ "file": "/home/thomas/OneDrive/org-roam/20210125115700-10_minute_rule.org",
+ "title": "10 minute rule"
+ },
+ {
+ "id": "b99e36c9-b494-4c8a-a0b9-3573e7caf4d7",
+ "file": "/home/thomas/OneDrive/org-roam/20210309165636-magnetic_length.org",
+ "title": "magnetic length"
+ },
+ {
+ "id": "a28d10e8-9398-4cad-b795-cb177650fd66",
+ "file": "/home/thomas/OneDrive/org-roam/20210125131125-relentlessly_link.org",
+ "title": "relentlessly link"
+ },
+ {
+ "id": "ce695b2b-1054-480b-83f2-3b1d2e53c298",
+ "file": "/home/thomas/OneDrive/org-roam/20210419013401-black_boxing_in_academia_is_very_useful_for_creating_predictions.org",
+ "title": "Black-boxing in academia is very useful for creating predictions"
+ },
+ {
+ "id": "edfca3ee-eb93-46ff-8e10-25794e4cd67e",
+ "file": "/home/thomas/OneDrive/org-roam/20210308135758-fqhe_intro_to_show_ronnie_and_guido.org",
+ "title": "FQHE Intro to show Ronnie and Guido"
+ },
+ {
+ "id": "6ac5b3a1-4f84-4ca7-bc19-4ad6a10f14c8",
+ "file": "/home/thomas/OneDrive/org-roam/20210121134736-phd_positions.org",
+ "title": "phd positions"
+ },
+ {
+ "id": "f44e68f8-278a-47b5-b35d-53aed370a0da",
+ "file": "/home/thomas/OneDrive/org-roam/20210403183001-covering_space.org",
+ "title": "Covering space"
+ },
+ {
+ "id": "cc2f4b26-1f46-47f9-b9a6-d1012639f903",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132633-getting_rid_of_publishing_pressure_does_not_per_se_get_rid_of_academic_fraud.org",
+ "title": "getting rid of publishing pressure does not per se get rid of academic fraud"
+ },
+ {
+ "id": "4fdd20bf-6aca-49c2-add5-1308648d96ae",
+ "file": "/home/thomas/OneDrive/org-roam/inbox.org",
+ "title": "inbox"
+ },
+ {
+ "id": "bfc85e5b-ab3d-4b2e-a8c5-fb4043c2b8b4",
+ "file": "/home/thomas/OneDrive/org-roam/20210208180535-what_can_jote_offer_as_a_publisher.org",
+ "title": "what can JOTE offer as a publisher"
+ },
+ {
+ "id": "252a9a07-0378-4533-8e08-640a9f6eded8",
+ "file": "/home/thomas/OneDrive/org-roam/20210408191221-present_simple_in_100_seconds.org",
+ "title": "Present Simple in 100 seconds"
+ },
+ {
+ "id": "f309f07d-1509-4356-9547-97f101cefbb4",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160354-external_symmetries_are_of_changes_of_spatiotemporal_parameters.org",
+ "title": "External symmetries are of changes of spatiotemporal parameters"
+ },
+ {
+ "id": "b2456910-ad44-434b-8f6f-29cc32352b66",
+ "file": "/home/thomas/OneDrive/org-roam/20201210165650-naming_and_infinity.org",
+ "title": "Naming and Infinity"
+ },
+ {
+ "id": "37d19b7e-5db3-4981-9884-396aa5fcd76c",
+ "file": "/home/thomas/OneDrive/org-roam/20210121172818-welcome_message_dulaco.org",
+ "title": "welcome message DuLaCo"
+ },
+ {
+ "id": "64f76ddf-8e57-4a51-a082-91598a3f2c8e",
+ "file": "/home/thomas/OneDrive/org-roam/20210121112527-application_does_not_happen_magically.org",
+ "title": "application does not happen magically"
+ },
+ {
+ "id": "573dfbd0-2b6c-43b2-a08c-37f174de35c3",
+ "file": "/home/thomas/OneDrive/org-roam/20210302154810-edge_modes_determine_the_values_of_the_iqhe_plateaux.org",
+ "title": "edge modes determine the values of the IQHE plateaux"
+ },
+ {
+ "id": "eadcc86c-506d-4bd2-8922-61de2f301806",
+ "file": "/home/thomas/OneDrive/org-roam/20210316151908-1d_representation_of_a_group.org",
+ "title": "1D Representation of a Group"
+ },
+ {
+ "id": "8d8aa787-6796-410f-82d8-965c44698794",
+ "file": "/home/thomas/OneDrive/org-roam/20210210121252-fractional_quantum_hall_effect_meta.org",
+ "title": "Fractional quantum hall effect (meta)"
+ },
+ {
+ "id": "09a57da9-9bdc-4855-9a02-b996b222dd2a",
+ "file": "/home/thomas/OneDrive/org-roam/Grayling 2001 - Wittgenstein. A Very Short Introduction.org",
+ "title": "Grayling: Wittgenstein: A Very Short Introduction"
+ },
+ {
+ "id": "101c2d08-afcf-477f-8a76-7f70966bbe63",
+ "file": "/home/thomas/OneDrive/org-roam/20210503100219-chapter_phase_transistions.org",
+ "title": "Chapter Phase Transitions"
+ },
+ {
+ "id": "59d6f8ba-f40a-4f21-a593-4797787a707c",
+ "file": "/home/thomas/OneDrive/org-roam/20210608191046-sidebar.org",
+ "title": "sidebar"
+ },
+ {
+ "id": "04287b3d-df9b-495f-9079-67c01e02ee32",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190422-package_management_in_100_seconds.org",
+ "title": "Package management in 100 seconds"
+ },
+ {
+ "id": "4ae799af-3a59-413c-9bc2-1886f078cf70",
+ "file": "/home/thomas/OneDrive/org-roam/20201123110016-emacs_projects.org",
+ "title": "Emacs Projects"
+ },
+ {
+ "id": "8a158cbe-ee2b-4f4c-bd76-9730967267bd",
+ "file": "/home/thomas/OneDrive/org-roam/butterfield2011.org",
+ "title": "Butterfield2011: Less is Different: Emergence and Reduction Reconciled"
+ },
+ {
+ "id": "9f3ead69-b536-4708-a6a2-052a749c3c15",
+ "file": "/home/thomas/OneDrive/org-roam/20210223142404-the_filling_factor_is_integer_by_definition.org",
+ "title": "the filling factor is integer by definition"
+ },
+ {
+ "id": "582866bf-f015-4bae-b8ca-307450e77d49",
+ "file": "/home/thomas/OneDrive/org-roam/20210302161327-extended_vs_localized_states_is_another_vague_dichotomy.org",
+ "title": "extended vs localized states is another vague dichotomy"
+ },
+ {
+ "id": "d243e447-e807-4e47-ae77-49455836450e",
+ "file": "/home/thomas/OneDrive/org-roam/boundary.org",
+ "title": "Varzi2015: Boundary"
+ },
+ {
+ "id": "a226fa3f-7a60-4f59-83df-98976b17d0eb",
+ "file": "/home/thomas/OneDrive/org-roam/20210419013145-philosophy_is_not_opensourcable_because_its_too_self_reflective.org",
+ "title": "Philosophy is not opensourcable because its too self-reflective"
+ },
+ {
+ "id": "e543bfb1-89c4-4bb8-916e-f46d5107ac6c",
+ "file": "/home/thomas/OneDrive/org-roam/20210408184531-fireship_but_for_philosophy_of_science.org",
+ "title": "Fireship but for philosophy (of science)"
+ },
+ {
+ "id": "bad4f372-ba54-475a-a30a-8fd1e58cdd32",
+ "file": "/home/thomas/OneDrive/org-roam/20210529180827-case_against_esn_utrecht_copyright.org",
+ "title": "Case against ESN Utrecht copyright"
+ },
+ {
+ "id": "ef908f45-f69b-47a4-9939-24d3daf244eb",
+ "file": "/home/thomas/OneDrive/org-roam/20210223160326-quantum_operators.org",
+ "title": "quantum operators"
+ },
+ {
+ "id": "a0765c92-7915-4d39-909b-7daeef0ee3dc",
+ "file": "/home/thomas/OneDrive/org-roam/20210125130359-learning_is_making_connections.org",
+ "title": "learning is making connections"
+ },
+ {
+ "id": "0e0ce252-47b1-4b13-a4f5-a2b587b6f40c",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160106-the_strength_of_a_local_symmetry_is_a_variable_function_over_spacetime.org",
+ "title": "The strength of a local symmetry is a variable function over spacetime"
+ },
+ {
+ "id": "9616114b-901c-420d-9cf5-93f4bc5a75c0",
+ "file": "/home/thomas/OneDrive/org-roam/20210214175152-inbox.org",
+ "title": "inbox"
+ },
+ {
+ "id": "8b14c42a-cce5-4be1-b740-c051397a06c2",
+ "file": "/home/thomas/OneDrive/org-roam/20210611132449-homeomorphic.org",
+ "title": "Homeomorphic"
+ },
+ {
+ "id": "de0d2a39-720a-4a73-a533-2e197b0c3de9",
+ "file": "/home/thomas/OneDrive/org-roam/20201219152435-thermodynamic_limit.org",
+ "title": "thermodynamic limit"
+ },
+ {
+ "id": "e6303312-f094-4dd9-9d74-568bd31a89ea",
+ "file": "/home/thomas/OneDrive/org-roam/20210327154504-the_configuration_space_explanation_of_anyons.org",
+ "title": "The configuration space explanation of anyons"
+ },
+ {
+ "id": "90b942e4-ed45-4fd2-909f-e74312c2dab0",
+ "file": "/home/thomas/OneDrive/org-roam/20210511132817-curl.org",
+ "title": "Curl"
+ },
+ {
+ "id": "e56af431-8894-47e5-a752-97ae1e1a2848",
+ "file": "/home/thomas/OneDrive/org-roam/thesis.org",
+ "title": "Naming and Infinity"
+ },
+ {
+ "id": "0efec85b-7a67-4c32-9760-73a6f663e713",
+ "file": "/home/thomas/OneDrive/org-roam/20210330165632-problems_with_the_dn_model.org",
+ "title": "Problems with the DN model"
+ },
+ {
+ "id": "f0590214-eb26-46fd-9782-1b87615e4242",
+ "file": "/home/thomas/OneDrive/org-roam/20210519144826-feedback_homework_questions_les_10.org",
+ "title": "Feedback homework questions Les 10"
+ },
+ {
+ "id": "ed9abae9-2e87-41f7-add2-0e436d1831be",
+ "file": "/home/thomas/OneDrive/org-roam/20210316150917-interwined_worldlines_lead_to_fractional_statistics.org",
+ "title": "Interwined Worldlines Lead to Fractional Statistics"
+ },
+ {
+ "id": "8a05b076-292f-4b30-8882-ee85ef6020ce",
+ "file": "/home/thomas/OneDrive/org-roam/20210125130959-note_taking_rules.org",
+ "title": "note taking rules"
+ },
+ {
+ "id": "e33a9a8c-05a7-465a-8b52-03b53923dc4e",
+ "file": "/home/thomas/OneDrive/org-roam/20210125131033-have_positive_title.org",
+ "title": "have positive title"
+ },
+ {
+ "id": "b6c24e91-e450-4753-af3a-2cbc4605f60d",
+ "file": "/home/thomas/OneDrive/org-roam/20201103124722-email_ronnie.org",
+ "title": "Email Ronnie"
+ },
+ {
+ "id": "0a4bfbba-e140-4cce-9b11-876ebf26edd9",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Jaynes1957: Information Theory and Statistical Mechanics"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-1-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "It is the least biased estimate possible on the given information; i.e., it is maximally noncom- mittal with regard to missing information."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-1-1",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "It is conCluded that statistical mechanics need not be regarded as a physical theory dependent for its validity on the truth of additional assumptions not contained in the laws of mechanics (such as ergodicity, metric transitivity, equal a priori probabilities, etc.)."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-1-2",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Such an argument (for the validity of SM from micro to macro) should (a) be free from objection on mathematical grounds, (b) involve no additional arbitrary assumptions and c) automatically include and explanation of nonequilibrium conditions etc"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-2-1",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "In this paper we suggest a reinterpretation of statistical mechanics which accomplishes [the finding of new viepoints from which TD entropy and information theoretic entropy appear the same], so that information theory can be applied to the problem of justification of statistical mechanics."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-2-2",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Section 2 defines and establishes some of the ele- mentary properties of maximum-entropy inference, and in Secs. 3 and 4 the application to statistical mechanics is discussed."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-2-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Secondly, the paradox regarding the entropy of com- bined systems, which was resolved only by adoption of the generic instead of the specific definition of phase, an assumption which seems impossible to justify in terms of classical notions."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-2-3",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "In freeing the theory from its apparent dependence on physical hypotheses qf the above type, we make it possible to see statistical mechanics in a much more general light. Its principles and mathematical methods become available for treatment of many new physical problems."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "This problem of specification of probabilities in cases where little or no information is available, is as old as the theory of probability."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-1",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "For further discussion of this problem, one must recognize the fact that probability theory has developed in two very different directions as regards fundamental notions."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-2",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Although the theories of subjective and objective probability are mathematically identical; the cor:cepts themselves refuse to be united. In the vanous statlstlcal problems presented to us by physics, both viewpoints are required."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-3",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "The problem posed at the beginning of this section is of this type [namely ones that objectivists consider meaningless], and therefore in considering it we are necessarily adopting the subjective point of view."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-4",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Problem: find probability assignment that avoids bias and agrees with whatever info is given. Info theory gives us a \"unique unambiguous\" criterion for uncertainty which agrees with our intuitive conception of how prob dists work"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-5",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Since this is just the expression for entropy as found in statistical mechanics, it will be called the entropy of the probability distri- bution Pi; henceforth we will consider the terms \"entropy\" and \"uncertainty\" as synonymous."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-4-1",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "The principle of maximum entropy may be regarded as an extension of the principle of insufficient reason (to which it reduces in case no information is given except enumeration of the possibilities Xi), with the following essential difference. The maximum-entropy distribution may be asserted for the positive reason that it is uniquely determined as the one which is maximally noncommittal with regard to missing infor- mation, instead of the negative one that there was no reason to think otherwise."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-4-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "It is now evident how to solve our problem; in making il\\,ferences on the basis of partial information we must use that probability distribution which has maximum entropy subject to whatever is known. This is the only unbiased assignment we can make; to use any other would amount to arbitrary assumption of information which by hypothesis we do not have."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-4-2",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Mathematically, the maximum-entropy distribution has the important property that no possibility is ignored; it assigns positive weight to every situation that is not absolutely excluded by the given information. This is quite similar in effect to an ergodic property"
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-5-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "The thermodynamic entropy is identical with the information-theory entropy of the probability distri- bution except for the presence of Boltzmann's con- stant."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-5-1",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "In the light of information theory, this can be recognized as telling us a simple but important fact; there is nothing in the general laws of motion that can provide us with any additional infor- mation about the state of a system beyond what we have obtained from measurement."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-6-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "It is well known that t.he answer to both of these questions lies in the fact that for systems of very large number of degrees of freedom, the probability distri- butions of the usual macroscopic quantities determined from the equations above, possess a single extremely sharp peak which includes practically all the \"mass\" of the distribution. Thus for all practical purposes average, most probable, median, or any other type of estimate are one and the same."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-7-1",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Entropy as a concept may be regarded as a measure of our degree of ignorance as to the state of a system; on the other hand, for equilibrium conditions it is an experimentally measurable quantity, whose most important properties were first found empirically."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-7-0",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Many of the propositions of statistical mechanics are capable of two different interpretations. The Max- wellian distribution of velocities in a gas is, on the one hand, the distribution that can be realized in the greatest number of ways for a given total energy; on the other hand, it is a well-verified experimental fact."
+ },
+ {
+ "id": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-7-2",
+ "file": "/home/thomas/OneDrive/org-roam/Jaynes1957.org",
+ "title": "Thus, the theory makes definite predictions as to experimental behavior only when, and to the extent that, it leads to sharp distri- bution"
+ },
+ {
+ "id": "eb38a30c-92f6-4abe-b0fc-e7537da7ef8f",
+ "file": "/home/thomas/OneDrive/org-roam/20210507155044-bra_ket_notation.org",
+ "title": "Bra ket notation"
+ },
+ {
+ "id": "2bbd1770-6d4b-4284-8a3f-7c149fa0efc3",
+ "file": "/home/thomas/OneDrive/org-roam/Hacking 1991 - A Tradition of Natural Kinds.org",
+ "title": "Hacking1991: A tradition of natural kinds"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/Essentialism/HackingI_1991_A_tradition_of_natural_kinds.pdf-annot-6-0",
+ "file": "/home/thomas/OneDrive/org-roam/Hacking 1991 - A Tradition of Natural Kinds.org",
+ "title": "Pigeons peck at properties cunningly singled out by bird psychologists to establish avian intelligence: 'natural kind' is a name for what helps people do better. Natural kinds, in short, seem important for homo faber."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/Essentialism/HackingI_1991_A_tradition_of_natural_kinds.pdf-annot-8-0",
+ "file": "/home/thomas/OneDrive/org-roam/Hacking 1991 - A Tradition of Natural Kinds.org",
+ "title": "Reflection on social properties revives interest in nominalism/ realism about natural kinds. Every generation must find its own novel bones of contention in that, as in many other philosophical arenas."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/Essentialism/HackingI_1991_A_tradition_of_natural_kinds.pdf-annot-10-0",
+ "file": "/home/thomas/OneDrive/org-roam/Hacking 1991 - A Tradition of Natural Kinds.org",
+ "title": "Let us call white a \"finite kind\". In reserving the label 'real' for another sort of kind, Mill was not denying that finite kinds are found in nature. In both cases, the classification is the act of people, but the differences are the work of nature."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/Essentialism/HackingI_1991_A_tradition_of_natural_kinds.pdf-annot-12-0",
+ "file": "/home/thomas/OneDrive/org-roam/Hacking 1991 - A Tradition of Natural Kinds.org",
+ "title": "A Mill-Kind is a class of objects with a large or even apparently inexhaustible number of properties in common, and such that these properties are not implied by any known systematized body of law about things of this Kind"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/Essentialism/HackingI_1991_A_tradition_of_natural_kinds.pdf-annot-12-2",
+ "file": "/home/thomas/OneDrive/org-roam/Hacking 1991 - A Tradition of Natural Kinds.org",
+ "title": "A Peirce-kind is such a class, but such that there is a systematized body of law about things of this kind, and is such that we may reasonably think that it provides explanation sketches of why things of this kind have many of their properties. T"
+ },
+ {
+ "id": "f78af4d0-f42c-43ca-b683-2b123c34cacd",
+ "file": "/home/thomas/OneDrive/org-roam/20210330164858-explanation_qua_understanding.org",
+ "title": "Explanation qua understanding"
+ },
+ {
+ "id": "e048a132-a205-43b9-931d-ec1ea39dacca",
+ "file": "/home/thomas/OneDrive/org-roam/20210407143015-an_agorithm_for_finding_problematic_idealizations.org",
+ "title": "An algorithm for finding problematic idealizations"
+ },
+ {
+ "id": "b1667b51-b5c4-4b99-934e-9f071c76b507",
+ "file": "/home/thomas/OneDrive/org-roam/20201210185336-the_value_of_collecting_thoughts_over_information.org",
+ "title": "The value of collecting thoughts over information"
+ },
+ {
+ "id": "31eb8db7-03ac-4358-ba2a-7c3c6cd93465",
+ "file": "/home/thomas/OneDrive/org-roam/20201214195251-new.org",
+ "title": "new"
+ },
+ {
+ "id": "5424b894-6107-48ff-ae87-4aa96b0bc996",
+ "file": "/home/thomas/OneDrive/org-roam/20210218155710-getting_things_done.org",
+ "title": "Getting Things Done"
+ },
+ {
+ "id": "b5505833-45d8-4167-88f1-5155c8136bbb",
+ "file": "/home/thomas/OneDrive/org-roam/tennant2020.org",
+ "title": "Tennant2020: A tale of two 'opens': intersections between Free and Open Source Software and Open Scholarship"
+ },
+ {
+ "id": "63222d96-8674-4461-8ca8-fa3e94bfcfad",
+ "file": "/home/thomas/OneDrive/org-roam/invariance.org",
+ "title": "Invariance"
+ },
+ {
+ "id": "fc4de750-8ea7-4bd6-a797-63b242c85359",
+ "file": "/home/thomas/OneDrive/org-roam/2020-11-21.org",
+ "title": "2020-11-21"
+ },
+ {
+ "id": "5da4bf35-eb35-4b3d-b0d3-5d12059d7949",
+ "file": "/home/thomas/OneDrive/org-roam/20210507170519-open_science_metrics_debate.org",
+ "title": "Open Science Metrics Debate"
+ },
+ {
+ "id": "157f86eb-8c30-4985-a15e-aeb8f28b843f",
+ "file": "/home/thomas/OneDrive/org-roam/20201223151036-todos_until_christmas.org",
+ "title": "Todos until new year"
+ },
+ {
+ "id": "f25a5d3d-a827-462a-b5a3-eca42fd966c0",
+ "file": "/home/thomas/OneDrive/org-roam/20201218180308-confusing_approximations_and_idealizations.org",
+ "title": "confusing approximations and idealizations"
+ },
+ {
+ "id": "f65d81b0-04ad-44e1-a45c-70bb3595ba3b",
+ "file": "/home/thomas/OneDrive/org-roam/20210511134344-eigenvalues.org",
+ "title": "Eigenvalues"
+ },
+ {
+ "id": "1d38ec3e-d67d-458a-9399-fc044373e549",
+ "file": "/home/thomas/OneDrive/org-roam/20201210174644-idealization.org",
+ "title": "Idealization"
+ },
+ {
+ "id": "fc8347d6-2935-49bb-98a7-ff72d52e5e0b",
+ "file": "/home/thomas/OneDrive/org-roam/20210125132745-hooks_in_doom_emacs.org",
+ "title": "20210125132745-hooks_in_doom_emacs.org"
+ },
+ {
+ "id": "9c86347f-506a-4605-9501-1d763a10e68d",
+ "file": "/home/thomas/OneDrive/org-roam/20210405102414-wit_is_in_the_digression.org",
+ "title": "Wit is in the digression"
+ },
+ {
+ "id": "e28cf1ba-433a-46ea-baf2-260df85ba7ec",
+ "file": "/home/thomas/OneDrive/org-roam/openquestions.org",
+ "title": "open questions for my thesis"
+ },
+ {
+ "id": "0df2aed3-273d-413f-9a37-c20ab40ce8ab",
+ "file": "/home/thomas/OneDrive/org-roam/20210106173002-book_reviews_meta.org",
+ "title": "Book Reviews (meta)"
+ },
+ {
+ "id": "bea97dbc-0250-485d-98cc-bc33fb5a1587",
+ "file": "/home/thomas/OneDrive/org-roam/20210418192209-write_in_order_to_change_people_s_minds_don_t_simply_air_your_thoughts.org",
+ "title": "Write in order to change people's minds, don't simply air your thoughts"
+ },
+ {
+ "id": "25a5762d-db61-4f84-9962-b96e20c7e84b",
+ "file": "/home/thomas/OneDrive/org-roam/20210505153858-set.org",
+ "title": "Set"
+ },
+ {
+ "id": "0875094f-d050-4355-bf45-d2fd129d9e1e",
+ "file": "/home/thomas/OneDrive/org-roam/20210125123733-you_need_warmup_in_order_to_write_effectively.org",
+ "title": "you need warmup in order to write effectively"
+ },
+ {
+ "id": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "file": "/home/thomas/OneDrive/org-roam/20210312130104-berry_connection.org",
+ "title": "Berry Connection"
+ },
+ {
+ "id": "8884ca0d-a2b7-4021-8668-a54d7a8267c8",
+ "file": "/home/thomas/OneDrive/org-roam/20210601145636-dimensionality_of_an_electron_gas_is_determined_by_fermi_surface_topology.org",
+ "title": "Dimensionality of an electron gas is determined by Fermi Surface topology"
+ },
+ {
+ "id": "bddd3b6d-3ef3-4b26-8cd1-fc18e0bf84b0",
+ "file": "/home/thomas/OneDrive/org-roam/20210114175050-algorithm_for_deciding_what_to_work_on.org",
+ "title": "algorithm for deciding what to work on"
+ },
+ {
+ "id": "b450a866-ad0d-4452-bb83-e7e169787953",
+ "file": "/home/thomas/OneDrive/org-roam/20210416114640-closure.org",
+ "title": "Closure (set)"
+ },
+ {
+ "id": "f0b78212-d6ba-495e-a3bc-cb02176d4f0c",
+ "file": "/home/thomas/OneDrive/org-roam/20210516213310-double_cover.org",
+ "title": "Double cover"
+ },
+ {
+ "id": "fa2030f5-2202-4344-affa-7d4f6ab8ad4b",
+ "file": "/home/thomas/OneDrive/org-roam/PhD positions.org",
+ "title": "Hamburg General PhD"
+ },
+ {
+ "id": "5ca54c81-f499-4559-81a0-31f5fc9cffe3",
+ "file": "/home/thomas/OneDrive/org-roam/20201105123019-applications_of_mep.org",
+ "title": "Applications of MEP"
+ },
+ {
+ "id": "da6936a8-92e0-4f09-ba76-7a6cf707da53",
+ "file": "/home/thomas/OneDrive/org-roam/anyons.org",
+ "title": "Wilczek1991: Anyons"
+ },
+ {
+ "id": "b8d7cc1f-a10e-4257-91bb-f9231a0481a5",
+ "file": "/home/thomas/OneDrive/org-roam/20210125132758-elisp_function_calls.org",
+ "title": "elisp function calls"
+ },
+ {
+ "id": "429093a9-7c54-4691-ae5f-949a311f5118",
+ "file": "/home/thomas/OneDrive/org-roam/20210311113613-the_aharonov_bohm_effect_ab.org",
+ "title": "the Aharonov Bohm effect (AB)"
+ },
+ {
+ "id": "2e6fa60e-0809-43c3-a4d9-54d961b23403",
+ "file": "/home/thomas/OneDrive/org-roam/u_1.org",
+ "title": "U(1)"
+ },
+ {
+ "id": "edd5441b-c528-42a8-b34c-ab06925de205",
+ "file": "/home/thomas/OneDrive/org-roam/20210223163417-derivation_of_landau_level_wavefunctions.org",
+ "title": "derivation of landau level wavefunctions"
+ },
+ {
+ "id": "362afd2b-79d9-4c46-8651-ea3cbf2cc444",
+ "file": "/home/thomas/OneDrive/org-roam/katanaev2011.org",
+ "title": "Katanaev2011: On geometric interpretation of the AharonovBohm effect"
+ },
+ {
+ "id": "dbe6233d-e0e1-4f89-9f93-ae30a1664cb4",
+ "file": "/home/thomas/OneDrive/org-roam/20210403184145-abelian_group.org",
+ "title": "Abelian group"
+ },
+ {
+ "id": "69da4d27-6341-4e9c-b0be-0bc4698dbda6",
+ "file": "/home/thomas/OneDrive/org-roam/20210408191730-i_should_try_to_collaborate_on_100s_as_soon_as_possible.org",
+ "title": "I should try to collaborate on 100s as soon as possible"
+ },
+ {
+ "id": "d4e7ecd5-3f71-4e10-b967-b9ad290c27e5",
+ "file": "/home/thomas/OneDrive/org-roam/20210416114103-boundary.org",
+ "title": "Boundary"
+ },
+ {
+ "id": "87c540b3-83bb-4042-abc1-437d55ff874f",
+ "file": "/home/thomas/OneDrive/org-roam/20201214205310-what_is_the_difference_between_infinite_idealizations_and_normal_ones.org",
+ "title": "What is the difference between infinite idealizations and normal ones/"
+ },
+ {
+ "id": "5061d36d-a542-45d3-b76a-b6744c0df01a",
+ "file": "/home/thomas/OneDrive/org-roam/20210403182645-topological_space.org",
+ "title": "Topological space"
+ },
+ {
+ "id": "474d84cb-4d7e-4d05-bda5-5c5d42b32208",
+ "file": "/home/thomas/OneDrive/org-roam/lecture_notes_on_quantum_hall_effect_a_work_in_progress.org",
+ "title": "Arovas2020: Lecture Notes on Quantum Hall Effect (A Work in Progress)"
+ },
+ {
+ "id": "a46106f4-1427-4acb-af07-b385918d7ef5",
+ "file": "/home/thomas/OneDrive/org-roam/20210624200335-dnd_notes.org",
+ "title": "DND notes"
+ },
+ {
+ "id": "f94c39c4-0e5f-4166-8299-336c11a70973",
+ "file": "/home/thomas/OneDrive/org-roam/20210330155935-an_internal_symmetry_is_not_of_a_change_in_spatiotemporal_parameters.org",
+ "title": "An internal symmetry is not of a change in spatiotemporal parameters"
+ },
+ {
+ "id": "d699b056-c2f8-4f13-8549-2fd38d636eba",
+ "file": "/home/thomas/OneDrive/org-roam/20210403122310-a_knot_is_a_braid_connected_back_to_itself.org",
+ "title": "A knot is a braid connected back to itself"
+ },
+ {
+ "id": "ed909983-c859-4e7c-a311-aeccfdd17e69",
+ "file": "/home/thomas/OneDrive/org-roam/20210429202811-feedback_questions_i_had_about_introduction_deprecated.org",
+ "title": "feedback questions I had about introduction (DEPRECATED)"
+ },
+ {
+ "id": "d9510d93-d982-4500-af89-f21f214adaf4",
+ "file": "/home/thomas/OneDrive/org-roam/20210507155139-gauge_invariance.org",
+ "title": "Gauge Invariance"
+ },
+ {
+ "id": "803d6df6-3d4c-4471-b3bd-a022fad8d1ee",
+ "file": "/home/thomas/OneDrive/org-roam/20210403175440-first_homotopy_group_pi_1.org",
+ "title": "First homotopy group pi_1"
+ },
+ {
+ "id": "d6f12fd2-85e8-4cba-9d81-a0b0aea67ed2",
+ "file": "/home/thomas/OneDrive/org-roam/20210511132727-berry_curvature.org",
+ "title": "Berry Curvature"
+ },
+ {
+ "id": "4e447c8d-cd1e-45f2-a01a-39e6af1c742c",
+ "file": "/home/thomas/OneDrive/org-roam/20210602232209-adhd_is_not_being_able_to_identify_what_s_important.org",
+ "title": "ADHD is not being able to identify what's important"
+ },
+ {
+ "id": "1b978913-f923-48e8-b1e7-d0a42527dd5b",
+ "file": "/home/thomas/OneDrive/org-roam/20210505161103-bijective_one_to_one_correspondence.org",
+ "title": "Bijective / One-to-one-correspondence"
+ },
+ {
+ "id": "948182b9-1c2d-4f52-b76b-51ee1c11a9cc",
+ "file": "/home/thomas/OneDrive/org-roam/20210223142953-disordered_systems_exhibit_iqhe_more_strongly.org",
+ "title": "disordered systems exhibit IQHE MORE strongly"
+ },
+ {
+ "id": "2c68f855-7068-4a0a-97f5-d3ad09edf6f7",
+ "file": "/home/thomas/OneDrive/org-roam/20210407142033-approximation_is_smoothly_approaching_the_target_system_by_varying_the_approximation_parameter.org",
+ "title": "Approximation is smoothly approaching the target system by varying the approximation parameter"
+ },
+ {
+ "id": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "file": "/home/thomas/OneDrive/org-roam/20210408184146-emacs_fireship_clone_meta.org",
+ "title": "Emacs Fireship Clone meta"
+ },
+ {
+ "id": "05ddd5b1-9232-4951-8b4b-1be320498ea9",
+ "file": "/home/thomas/OneDrive/org-roam/the_reduction_of_thermodynamics_to_statistical_mechanics.org",
+ "title": "Sklar1999: The Reduction(?) of Thermodynamics to Statistical Mechanics"
+ },
+ {
+ "id": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "file": "/home/thomas/OneDrive/org-roam/20210309144432-jote_meta.org",
+ "title": "JOTE meta"
+ },
+ {
+ "id": "e844dcee-eae7-41d2-b1cf-fbe0104fe452",
+ "file": "/home/thomas/OneDrive/org-roam/20210518140233-thesis_sources.org",
+ "title": "Thesis sources"
+ },
+ {
+ "id": "ee60d371-67df-432d-bcd3-48bc7b239178",
+ "file": "/home/thomas/OneDrive/org-roam/20210128151417-what_is_good_marketing.org",
+ "title": "what is good marketing"
+ },
+ {
+ "id": "8cd2e3e1-f09d-4b79-96cc-2fbdbd7e7370",
+ "file": "/home/thomas/OneDrive/org-roam/20210503090553-finding_a_way_to_approximately_calculate_anyons.org",
+ "title": "Finding a way to approximately calculate anyons"
+ },
+ {
+ "id": "edcab4d4-3171-4b32-9833-451bfc53bafa",
+ "file": "/home/thomas/OneDrive/org-roam/20210218153456-bosons.org",
+ "title": "bosons"
+ },
+ {
+ "id": "5cda5b8a-5e6e-4f1f-9e1c-7b446e29d6ae",
+ "file": "/home/thomas/OneDrive/org-roam/2021-01-08-archfaceThomas.org",
+ "title": "#+title: 8 january- 15 january"
+ },
+ {
+ "id": "663c74e8-6958-4710-8b46-666e820a6326",
+ "file": "/home/thomas/OneDrive/org-roam/20210108143923-rough_argumentative_structure.org",
+ "title": "rough_argumentative_structure"
+ },
+ {
+ "id": "74a3624f-ca91-499a-998a-9be79b49aeb1",
+ "file": "/home/thomas/OneDrive/org-roam/20210125132843-windows_buffer_positioning_in_emacs.org",
+ "title": "windows/buffer positioning in emacs"
+ },
+ {
+ "id": "e08f7288-cb1b-4b9c-8e9b-41aa978db99a",
+ "file": "/home/thomas/OneDrive/org-roam/20210309144210-teaching_meta.org",
+ "title": "teaching meta"
+ },
+ {
+ "id": "607655ae-3263-4bd2-a03f-b4b877e42c1f",
+ "file": "/home/thomas/OneDrive/org-roam/20210309164701-perturbation_theory.org",
+ "title": "perturbation theory"
+ },
+ {
+ "id": "8aeed50e-4ba6-46f3-b1d2-4fdd0557951f",
+ "file": "/home/thomas/OneDrive/org-roam/20210511134437-nabla.org",
+ "title": "Nabla"
+ },
+ {
+ "id": "2f2c0f6a-0030-4468-adc0-92c981dfe18f",
+ "file": "/home/thomas/OneDrive/org-roam/Dutch App.org",
+ "title": "Dutch App.org"
+ },
+ {
+ "id": "86c3b2eb-2152-4dbf-a20b-3f032ec4fa93",
+ "file": "/home/thomas/OneDrive/org-roam/leinaas1977.org",
+ "title": "Leinaas1977: On the theory of identical particles"
+ },
+ {
+ "id": "9fe27d90-4d10-4215-a21f-7ace21c827c7",
+ "file": "/home/thomas/OneDrive/org-roam/20210419014037-academia_is_different_from_software_dev_because_it_does_not_have_a_clear_product.org",
+ "title": "Academia is different from software dev because it does not have a clear product"
+ },
+ {
+ "id": "1c72fe21-bb24-453d-afbb-d58ac0059086",
+ "file": "/home/thomas/OneDrive/org-roam/20210316150442-3d_braids_do_not_get_intertwined.org",
+ "title": "3D Braids do not get intertwined"
+ },
+ {
+ "id": "278147a3-6fff-4c0d-9ac4-4c9591a9fb16",
+ "file": "/home/thomas/OneDrive/org-roam/20210507155249-stokes_theorem.org",
+ "title": "Stokes theorem"
+ },
+ {
+ "id": "f9efcbb2-8976-49bc-aad0-0b5906298c99",
+ "file": "/home/thomas/OneDrive/org-roam/earlydraft.org",
+ "title": "earlydraft.org"
+ },
+ {
+ "id": "cb93fd0f-30d4-40d1-8d80-4485aa3ca3fb",
+ "file": "/home/thomas/OneDrive/org-roam/20210606203630-often_you_have_to_slow_down_to_make_progress.org",
+ "title": "Often you have to slow down to make progress"
+ },
+ {
+ "id": "5e0cfb56-06a3-4960-a97f-a9aaa2853e6e",
+ "file": "/home/thomas/OneDrive/org-roam/20210101142129-productive_meditation.org",
+ "title": "productive meditation"
+ },
+ {
+ "id": "deba623a-e0d9-4db3-96e3-3cf22681ef43",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160020-local_symmetry.org",
+ "title": "Local symmetry"
+ },
+ {
+ "id": "7afb3d23-edad-45ad-97c1-58ac1ca6857d",
+ "file": "/home/thomas/OneDrive/org-roam/20210414155524-how_does_qm_work_in_non_simply_connected_space.org",
+ "title": "How does QM work in non-simply connected space?"
+ },
+ {
+ "id": "7d5f0144-0d5f-4dea-a85f-a027978fa92e",
+ "file": "/home/thomas/OneDrive/org-roam/knapp2016.org",
+ "title": "Knapp2016: How quickly can anyons be braided? Or: How I learned to stop worrying about diabatic errors and love the anyon"
+ },
+ {
+ "id": "2e0a3a59-3794-4b5f-8313-f630d88a7a87",
+ "file": "/home/thomas/OneDrive/org-roam/20210403183452-simply_connected.org",
+ "title": "Simply connected"
+ },
+ {
+ "id": "da5add9d-61c4-453c-88be-f2c1eb8246fb",
+ "file": "/home/thomas/OneDrive/org-roam/20210505153756-equivalence_classes_are_either_disjoint_or_equal.org",
+ "title": "Equivalence Classes are either disjoint or equal"
+ },
+ {
+ "id": "79a2be17-799a-410d-9158-155f40c939f6",
+ "file": "/home/thomas/OneDrive/org-roam/20201105121105-statement_of_mep.org",
+ "title": "Statement of MEP"
+ },
+ {
+ "id": "6b57825c-8906-4fd3-8166-9ba743515f14",
+ "file": "/home/thomas/OneDrive/org-roam/20210322103854-emacs_things_i_often_do_wrong.org",
+ "title": "Emacs things I often do wrong"
+ },
+ {
+ "id": "bbe1f08a-a5e7-4276-bedd-d5d821f899e1",
+ "file": "/home/thomas/OneDrive/org-roam/Meditations.org",
+ "title": "I am happy now, lets see where that will go"
+ },
+ {
+ "id": "c1494ece-2b4c-4ae2-b37e-a53c0527a921",
+ "file": "/home/thomas/OneDrive/org-roam/Lie Algebra.org",
+ "title": "Lie Algebra"
+ },
+ {
+ "id": "84648a99-063d-442d-a586-92b1d58da4f5",
+ "file": "/home/thomas/OneDrive/org-roam/20201204171957-4dec_11dec-archfaceThomas.org",
+ "title": "4dec-11dec"
+ },
+ {
+ "id": "317ec22d-3bf3-4bad-96b4-9d495936a504",
+ "file": "/home/thomas/OneDrive/org-roam/weeklytemplate.org",
+ "title": "#+title: 2020-12-17"
+ },
+ {
+ "id": "e94cf4f9-71a7-4717-a9b7-5881c3679461",
+ "file": "/home/thomas/OneDrive/org-roam/20210327153604-the_configuration_space_approach_explains_the_possibility_of_anyons_not_their_occurence.org",
+ "title": "The configuration space approach explains the possibility of anyons, not their occurence"
+ },
+ {
+ "id": "4ab6fa70-e092-4c76-a6ca-33ef9d7493e8",
+ "file": "/home/thomas/OneDrive/org-roam/20210507133134-vector_space.org",
+ "title": "Vector space"
+ },
+ {
+ "id": "c398fcc5-6430-471f-9387-c283eacb32a8",
+ "file": "/home/thomas/OneDrive/org-roam/20210224102338-intermediate_course_teachers_manual.org",
+ "title": "intermediate course teachers manual"
+ },
+ {
+ "id": "6193e0d2-8e6a-416f-9fae-6060ae73852c",
+ "file": "/home/thomas/OneDrive/org-roam/20210218152105-classical_quantum_hall_effect.org",
+ "title": "classical quantum hall effect"
+ },
+ {
+ "id": "c5a1aba6-0fcd-4bb0-993c-a9d6c4601b22",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190939-difficult_dutch_consonants_in_100_seconds.org",
+ "title": "Difficult Dutch consonants in 100 seconds"
+ },
+ {
+ "id": "0c4fd4aa-2511-471a-a260-8b810db1990b",
+ "file": "/home/thomas/OneDrive/org-roam/20210218151906-descripion_of_fqhe.org",
+ "title": "descripion of FQHE"
+ },
+ {
+ "id": "90aca3fd-8a96-43c8-a88c-d22745aae934",
+ "file": "/home/thomas/OneDrive/org-roam/20210419014318-ideas_are_a_problematic_unit_of_collaboration_as_they_are_similar_to_patents.org",
+ "title": "Ideas are a problematic unit of collaboration as they are similar to patents"
+ },
+ {
+ "id": "09d72e19-5fe2-445e-becb-86ef45bf86b0",
+ "file": "/home/thomas/OneDrive/org-roam/20210312122144-screening_allows_us_to_calculate_the_berry_connection.org",
+ "title": "Screening Allows us to Calculate the Berry Connection"
+ },
+ {
+ "id": "4b0e5554-ba02-4a9f-8744-d8d8cbdc53ed",
+ "file": "/home/thomas/OneDrive/org-roam/adults are bad at learning vowels because we never practice doing so.org",
+ "title": "Adults are bad at learning vowel distinctions because they never practice doing so"
+ },
+ {
+ "id": "e3752111-11b7-45d0-a61f-fd3b3359e872",
+ "file": "/home/thomas/OneDrive/org-roam/20210104003133-hesitation_is_defeat.org",
+ "title": "HESITATION IS DEFEAT"
+ },
+ {
+ "id": "c258afc5-7614-4770-aac3-1b6bc58e0c44",
+ "file": "/home/thomas/OneDrive/org-roam/20201215155205-definitions_of_idealizations.org",
+ "title": "Definitions of Idealizations"
+ },
+ {
+ "id": "08104a25-3b71-4932-97d8-7db721cbbcfe",
+ "file": "/home/thomas/OneDrive/org-roam/orthogonal.org",
+ "title": "Orthogonal"
+ },
+ {
+ "id": "3c178982-1e96-4976-8333-27ebce4b7225",
+ "file": "/home/thomas/OneDrive/org-roam/handboek_ondernemen_2020.org",
+ "title": "zotero-3530: Handboek ondernemen 2020"
+ },
+ {
+ "id": "a447a480-f217-4bf4-9372-683afe4aced7",
+ "file": "/home/thomas/OneDrive/org-roam/cohen2019.org",
+ "title": "Cohen2019: Geometric phase from AharonovBohm to PancharatnamBerry and beyond"
+ },
+ {
+ "id": "0cecffd2-6a76-4403-ab6f-463d2cb2ce25",
+ "file": "/home/thomas/OneDrive/org-roam/20210126115925-oscu_symposium_presentation.org",
+ "title": "OSCU Symposium presentation"
+ },
+ {
+ "id": "9acce413-ba7a-4b24-ab00-13772ed94437",
+ "file": "/home/thomas/OneDrive/org-roam/20201231141207-deep_work.org",
+ "title": "deep work"
+ },
+ {
+ "id": "07142d7a-80b3-42c1-ab4c-5cd71e551bb9",
+ "file": "/home/thomas/OneDrive/org-roam/20201123102239-wishlist.org",
+ "title": "Wishlist"
+ },
+ {
+ "id": "09863656-6dba-49c6-b6aa-932dc96c15bf",
+ "file": "/home/thomas/OneDrive/org-roam/20210117164945-steps_that_need_to_be_taken.org",
+ "title": "20210117164945-steps_that_need_to_be_taken.org"
+ },
+ {
+ "id": "e91108cb-a755-4ffa-861d-b228b26f441e",
+ "file": "/home/thomas/OneDrive/org-roam/20201221144612-relevant_papers_for_discrete_continuous_transitio.org",
+ "title": "Relevant papers for discrete continuous transitio"
+ },
+ {
+ "id": "e17881af-64cc-4055-b123-6e23395c0b62",
+ "file": "/home/thomas/OneDrive/org-roam/20210127160004-course_goals.org",
+ "title": "course goals"
+ },
+ {
+ "id": "33525eea-8d9d-4455-a071-c38ccc69978b",
+ "file": "/home/thomas/OneDrive/org-roam/20210413190058-its_easier_to_create_an_image_of_yourself_as_not_weird_than_trying_not_to_think_about_what_other_people_think_of_you.org",
+ "title": "Its easier to create an image of yourself as not-weird than trying not to think about what other people think of you"
+ },
+ {
+ "id": "27cf8fcc-45c8-4e25-ab05-13ae5b359a5e",
+ "file": "/home/thomas/OneDrive/org-roam/Blackburn 2004 - Ethics. A Very Short Introduction.org",
+ "title": "Blackburn: Ethics: A Very Short Introduction"
+ },
+ {
+ "id": "1c7c5c98-9acf-44e1-8921-4bb34eed0f92",
+ "file": "/home/thomas/OneDrive/org-roam/20210505155407-function_mapping.org",
+ "title": "function/mapping"
+ },
+ {
+ "id": "57213ae1-eff2-4442-b04b-84706076061f",
+ "file": "/home/thomas/OneDrive/org-roam/20210511110338-phase_quantum.org",
+ "title": "Phase (quantum)"
+ },
+ {
+ "id": "4b6fa3c6-3650-4f16-a651-838d3e964536",
+ "file": "/home/thomas/OneDrive/org-roam/20210403182023-the_fundamental_group_records_information_about_loops_in_a_space.org",
+ "title": "The fundamental group records information about loops in a space"
+ },
+ {
+ "id": "3eb352c4-cbc7-47be-8c0f-98cd9168e850",
+ "file": "/home/thomas/OneDrive/org-roam/lorentz_group.org",
+ "title": "Lorentz Group"
+ },
+ {
+ "id": "83d73e23-610d-4977-8106-c8b4c78ba0c7",
+ "file": "/home/thomas/OneDrive/org-roam/20210317123126-hilbert_space.org",
+ "title": "Hilbert Space"
+ },
+ {
+ "id": "78f5434e-ad00-4cc8-819f-7f9616ca7589",
+ "file": "/home/thomas/OneDrive/org-roam/20210316143459-braided_worldlines_cannot_be_disentangled_in_2d.org",
+ "title": "Braided Worldlines Cannot be Disentangled in 2D"
+ },
+ {
+ "id": "e6409aab-f55e-42d2-b09f-6388903442a4",
+ "file": "/home/thomas/OneDrive/org-roam/20210204161139-you_can_only_generalize_from_specific_case_studies_if_you_have_sufficient_data_from_said_case_studies.org",
+ "title": "You can only generalize from specific case studies if you have sufficient data from said case studies"
+ },
+ {
+ "id": "9e201de4-a6d3-423f-b179-0041860f5ccb",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "Varzi2015: Boundary"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-3-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "But ordinary material objects — it might be observed — are not truly continuous (or dense) and speaking of an object's boundary is like speaking of the “flat top” of a fakir's bed of nails"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-2-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1. Issues"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-2-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1.1 Owned vs. Unowned Boundaries"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-3-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1.2 Natural vs. Artificial Boundaries"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-3-2",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "We may, in this connection, introduce a conceptual distinction between natural or bona fide boundaries, which are in some sense objective, i.e., grounded in some physical discontinuity or qualitative heterogeneity betwixt an entity and its surroundings, and artificial or fiat boundaries, which are not so grounded in the autonomous, mind-independent world"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-3-3",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "So the question is, are there any bona fide boundaries? And, if not, is the fiat nature of our boundary talk a reason to justify an anti-realist attitude towards boundaries altogether?"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-4-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1.3 Sharp vs. Vague Boundaries"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-4-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "How is such fuzziness to be construed?"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-4-2",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1.4 Bodiless vs. Bulky Boundaries"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-5-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "Yet a general theory of boundaries should have something to say about the second conception as well — and more generally about the interaction between the mathematical idealization associated with the former conception and the physical, cognitive, and philosophical significance of the latter (Galton 2007)."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-5-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "2.1 Realist Theories"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-6-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1. The boundary may belong neither to A nor to B."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-6-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "2. The boundary must belong either to A or to B, though it may be indeterminate to which of A and B it belongs."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-6-2",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "3. The boundary may belong both to A and to B, but the relevant overlap is /sui generis/ precisely insofar as it invlovles lower-dimensional parts"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-6-3",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "4. There really may be two boundaries, one belonging to A and one belonging to B, and these two boundaries would be co-located — that is, they would coincide spatially without overlapping mereologically."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-7-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "These four views are mutually exclusive, but they need not be exhaustive and can be further articulated or integrated to address the issues raised by the other puzzles of Section 1."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-7-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "Similarly, the indeterminacy hypothesis advocated by type-(2) theories can be regarded as being of a piece with the sort of indeterminacy that is involved in the phenomenon of vagueness (Section 1.3)."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-7-2",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "2.2 Eliminativist Theorie"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-7-3",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "Eliminativist theories move from the idea that talk of boundaries involves some sort of abstraction"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-7-4",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "What sort of abstraction would be involved here? And how can one account for our ordinary and mathematical talk about boundaries if these are to be explained away as fictional abstractions?"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-7-5",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "1. Substantivalists about space-time may see the abstraction as stemming from the relationship between a particular and its spatio- temporal receptacle, relying on the topology of space-time fsto account for our boundary talk when it comes to specific cases."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-8-0",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "2. If one is not a substantivalist about space and/or time, one can describe the abstraction as invoking the idea of ever thinner layers of the bounded entity."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-8-1",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "On this account, boundary elements are not included among the primary entities, which only comprise extended bodies, but they are nonetheless retrieved as higher-order entities, viz. as equivalence classes of convergent series of nested bodies."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-8-2",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "For example, the series of all concentric spheres included in a given sphere converges to the point at the center, the series of all concentric right cylinders of equal length included in a given cylinder converge to the axial line, and so on."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-8-3",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "Call a convergent series of this sort an abstractive class iff it has no bottom, i.e., iff no object is part of every member of the class. And call two co-convergent abstractive classes equivalent iff every member of the first class has a member of the second as part, and vice versa."
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Continuity_and_Discreteness/VarziA_2015_Boundary.pdf-annot-8-4",
+ "file": "/home/thomas/OneDrive/org-roam/Varzi 2015 - Boundary (SEP).org",
+ "title": "A third option, alternative to both type-(1) and type-(2) theories, would be an “operationalist” account of the sort advocated by Adams (1984, 1996), where the abstractive process by which boundary elements are derived from concrete observables is explained in terms of “operational tests”."
+ },
+ {
+ "id": "0ccae1ac-5535-4864-9451-709b65c888b4",
+ "file": "/home/thomas/OneDrive/org-roam/the_structure_of_asymptotic_idealization.org",
+ "title": "the_structure_of_asymptotic_idealization.org"
+ },
+ {
+ "id": "1fbefa5c-d5a1-4061-a043-e7c2ffd7c596",
+ "file": "/home/thomas/OneDrive/org-roam/infinite_idealizations_chapter.org",
+ "title": "What is an infinite idealization (Chapter)"
+ },
+ {
+ "id": "92ba6235-1786-4612-8f55-5a79105aa570",
+ "file": "/home/thomas/OneDrive/org-roam/20210125121355-warming_up_is_crucial.org",
+ "title": "warming up is crucial"
+ },
+ {
+ "id": "c4f4d1f1-96a4-487d-b3f6-e4c88d654a81",
+ "file": "/home/thomas/OneDrive/org-roam/20210125131344-you_need_to_be_pushed_outside_your_comfort_zone_in_order_to_learn.org",
+ "title": "You need to be pushed outside your comfort zone in order to learn"
+ },
+ {
+ "id": "d23a01a0-a889-4412-8c3e-39142401a050",
+ "file": "/home/thomas/OneDrive/org-roam/20210312130942-is_braids_are_not_getting_untangled_a_good_enough_fqhe_explanation.org",
+ "title": "Is \"Braids are not Getting Untangled\" a Good Enough FQHE Explanation?"
+ },
+ {
+ "id": "8a9eec6d-6793-4499-b4b3-a7c77dd3b44d",
+ "file": "/home/thomas/OneDrive/org-roam/don&apos;t think in terms of blame, but contribution.org",
+ "title": "Don Apos T Think In Terms Of Blame But Contribution"
+ },
+ {
+ "id": "50dd38aa-c38e-4cb8-88e7-24046c3d906d",
+ "file": "/home/thomas/OneDrive/org-roam/20210602234818-the_best_explanations_are_the_ones_that_made_you_understand.org",
+ "title": "The best explanations are the ones that made you understand"
+ },
+ {
+ "id": "37c25546-4135-4012-b414-7747d6cedb2a",
+ "file": "/home/thomas/OneDrive/org-roam/20210511115926-wavefunctions_are_waves_and_do_wave_things.org",
+ "title": "Wavefunctions are waves and do wave things"
+ },
+ {
+ "id": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "file": "/home/thomas/OneDrive/org-roam/20210408184226-fireship_but_for_dutch_and_linguistics.org",
+ "title": "Fireship but for Dutch and Linguistics"
+ },
+ {
+ "id": "c45736b9-4f0e-43ef-a8e5-4dcfc632b9f8",
+ "file": "/home/thomas/OneDrive/org-roam/20210204161810-enhanced_indispensability_argument_eia.org",
+ "title": "enhanced indispensability argument (EIA)"
+ },
+ {
+ "id": "99de5040-7b83-4433-850a-6db2d16a629b",
+ "file": "/home/thomas/OneDrive/org-roam/20201221125304-transitions_from_continuity_to_the_discrete_are_not_possible.org",
+ "title": "Transitions from continuity to the discrete are not possible"
+ },
+ {
+ "id": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "file": "/home/thomas/OneDrive/org-roam/chapter-anyons.org",
+ "title": "FQHE/anyon chapter"
+ },
+ {
+ "id": "75068634-a939-42ae-815f-8c31d02cf5f5",
+ "file": "/home/thomas/OneDrive/org-roam/20210223171329-adiabatic_theorem_quantum.org",
+ "title": "adiabatic theorem (quantum)"
+ },
+ {
+ "id": "2816631b-6172-43cd-ba98-c3166510420a",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132258-set_an_endpoint_for_working_everyday.org",
+ "title": "set an endpoint for working everyday"
+ },
+ {
+ "id": "4d1d4b14-fb53-41d2-bc0d-a1c197cc6df0",
+ "file": "/home/thomas/OneDrive/org-roam/20201219152020-infinite_idealizations.org",
+ "title": "infinite idealizations"
+ },
+ {
+ "id": "1c51c234-9537-44fe-a4b1-38340b6beef7",
+ "file": "/home/thomas/OneDrive/org-roam/ong2006.org",
+ "title": "Ong2006: Geometry and the anomalous Hall effet in ferromagnets"
+ },
+ {
+ "id": "7fae1bd2-1942-4b55-82d7-9eb0bd082f6f",
+ "file": "/home/thomas/OneDrive/org-roam/20210408191051-diphthongs_in_100_seconds.org",
+ "title": "Diphthongs in 100 seconds"
+ },
+ {
+ "id": "4fc2e2f3-cab3-46bf-ac7b-87973b153071",
+ "file": "/home/thomas/OneDrive/org-roam/more_is_the_same_phase_transitions_and_mean_field_theories.org",
+ "title": "Kadanoff2009: More is the Same; Phase Transitions and Mean Field Theories"
+ },
+ {
+ "id": "fc6472a8-6abb-41d9-b73e-d019d6093869",
+ "file": "/home/thomas/OneDrive/org-roam/20210314213707-i_want_open_source_philosphy.org",
+ "title": "I Want Open Source Philosophy"
+ },
+ {
+ "id": "2bd50b77-d226-4853-8bf2-d0e69b570a53",
+ "file": "/home/thomas/OneDrive/org-roam/20210114163906-vagueness.org",
+ "title": "vagueness"
+ },
+ {
+ "id": "63bab575-b579-4f64-9318-df5b59a36dfe",
+ "file": "/home/thomas/OneDrive/org-roam/20210107121811-scratchpad_for_random_thoughs.org",
+ "title": "scratchpad for random thoughs"
+ },
+ {
+ "id": "d76c4b10-fedb-4340-b80c-06c5389fbc9a",
+ "file": "/home/thomas/OneDrive/org-roam/bibnotes.org",
+ "title": "Bibnotes"
+ },
+ {
+ "id": "e7ba78fd-c700-41b0-af2f-0ca8b862ab66",
+ "file": "/home/thomas/OneDrive/org-roam/20210125124429-things_i_trick_myself_into_believing_are_warmup.org",
+ "title": "things I trick myself into believing are warmup"
+ },
+ {
+ "id": "81bc17b9-b374-464e-a3fe-16291a49f8b1",
+ "file": "/home/thomas/OneDrive/org-roam/20210511111209-holonomy_arises_through_the_curvature_of_parameter_space.org",
+ "title": "Holonomy arises through the curvature of parameter space"
+ },
+ {
+ "id": "085d376c-0967-4f50-b369-87369033bcf0",
+ "file": "/home/thomas/OneDrive/org-roam/20210511115231-interference.org",
+ "title": "Interference"
+ },
+ {
+ "id": "1daf9cd9-f9ed-444e-aa1b-df2281be3a34",
+ "file": "/home/thomas/OneDrive/org-roam/20201210184411-zettelkasten_de.org",
+ "title": "Zettelkasten.de"
+ },
+ {
+ "id": "9d83c7bc-37e6-4dbb-958f-3a369a96e456",
+ "file": "/home/thomas/OneDrive/org-roam/20201204171957-4dec_11dec.org",
+ "title": "4dec-11dec"
+ },
+ {
+ "id": "3f0e13f0-5cb1-4a37-8dee-df8db521ad9c",
+ "file": "/home/thomas/OneDrive/org-roam/20210125121715-sport_and_academia_are_similar.org",
+ "title": "sport and academia are similar"
+ },
+ {
+ "id": "4b10bcb4-8337-4b3e-be7a-adab788f995c",
+ "file": "/home/thomas/OneDrive/org-roam/20210210115635-phase_transitions.org",
+ "title": "phase transitions"
+ },
+ {
+ "id": "3cf8ff6c-0ff4-4597-814c-d1b81aeaad67",
+ "file": "/home/thomas/OneDrive/org-roam/20210316143742-quantum_statistics.org",
+ "title": "Quantum Statistics"
+ },
+ {
+ "id": "b671608b-4efc-4c3a-afea-5e392abaa86c",
+ "file": "/home/thomas/OneDrive/org-roam/20210611132541-isomporphism.org",
+ "title": "Isomporphism"
+ },
+ {
+ "id": "a7f373ec-b8d9-4822-b969-44415e666a6a",
+ "file": "/home/thomas/OneDrive/org-roam/20210427183527-singular_limit.org",
+ "title": "singular limit"
+ },
+ {
+ "id": "9edb93f2-bb71-42ed-8a72-89abaa8a5cc3",
+ "file": "/home/thomas/OneDrive/org-roam/20210311183858-every_qh_wf_must_be_antisymmetric.org",
+ "title": "Every QH WF must be antisymmetric"
+ },
+ {
+ "id": "2d4ec4ea-c3ef-4ee1-90b4-17857fe8f21e",
+ "file": "/home/thomas/OneDrive/org-roam/20210501110610-i_love_being_better_than_expected.org",
+ "title": "I love being better than expected"
+ },
+ {
+ "id": "69945ee0-4f04-419b-8680-e45203302491",
+ "file": "/home/thomas/OneDrive/org-roam/20210218153430-fermions.org",
+ "title": "fermions"
+ },
+ {
+ "id": "c6020cb1-594a-45f0-b58b-fa721ad6603d",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190146-emacs_windowing_system.org",
+ "title": "Emacs windowing system"
+ },
+ {
+ "id": "8539bd4a-0af3-452d-9867-e5462637645a",
+ "file": "/home/thomas/OneDrive/org-roam/20210216120554-notes_on_fqhe.org",
+ "title": "notes on FQHE"
+ },
+ {
+ "id": "8136709d-9d43-44f6-8904-d411973bcfdd",
+ "file": "/home/thomas/OneDrive/org-roam/20210505152849-equivalence_relation.org",
+ "title": "Equivalence Relation"
+ },
+ {
+ "id": "4a153d36-05a0-42be-8348-0c6a7aa96ecf",
+ "file": "/home/thomas/OneDrive/org-roam/20210125131344-you_need_to_be_pushed_in_order_to_learn.org",
+ "title": "you need to be pushed in order to learn"
+ },
+ {
+ "id": "7a202401-c1b8-4cb6-884c-ed8c55d8a577",
+ "file": "/home/thomas/OneDrive/org-roam/20210604155111-jote_meeting_20210604.org",
+ "title": "JOTE meeting 20210604"
+ },
+ {
+ "id": "2f08dfa3-61e2-4648-b45e-963ab852f688",
+ "file": "/home/thomas/OneDrive/org-roam/20210507132839-a_space_is_just_a_set_with_some_structure.org",
+ "title": "A space is just a set with some structure"
+ },
+ {
+ "id": "2517c712-c625-4cd3-9d8e-93b37baeeac6",
+ "file": "/home/thomas/OneDrive/org-roam/20210309164800-the_wavefunction_of_the_fqhe_is_guessed_from_general_grounds.org",
+ "title": "The wavefunction of the FQHE is GUESSED from general grounds"
+ },
+ {
+ "id": "45f76d34-afef-47e0-9436-a8e7c4f8b18e",
+ "file": "/home/thomas/OneDrive/org-roam/20210512155809-position_is_the_geometric_phase_parameter_in_exchange_statistics.org",
+ "title": "Position is the geometric phase parameter in exchange-statistics"
+ },
+ {
+ "id": "bccd38a6-dfe2-4ac7-9aba-63717ac6374e",
+ "file": "/home/thomas/OneDrive/org-roam/20210413141328-the_standard_model_is_wrong_because_we_observed_neutrinon_oscillation.org",
+ "title": "The standard model is wrong because we observed neutrinon oscillation"
+ },
+ {
+ "id": "48bc42ba-ca1a-4614-b735-74ab0609a33d",
+ "file": "/home/thomas/OneDrive/org-roam/20210311100054-idealizations_employed_in_the_fqhe.org",
+ "title": "idealizations employed in the FQHE"
+ },
+ {
+ "id": "cb0659a9-ab48-42c9-a518-f059a12aeb0e",
+ "file": "/home/thomas/OneDrive/org-roam/20210319114314-adiabaticity_is_an_infinite_idealization.org",
+ "title": "Adiabaticity is an infinite idealization"
+ },
+ {
+ "id": "afc9fc68-2249-4309-be96-138c51dd941a",
+ "file": "/home/thomas/OneDrive/org-roam/20210212135133-the_role_of_a_teacher_is_to_facilitate_learning_for_the_student.org",
+ "title": "The role of a teacher is to facilitate learning for the student"
+ },
+ {
+ "id": "04689ceb-af4a-4b4a-9b5b-bc2dc5aca317",
+ "file": "/home/thomas/OneDrive/org-roam/generator.org",
+ "title": "Generator"
+ },
+ {
+ "id": "e794d4a6-761c-44ad-ae66-eb5a94273958",
+ "file": "/home/thomas/OneDrive/org-roam/20210501110454-i_hate_letting_people_suffer_negative_consequences_because_of_my_negligience.org",
+ "title": "I hate letting people suffer negative consequences because of my negligience"
+ },
+ {
+ "id": "e80bb390-dd5d-45b4-ac61-8ef7892ead84",
+ "file": "/home/thomas/OneDrive/org-roam/20210507155532-noether_s_theorem.org",
+ "title": "Noether's Theorem"
+ },
+ {
+ "id": "f472f7ab-a182-4bf4-855e-f5ab78b90a87",
+ "file": "/home/thomas/OneDrive/org-roam/20210223165225-landau_levels_in_an_electric_field.org",
+ "title": "Landau levels in an electric field"
+ },
+ {
+ "id": "3dd4c938-1173-4c86-9398-1af322d63239",
+ "file": "/home/thomas/OneDrive/org-roam/lectures_on_the_quantum_hall_effect.org",
+ "title": "lectures_on_the_quantum_hall_effect.org"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/Physics/QHE/TongD_2016_Lectures_on_the_Quantum_Hall_Effect.pdf-annot-13-7",
+ "file": "/home/thomas/OneDrive/org-roam/lectures_on_the_quantum_hall_effect.org",
+ "title": "ρ xy = 2π~ 1 e 2 ν ν ∈ Z"
+ },
+ {
+ "id": "cff5454f-1cca-49a9-ae0d-739df5b0b0b6",
+ "file": "/home/thomas/OneDrive/org-roam/weekly-todos.org",
+ "title": "Weekly TODOs"
+ },
+ {
+ "id": "36400a6e-56c1-4d37-b23f-2097c325e31f",
+ "file": "/home/thomas/OneDrive/org-roam/batterman2001.org",
+ "title": "Batterman2001: The Devil in the Details: Asymptotic Reasoning in Explanation, Reduction, and Emergence"
+ },
+ {
+ "id": "9199d16c-6f46-482c-a188-ce38d680775d",
+ "file": "/home/thomas/OneDrive/org-roam/20210505153946-intersecton.org",
+ "title": "Intersection"
+ },
+ {
+ "id": "cab6efcd-b205-45e7-8873-31026d149490",
+ "file": "/home/thomas/OneDrive/org-roam/20210223163618-degeneracy.org",
+ "title": "degeneracy"
+ },
+ {
+ "id": "07899edc-5aec-414e-8f99-b9f414a31f79",
+ "file": "/home/thomas/OneDrive/org-roam/20210314213822-i_want_to_be_philosophy_erdos.org",
+ "title": "I Want To Be Philosophy Erdos"
+ },
+ {
+ "id": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "file": "/home/thomas/OneDrive/org-roam/20210330154142-the_observability_of_internal_external_global_and_local_symmetries.org",
+ "title": "The observability of internal, external, global and local symmetries"
+ },
+ {
+ "id": "0de41b08-4649-425b-9201-9bfdbe5e88ea",
+ "file": "/home/thomas/OneDrive/org-roam/20210128150806-scientists_and_publishers_should_really_be_better_at_marketing.org",
+ "title": "scientists and publishers should really be better at marketing"
+ },
+ {
+ "id": "6abcbdbc-c817-4688-be54-1a7c534af1fa",
+ "file": "/home/thomas/OneDrive/org-roam/phase_factor.org",
+ "title": "Phase factor"
+ },
+ {
+ "id": "2349baf0-9228-4bb9-a9a9-86ebb2ecf030",
+ "file": "/home/thomas/OneDrive/org-roam/20210330165733-explanation_is_asymmetric.org",
+ "title": "Explanation is asymmetric"
+ },
+ {
+ "id": "c98192f6-09b5-4a85-a1a7-aab632829493",
+ "file": "/home/thomas/OneDrive/org-roam/20210218172455-universality.org",
+ "title": "universality"
+ },
+ {
+ "id": "5b4881e8-77dd-4b96-8ead-93b9d2b3071e",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190214-emacs_distributions_doom_vs_space.org",
+ "title": "Emacs distributions (doom vs space)"
+ },
+ {
+ "id": "880e8d46-7d8e-403a-877c-ad0da17348d4",
+ "file": "/home/thomas/OneDrive/org-roam/taking_it_easy_a_response_to_colyvan.org",
+ "title": "taking_it_easy_a_response_to_colyvan.org"
+ },
+ {
+ "id": "8ac0f67b-336c-4828-bb0f-e981494cf189",
+ "file": "/home/thomas/OneDrive/org-roam/20210125122002-i_need_to_get_warmed_up_in_order_to_start_doing_things.org",
+ "title": "I need to get warmed up in order to start doing things"
+ },
+ {
+ "id": "0f439030-4c44-4c62-88a1-eca8e027a3da",
+ "file": "/home/thomas/OneDrive/org-roam/20210525170640-overdescription_gauge_cover_ing_space.org",
+ "title": "Underdescription = gauge = cover(ing space)"
+ },
+ {
+ "id": "daa40373-7f4a-468d-b7a3-258a12eb9289",
+ "file": "/home/thomas/OneDrive/org-roam/20210606204432-things_take_time_and_that_s_okay.org",
+ "title": "Things take time, and that's okay"
+ },
+ {
+ "id": "c0baac3c-df95-44e9-8c78-5b4f8671232e",
+ "file": "/home/thomas/OneDrive/org-roam/20210131113816-family_resemblance.org",
+ "title": "family resemblance"
+ },
+ {
+ "id": "913ee774-c9c9-4476-a619-b62d0f351378",
+ "file": "/home/thomas/OneDrive/org-roam/20210416111824-open_ball.org",
+ "title": "Open ball"
+ },
+ {
+ "id": "1d5f8392-5e49-45b9-a998-e3b6636bff41",
+ "file": "/home/thomas/OneDrive/org-roam/20210309161230-iqhe_has_no_electron_interactions_fqhe_does.org",
+ "title": "IQHE has no electron interactions, FQHE does"
+ },
+ {
+ "id": "6f472b6b-f0d4-4242-a22b-ad0a5f1bbd4e",
+ "file": "/home/thomas/OneDrive/org-roam/20210316140758-the_practice_theory_mixup_problems_of_infinite_idealization_occur_in_science_in_general_as_well.org",
+ "title": "The practice/theory mixup problems of Infinite Idealization Occur in Science in General as Well"
+ },
+ {
+ "id": "6b2ed04b-2f78-433e-a641-4d20a7f8d712",
+ "file": "/home/thomas/OneDrive/org-roam/20210131135249-final_checklist_courses.org",
+ "title": "final checklist courses"
+ },
+ {
+ "id": "7f261de6-15bb-4970-b21b-e5437ea241d7",
+ "file": "/home/thomas/OneDrive/org-roam/20201107205940-first_draft.org",
+ "title": "First Draft"
+ },
+ {
+ "id": "d4852232-7218-41e8-ab75-ba2d216c99c4",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190454-doom_emacs_packages_in_100_seconds.org",
+ "title": "Doom emacs packages in 100 seconds"
+ },
+ {
+ "id": "c95cf3f6-d563-40cd-8914-7f5d501b0113",
+ "file": "/home/thomas/OneDrive/org-roam/20210131113244-there_are_more_transwomen_than_transmen.org",
+ "title": "there are more transwomen than transmen"
+ },
+ {
+ "id": "aa5fdff9-863c-4288-88ac-217f69b70cc1",
+ "file": "/home/thomas/OneDrive/org-roam/20210330155810-internal_symmetry.org",
+ "title": "internal symmetry"
+ },
+ {
+ "id": "b3d2d386-470f-4f7f-adcb-c1ac1be3e876",
+ "file": "/home/thomas/OneDrive/org-roam/Difficult Conversations.org",
+ "title": "Difficult Conversations"
+ },
+ {
+ "id": "6b83e5c7-e092-4e94-b3f7-849cce62bca2",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190512-org_mode_in_100_seconds.org",
+ "title": "org mode in 100 seconds"
+ },
+ {
+ "id": "9bf0e524-539c-43fb-924d-e7fa234d1b4b",
+ "file": "/home/thomas/OneDrive/org-roam/2021-01-14.org",
+ "title": "#+title: 2021-01-14"
+ },
+ {
+ "id": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "file": "/home/thomas/OneDrive/org-roam/20210316143612-fractional_quantum_statistics.org",
+ "title": "Fractional Quantum Statistics"
+ },
+ {
+ "id": "b6b8ec07-b1e0-4b35-b7cc-1ce42947f146",
+ "file": "/home/thomas/OneDrive/org-roam/20210505155223-image.org",
+ "title": "Image"
+ },
+ {
+ "id": "bf66c7bf-4489-4606-96b9-aba5e0ef43c3",
+ "file": "/home/thomas/OneDrive/org-roam/20210223165843-landau_gauge.org",
+ "title": "Landau Gauge"
+ },
+ {
+ "id": "f11abbe3-da85-4f8c-8914-552f991a3b00",
+ "file": "/home/thomas/OneDrive/org-roam/20210330160709-gauge_theory.org",
+ "title": "Gauge theory"
+ },
+ {
+ "id": "110a70ea-3f14-41f2-b450-048b5acb9034",
+ "file": "/home/thomas/OneDrive/org-roam/kosso2000.org",
+ "title": "Kosso2000: The Empirical Status of Symmetries in Physics"
+ },
+ {
+ "id": "0c43f375-3bdd-418c-9e3e-0f1f6a253dce",
+ "file": "/home/thomas/OneDrive/org-roam/20210101163130-shoulder_warmup.org",
+ "title": "shoulder warmup"
+ },
+ {
+ "id": "557cddd2-4269-4532-b93a-7a5101d98872",
+ "file": "/home/thomas/OneDrive/org-roam/20210106121546-objects_vs_concepts.org",
+ "title": "objects vs concepts"
+ },
+ {
+ "id": "81c6b736-e462-4780-879a-530dcfceccd5",
+ "file": "/home/thomas/OneDrive/org-roam/todo.org",
+ "title": "Inbox"
+ },
+ {
+ "id": "7583e35a-c327-443b-b0e5-c45c670421c6",
+ "file": "/home/thomas/OneDrive/org-roam/20210408191114-ipa_in_100_seconds.org",
+ "title": "IPA in 100 seconds"
+ },
+ {
+ "id": "a873a69f-ba4e-4377-8e39-640861c856f4",
+ "file": "/home/thomas/OneDrive/org-roam/20210403182527-covering_map.org",
+ "title": "Covering map"
+ },
+ {
+ "id": "b0e08530-ad69-4bb2-9457-5b004ab3481a",
+ "file": "/home/thomas/OneDrive/org-roam/20210505175404-continuous_at_a_point.org",
+ "title": "Continuous at a point"
+ },
+ {
+ "id": "fe87fdb4-b86b-48db-8a2d-eb402b095ad2",
+ "file": "/home/thomas/OneDrive/org-roam/cardinality.org",
+ "title": "Cardinality"
+ },
+ {
+ "id": "72bfc1f1-a0e7-4f66-9709-7c0ea3693abf",
+ "file": "/home/thomas/OneDrive/org-roam/20210315121005-fqhe_requires_intertwined_worldlines_not_2d.org",
+ "title": "FQHE Only Requires Intertwined Worldlines, Not 2D"
+ },
+ {
+ "id": "4aeebd45-da84-4d95-9195-e6905f5d095f",
+ "file": "/home/thomas/OneDrive/org-roam/20210330164324-it_makes_more_sense_to_think_of_explanation_as_graded_rather_than_binary.org",
+ "title": "It makes more sense to think of explanation as graded rather than binary"
+ },
+ {
+ "id": "5775b1e9-f5ac-4961-ad58-d3b139b4ad68",
+ "file": "/home/thomas/OneDrive/org-roam/20210312122743-excitations_of_the_lwf_ground_state_give_rise_to_quasi_holes_particles.org",
+ "title": "Excitations of the LWF Ground State Give Rise to Quasi-holes/particles"
+ },
+ {
+ "id": "fd7e2c4d-4ee2-4476-9729-33968c21062b",
+ "file": "/home/thomas/OneDrive/org-roam/20210201201133-verbs_are_like_a_coathang_where_you_can_hang_a_sentence_on.org",
+ "title": "Verbs are like a coathang where you can hang a sentence on"
+ },
+ {
+ "id": "bee2ce36-d91a-454b-8114-4ce08645d10f",
+ "file": "/home/thomas/OneDrive/org-roam/20210212141329-in_conversations_being_right_is_much_less_important_than_being_cooperative.org",
+ "title": "in conversations, being right is much less important than being cooperative"
+ },
+ {
+ "id": "2b42fed3-1c4d-4e02-bd35-9a4f6b53af30",
+ "file": "/home/thomas/OneDrive/org-roam/20210118211516-on_tags.org",
+ "title": "on tags"
+ },
+ {
+ "id": "b3563f9d-b89d-4255-9509-6c63943c095f",
+ "file": "/home/thomas/OneDrive/org-roam/20210131121906-are_most_people_trans_because_they_feel_the_other_gender_or_dislike_their_own_gender.org",
+ "title": "are (most) people trans because they feel the other gender or dislike their own gender"
+ },
+ {
+ "id": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "file": "/home/thomas/OneDrive/org-roam/20210319113940-fractional_statistics_can_only_be_calculated_using_adiabaticity.org",
+ "title": "Fractional statistics can only be calculated using adiabaticity"
+ },
+ {
+ "id": "837f70f5-94cf-4257-87cf-d9394ba2e8ba",
+ "file": "/home/thomas/OneDrive/org-roam/20210414155705-proof_ballspace_is_not_simply_connected.org",
+ "title": "Proof ballspace is not simply connected"
+ },
+ {
+ "id": "25895a4f-0428-4db5-b41d-5b1d46b30d48",
+ "file": "/home/thomas/OneDrive/org-roam/20210408190311-emacs_keybindings_in_100_seconds.org",
+ "title": "Emacs Keybindings in 100 seconds"
+ },
+ {
+ "id": "6854df4a-40f2-4672-ac71-294ceacece94",
+ "file": "/home/thomas/OneDrive/org-roam/reading without writing botes_deliberating is just as dumb as working out while trying to do as little work as possible.org",
+ "title": "reading without writing botes_deliberating is just as dumb as working out while trying to do as little work as possible.org"
+ },
+ {
+ "id": "a5590aa3-2d53-45d4-b7a7-f28f8c32ecbc",
+ "file": "/home/thomas/OneDrive/org-roam/lie_group.org",
+ "title": "Lie Group"
+ },
+ {
+ "id": "92b7d85e-a2d8-4db0-8dec-9994e8625acf",
+ "file": "/home/thomas/OneDrive/org-roam/Having one (inevitably flawed) comprehensive source of information is almost always better than having multiple, fragmented ones.org",
+ "title": "Having one comprehensive source is better than having multiple scattered ones"
+ },
+ {
+ "id": "fab92aca-8392-49e1-8c66-922fc37d77a1",
+ "file": "/home/thomas/OneDrive/org-roam/20210223165813-gauge_freedom.org",
+ "title": "gauge freedom"
+ },
+ {
+ "id": "920a2752-a83a-47f4-8e0d-4ad410acff93",
+ "file": "/home/thomas/OneDrive/org-roam/20201106185111-dulaco_meeting.org",
+ "title": "DuLaCo Meeting"
+ },
+ {
+ "id": "16c28b52-8850-460a-87b2-1d1cdb1f6580",
+ "file": "/home/thomas/OneDrive/org-roam/20210223163730-eigenstate.org",
+ "title": "eigenstate"
+ },
+ {
+ "id": "934df62f-db20-4c3f-917e-862161f797fc",
+ "file": "/home/thomas/OneDrive/org-roam/infinite_idealizations.org",
+ "title": "Norton2014: Infinite Idealizations"
+ },
+ {
+ "id": "/home/thomas/OneDrive/HPS/Thesis/Papers/Thesis/General/Explanation_Idealization/NortonJ_2014_Infinite_Idealizations.pdf-annot-4-0",
+ "file": "/home/thomas/OneDrive/org-roam/infinite_idealizations.org",
+ "title": "The essential starting point of the notion of idealization is that we have a consistently describable sys- tem, even if it is fi ctitious."
+ },
+ {
+ "id": "91cc9a2b-8dd0-45c9-990e-127c413b907e",
+ "file": "/home/thomas/OneDrive/org-roam/20210312123438-where_does_the_hole_wf_come_from.org",
+ "title": "where does the hole WF come from?"
+ },
+ {
+ "id": "c689d55b-6049-4452-9e85-4f04307e5be0",
+ "file": "/home/thomas/OneDrive/org-roam/shech2018.org",
+ "title": "Shech2018: Idealizations, essential self-adjointness, and minimal model explanation in the AharonovBohm effect"
+ },
+ {
+ "id": "82fe1fb4-c84f-4638-9785-bd89231e7c30",
+ "file": "/home/thomas/OneDrive/org-roam/20201103144713-boltzmann_entropy.org",
+ "title": "Boltzmann Entropy"
+ },
+ {
+ "id": "601beed9-3bd6-48bf-b2dc-eb4084fdd062",
+ "file": "/home/thomas/OneDrive/org-roam/20201204171610-4dec_11dec.org",
+ "title": "4dec-11dec"
+ },
+ {
+ "id": "68f00dbf-23aa-496a-9e05-df48f0793259",
+ "file": "/home/thomas/OneDrive/org-roam/20210316153501-the_fallacy_of_mathematics_wip.org",
+ "title": "The Fallacy of Mathematics (WIP)"
+ },
+ {
+ "id": "c2ab82ac-8f25-4f9e-aabe-9fe53484c1d3",
+ "file": "/home/thomas/OneDrive/org-roam/20210223152109-spin.org",
+ "title": "spin"
+ },
+ {
+ "id": "c78555dd-6890-476f-b478-93191bd74bf3",
+ "file": "/home/thomas/OneDrive/org-roam/minkowski_metric.org",
+ "title": "Minkowski Metric"
+ },
+ {
+ "id": "c49838cd-6024-4d9d-8eb3-3df31c529ceb",
+ "file": "/home/thomas/OneDrive/org-roam/20210218152830-fractional_quantum_statistics_is_the_study_of_anyons.org",
+ "title": "fractional quantum statistics is the study of anyons"
+ },
+ {
+ "id": "8dc66a21-b480-492e-b769-a58500bc4468",
+ "file": "/home/thomas/OneDrive/org-roam/vagueness_logic_and_ontology.org",
+ "title": "Varzi2001: Vagueness, Logic, and Ontology"
+ },
+ {
+ "id": "ae58af64-5a26-4562-ab67-ad270494ec16",
+ "file": "/home/thomas/OneDrive/org-roam/20210314211839-open_science_wants_to_copy_open_source_too_much.org",
+ "title": "Open Science Wants to Copy Open Source Too Much"
+ },
+ {
+ "id": "8c848baa-058b-43ca-ad0d-b96b0daabb7a",
+ "file": "/home/thomas/OneDrive/org-roam/20210503131837-topological_explanation_merely_requires_multiply_connected_regions_not_configurations_spaces.org",
+ "title": "Topological explanation merely requires multiply-connected regions, not configurations spaces"
+ },
+ {
+ "id": "ea07b959-daa1-4e44-bb4c-87b290920125",
+ "file": "/home/thomas/OneDrive/org-roam/2020-12-17.org",
+ "title": "2020-12-17"
+ },
+ {
+ "id": "cc1533ef-e8e9-4eb7-9f4e-a8b46ff7ca69",
+ "file": "/home/thomas/OneDrive/org-roam/20210122125624-what_do_people_want_from_our_websites.org",
+ "title": "what do people want from our websites"
+ },
+ {
+ "id": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "file": "/home/thomas/OneDrive/org-roam/20210408183854-i_want_to_make_fireship_style_videos_for_everything.org",
+ "title": "I want to make Fireship style videos for EVERYTHING"
+ },
+ {
+ "id": "b8853498-c72b-4e5f-b50b-d5196870e1a9",
+ "file": "/home/thomas/OneDrive/org-roam/2021-01-13.org",
+ "title": "#+title: 2021-01-13"
+ },
+ {
+ "id": "8f85f6a3-da87-421d-9b71-7b0f2c4c9ea8",
+ "file": "/home/thomas/OneDrive/org-roam/20210302154219-edge_modes.org",
+ "title": "edge modes"
+ },
+ {
+ "id": "af1ae4be-bc8b-4d6c-b87b-7add8711b6d6",
+ "file": "/home/thomas/OneDrive/org-roam/20210216120554-notes_on_shechs_description_of_fqhe.org",
+ "title": "notes on Shechs description of FQHE"
+ },
+ {
+ "id": "46d1e907-798c-474e-b36d-e41df8a0a5f4",
+ "file": "/home/thomas/OneDrive/org-roam/20201210191848-niet_denken_maar_doen.org",
+ "title": "eerst schrijven dan denken"
+ },
+ {
+ "id": "713d1881-5122-4ee2-8430-87d5748e15e4",
+ "file": "/home/thomas/OneDrive/org-roam/20210223160541-canonical_commutation_relation.org",
+ "title": "canonical commutation relation"
+ },
+ {
+ "id": "513da0c5-b2e5-4e32-b18c-ab765901f913",
+ "file": "/home/thomas/OneDrive/org-roam/20210403184255-commutation.org",
+ "title": "Commutation"
+ },
+ {
+ "id": "dc6b1689-a488-4d8a-82b6-9ecff5087d16",
+ "file": "/home/thomas/OneDrive/org-roam/20210503132021-regions_are_a_vague_concept.org",
+ "title": "Regions are a vague concept"
+ },
+ {
+ "id": "439233ec-f391-41ed-8179-05472fbc09a2",
+ "file": "/home/thomas/OneDrive/org-roam/20210516214617-the_wavefunction_with_phase_covers_the_wavefunction.org",
+ "title": "The wavefunction with phase covers the wavefunction squared"
+ },
+ {
+ "id": "eb39f8f9-7c96-4aa7-9344-d671fcd81532",
+ "file": "/home/thomas/OneDrive/org-roam/two_approaches_to_fractional_statistics_in_the_quantum_hall_effect_idealizations_and_the_curious_case_of_the_anyon.org",
+ "title": "Shech2015a: Two Approaches to Fractional Statistics in the Quantum Hall Effect: Idealizations and the Curious Case of the Anyon"
+ },
+ {
+ "id": "a3694051-3129-4f3b-873d-3fdb385bcdab",
+ "file": "/home/thomas/OneDrive/org-roam/dougherty2020b.org",
+ "title": "Dougherty2020b: The non-ideal theory of the AharonovBohm effect"
+ },
+ {
+ "id": "6933692a-0304-46bc-9327-0646d1c4c671",
+ "file": "/home/thomas/OneDrive/org-roam/20201109014528-argument_2.org",
+ "title": "Argument 2"
+ },
+ {
+ "id": "a1c3d4b6-baeb-4644-9799-a4c376e785a1",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132327-have_an_end_of_day_shutdown_ritual-archfaceThomas.org",
+ "title": "have an end of day shutdown ritual"
+ },
+ {
+ "id": "321146cd-2bcc-4cd9-baf7-b0f4f5c75da3",
+ "file": "/home/thomas/OneDrive/org-roam/app ideas.org",
+ "title": "Goodreads but for academic articles"
+ },
+ {
+ "id": "c0a0fa46-e6d5-404c-a567-1828972ccdad",
+ "file": "/home/thomas/OneDrive/org-roam/20210223152032-zeeman_splitting.org",
+ "title": "Zeeman splitting"
+ },
+ {
+ "id": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "file": "/home/thomas/OneDrive/org-roam/20210219124712-the_quantum_hall_effect_has_two_variations_integer_and_fractional.org",
+ "title": "the quantum hall effect has two variations, integer and fractional"
+ },
+ {
+ "id": "b38fb14b-d2c8-43b5-9bd9-7950b016be2a",
+ "file": "/home/thomas/OneDrive/org-roam/20210121111502-app_ideas.org",
+ "title": "app ideas"
+ },
+ {
+ "id": "ae8ed486-a7b3-42c7-a298-e5a4f3545200",
+ "file": "/home/thomas/OneDrive/org-roam/20201123102239-things_i_want_to_buy.org",
+ "title": "Things I want to buy"
+ },
+ {
+ "id": "279f6898-f667-498f-a01c-98afc9069017",
+ "file": "/home/thomas/OneDrive/org-roam/20210101132543-dont_underestimate_the_difference_schedules_and_environment_make_in_getting_deep_work_done.org",
+ "title": "dont underestimate the difference schedules and environment make in getting deep work done"
+ },
+ {
+ "id": "c67c895b-d974-42cc-b2e9-c4128af74b44",
+ "file": "/home/thomas/OneDrive/org-roam/20210319112136-you_can_only_be_good_at_so_many_things_at_the_same_time.org",
+ "title": "You can only be good at so many things at the same time"
+ },
+ {
+ "id": "fd3933d1-3045-4f3d-a9f4-e68e582c3f8f",
+ "file": "/home/thomas/OneDrive/org-roam/20210510182438-comments_of_the_autors_on_philbook.org",
+ "title": "Comments of the autors on philbook"
+ },
+ {
+ "id": "e9e3997b-048e-4b07-b2c2-355cb2bf6bb2",
+ "file": "/home/thomas/OneDrive/org-roam/20210311101513-the_value_of_the_qhe_plateaux_are_independent_of_the_sample.org",
+ "title": "the value of the QHE plateaux are independent of the sample"
+ },
+ {
+ "id": "b10edb04-99eb-46cd-af12-4fde2a7aff6a",
+ "file": "/home/thomas/OneDrive/org-roam/20210316143955-bose_eistein_statistics.org",
+ "title": "Bose-Eistein Statistics"
+ },
+ {
+ "id": "2380111f-1558-4b59-aeaf-ffec7c7f70d9",
+ "file": "/home/thomas/OneDrive/org-roam/20210518164940-email_to_guido_and_ronnie_about_geometrical_phase.org",
+ "title": "email to guido and ronnie about geometrical phase"
+ },
+ {
+ "id": "d87796bd-da4e-41e8-a692-4c24e030ad58",
+ "file": "/home/thomas/OneDrive/org-roam/20210330165429-philosophers_never_agree_with_dn_but_always_use_it.org",
+ "title": "Philosophers never agree with DN but always use it"
+ },
+ {
+ "id": "44cde2dc-fca6-4c00-a775-e3720b3daaa7",
+ "file": "/home/thomas/OneDrive/org-roam/Norton 2012 - Idealization vs Approximation.org",
+ "title": "Norton2012: Approximation and idealization: Why the difference matters"
+ },
+ {
+ "id": "df324e3c-ffb8-4521-bc24-4fafd273fc3b",
+ "file": "/home/thomas/OneDrive/org-roam/brown1999.org",
+ "title": "Brown1999: Remarks on identical particles in de Broglie-Bohm theory"
+ },
+ {
+ "id": "c0238bea-364a-41f9-8c3c-4e3540603ccb",
+ "file": "/home/thomas/OneDrive/org-roam/20210629135619-page_break_mode_notes.org",
+ "title": "page-break-mode notes"
+ },
+ {
+ "id": "b487c99a-59cb-408f-9a72-eb69963598db",
+ "file": "/home/thomas/OneDrive/org-roam/20210614002101-test.org",
+ "title": "Lorem"
+ },
+ {
+ "id": "0ccb925b-a505-4134-b097-44fd3a20a0b7",
+ "file": "/home/thomas/OneDrive/org-roam/simon1983.org",
+ "title": "Simon1983: Holonomy, the Quantum Adiabatic Theorem, and Berry's Phase"
+ },
+ {
+ "id": "d343ba0a-0f9d-40f1-9710-6a2724a85389",
+ "file": "/home/thomas/OneDrive/org-roam/20210706155905-dynamical_phase_factor.org",
+ "title": "Dynamical Phase factor"
+ },
+ {
+ "id": "ed833655-d7fa-4f84-95fa-3ddb77af2ae5",
+ "file": "/home/thomas/OneDrive/org-roam/20210706160326-schrodinger_equation.org",
+ "title": "Schrödinger Equation"
+ },
+ {
+ "id": "4fc8e36a-7809-4f06-ae38-cbe0a6ad22da",
+ "file": "/home/thomas/OneDrive/org-roam/20210706160326-schrodinger_equation.org",
+ "title": "Time-dependent Schrödinger equation"
+ },
+ {
+ "id": "0b5e14bd-264f-456a-92b3-4ef6dc008fa7",
+ "file": "/home/thomas/OneDrive/org-roam/20210706160326-schrodinger_equation.org",
+ "title": "Time-independent Schrödinger equation"
+ },
+ {
+ "id": "562ce63a-63cb-4d03-a1d9-43bcf3001d77",
+ "file": "/home/thomas/OneDrive/org-roam/20210706155520-adiabatic_theorem.org",
+ "title": "Adiabatic theorem"
+ },
+ {
+ "id": "aeb63a55-e56a-41c7-8bef-2b1ee7ba5a4f",
+ "file": "/home/thomas/OneDrive/org-roam/20210711222106-tress_make_me_happy.org",
+ "title": "Trees make me happy"
+ },
+ {
+ "id": "b7491bb2-49d2-4a79-8f27-e27944eeefbb",
+ "file": "/home/thomas/OneDrive/org-roam/20210711222655-exercise_makes_me_feel_confident.org",
+ "title": "Exercise makes me feel confident"
+ },
+ {
+ "id": "56022aeb-28c1-4dee-bcb1-6f1fbae1b782",
+ "file": "/home/thomas/OneDrive/org-roam/20210711222515-exercising_makes_me_happy.org",
+ "title": "Exercising makes me happy"
+ },
+ {
+ "id": "55ab32eb-52cc-476f-ba11-1f326d8545b4",
+ "file": "/home/thomas/OneDrive/org-roam/20210711222724-unhappiness_checklist.org",
+ "title": "Unhappiness checklist"
+ },
+ {
+ "id": "61af2123-c19b-4f80-9b10-610287e3297a",
+ "file": "/home/thomas/OneDrive/org-roam/20210711223316-screens_make_me_unhappy.org",
+ "title": "Screens make me unhappy"
+ },
+ {
+ "id": "a8133b00-1c77-41fc-b0cf-c5390d78af7f",
+ "file": "/home/thomas/OneDrive/org-roam/20210711222352-how_to_be_happy.org",
+ "title": "How to be happy"
+ },
+ {
+ "id": "481293d6-42ea-484a-975b-1cc5ba1708fa",
+ "file": "/home/thomas/OneDrive/org-roam/20210210135331-condition_of_adequacy_for_approximate_instantiation.org",
+ "title": "Condition of adequacy for approximate instantiation"
+ },
+ {
+ "id": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "file": "/home/thomas/OneDrive/org-roam/20210528160149-outline_anyons.org",
+ "title": "Outline Anyons"
+ }
+ ],
+ "links": [
+ {
+ "source": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "target": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e"
+ },
+ {
+ "source": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "target": "e6303312-f094-4dd9-9d74-568bd31a89ea"
+ },
+ {
+ "source": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "target": "af98c8b8-d6d1-4443-893a-0a516b3664d2"
+ },
+ {
+ "source": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "target": "e5db852b-a680-4f56-8a2d-cba2f13aecb4"
+ },
+ {
+ "source": "94719003-30b8-4262-b7b9-1ff3c2595997",
+ "target": "981201fc-c29a-4120-bf30-105110cd4a29"
+ },
+ {
+ "source": "bd8b598f-7c03-4f61-a250-f408e437232c",
+ "target": "607655ae-3263-4bd2-a03f-b4b877e42c1f"
+ },
+ {
+ "source": "bd8b598f-7c03-4f61-a250-f408e437232c",
+ "target": "2517c712-c625-4cd3-9d8e-93b37baeeac6"
+ },
+ {
+ "source": "bd8b598f-7c03-4f61-a250-f408e437232c",
+ "target": "2edc0c8e-4b45-438f-9b9f-288e2079925f"
+ },
+ {
+ "source": "82b954c4-7193-4a7f-aad0-f62f0ac16881",
+ "target": "a8133c82-3286-4af7-9e59-e124f5f5dcc7"
+ },
+ {
+ "source": "ac45b6a5-f72f-489c-b2e7-5a5ac1b0b61b",
+ "target": "79a2be17-799a-410d-9158-155f40c939f6"
+ },
+ {
+ "source": "ac45b6a5-f72f-489c-b2e7-5a5ac1b0b61b",
+ "target": "47841dc9-11ab-4565-9189-877bbabf774e"
+ },
+ {
+ "source": "ac45b6a5-f72f-489c-b2e7-5a5ac1b0b61b",
+ "target": "5ca54c81-f499-4559-81a0-31f5fc9cffe3"
+ },
+ {
+ "source": "ac45b6a5-f72f-489c-b2e7-5a5ac1b0b61b",
+ "target": "ca761542-373b-4dcb-8198-805513756a5f"
+ },
+ {
+ "source": "d06eff85-7065-41af-b0e4-bb0720f7d4ec",
+ "target": "46d1e907-798c-474e-b36d-e41df8a0a5f4"
+ },
+ {
+ "source": "45c7759a-0507-48c8-93d4-8a0e568faa1c",
+ "target": "1fbefa5c-d5a1-4061-a043-e7c2ffd7c596"
+ },
+ {
+ "source": "45c7759a-0507-48c8-93d4-8a0e568faa1c",
+ "target": "3c3b33a1-b8db-4be9-8acc-244cc7230172"
+ },
+ {
+ "source": "45c7759a-0507-48c8-93d4-8a0e568faa1c",
+ "target": "3a994964-7969-4297-a36c-13317886be47"
+ },
+ {
+ "source": "c1fb832a-c00d-48d5-8397-1cdd1f7617df",
+ "target": "c3f7a16c-62fa-4b2d-bf47-8ec1832bd118"
+ },
+ {
+ "source": "c1fb832a-c00d-48d5-8397-1cdd1f7617df",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "5441a486-c826-424d-a30a-e08b9208642b",
+ "target": "75068634-a939-42ae-815f-8c31d02cf5f5"
+ },
+ {
+ "source": "5441a486-c826-424d-a30a-e08b9208642b",
+ "target": "78d1b656-ccea-4028-9813-0b449b2d8922"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "c49838cd-6024-4d9d-8eb3-3df31c529ceb"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "69945ee0-4f04-419b-8680-e45203302491"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "edcab4d4-3171-4b32-9833-451bfc53bafa"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "c4cfc3fd-c497-44b6-80b3-a2ae6b35047b"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "a3ef6468-2bf3-42c8-a90c-2e9bd5f22941"
+ },
+ {
+ "source": "31cd49eb-770f-4d11-98b2-ca666b534201",
+ "target": "53544d19-a9ac-4e60-ae44-d0278698d130"
+ },
+ {
+ "source": "c7854060-7add-4349-a045-6a63292bc255",
+ "target": "479d3088-01ee-4224-86e8-e7ada158f9fe"
+ },
+ {
+ "source": "c7854060-7add-4349-a045-6a63292bc255",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "66fc979f-2e21-4469-8518-88a4aa19be9a",
+ "target": "8136709d-9d43-44f6-8904-d411973bcfdd"
+ },
+ {
+ "source": "c1875006-1a91-4c5d-9f7b-a7427b3b7cba",
+ "target": "4e447c8d-cd1e-45f2-a01a-39e6af1c742c"
+ },
+ {
+ "source": "c1875006-1a91-4c5d-9f7b-a7427b3b7cba",
+ "target": "cfe64b55-5624-413f-809b-236e78eeb62c"
+ },
+ {
+ "source": "e5db852b-a680-4f56-8a2d-cba2f13aecb4",
+ "target": "f25a5d3d-a827-462a-b5a3-eca42fd966c0"
+ },
+ {
+ "source": "5013d755-484e-4490-ac06-b2103815566e",
+ "target": "bb158d72-0b4b-4f9b-bd13-a0afb3ffbee3"
+ },
+ {
+ "source": "5013d755-484e-4490-ac06-b2103815566e",
+ "target": "bb158d72-0b4b-4f9b-bd13-a0afb3ffbee3"
+ },
+ {
+ "source": "5013d755-484e-4490-ac06-b2103815566e",
+ "target": "a873a69f-ba4e-4377-8e39-640861c856f4"
+ },
+ {
+ "source": "ca415422-1727-4863-ac9c-da7f6a588331",
+ "target": "1959e9a1-8e14-4ce7-981b-b04ea9d98bff"
+ },
+ {
+ "source": "ca415422-1727-4863-ac9c-da7f6a588331",
+ "target": "c78555dd-6890-476f-b478-93191bd74bf3"
+ },
+ {
+ "source": "475c6db1-e5a0-4ebb-8291-5454a9e6d12e",
+ "target": "be8fce0d-6f12-44ac-81df-8f4a17cd8821"
+ },
+ {
+ "source": "1d52c1b9-6924-4272-9b33-a600b103240a",
+ "target": "cab6efcd-b205-45e7-8873-31026d149490"
+ },
+ {
+ "source": "1d52c1b9-6924-4272-9b33-a600b103240a",
+ "target": "16c28b52-8850-460a-87b2-1d1cdb1f6580"
+ },
+ {
+ "source": "1d52c1b9-6924-4272-9b33-a600b103240a",
+ "target": "1780f5a9-7330-4491-be34-8f8f6e0e010c"
+ },
+ {
+ "source": "14706a8f-09ac-470b-bb95-27623dca914e",
+ "target": "a0bc11b4-c385-4284-8c52-2c1e3cc031ed"
+ },
+ {
+ "source": "a702a4a0-1987-4af7-931e-c6db269186b4",
+ "target": "50dd38aa-c38e-4cb8-88e7-24046c3d906d"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "bce603cd-3eea-4dbc-b188-153845a24e16"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "db39298a-cd09-457c-b438-f369418c2be2"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "a4d107d5-467a-48b1-9385-e3348f07d049"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "41a6a097-12e9-4a05-a6f6-f496fdf515ff"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "56d07c1b-54da-4876-b7c5-6b7d0cc08fe2"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "2562a804-ec65-45e4-bae7-be73e0980e97"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "83d73e23-610d-4977-8106-c8b4c78ba0c7"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "c1a2779f-73d4-491e-8d7b-02f04dd20776"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "2517c712-c625-4cd3-9d8e-93b37baeeac6"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "39621947-ed87-43ad-86d6-14a5e4f2b8c2"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "f5640b4e-737d-48e5-a8c0-512c284f986c"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "9edb93f2-bb71-42ed-8a72-89abaa8a5cc3"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "12bf23b8-7c2f-439b-84f1-92807e5f93b3"
+ },
+ {
+ "source": "a27646b2-08d9-4f2b-bf8b-c056d6599540",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "target": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583"
+ },
+ {
+ "source": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "target": "a9025da3-ae04-41d6-ab0d-fbff1bf35408"
+ },
+ {
+ "source": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "target": "ef908f45-f69b-47a4-9939-24d3daf244eb"
+ },
+ {
+ "source": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "target": "713d1881-5122-4ee2-8430-87d5748e15e4"
+ },
+ {
+ "source": "64033256-00bb-4f7f-aa9b-b65f317f67fc",
+ "target": "c56b569d-53b1-41bd-bd57-43af9c07882a"
+ },
+ {
+ "source": "fa5f4b7f-e222-4c6e-94c5-c2008dff7d26",
+ "target": "905665b3-dcf5-4c1e-99e6-86831cc228a0"
+ },
+ {
+ "source": "822397cd-4004-4cfe-ac87-8e1c9d2a9c28",
+ "target": "64f76ddf-8e57-4a51-a082-91598a3f2c8e"
+ },
+ {
+ "source": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff",
+ "target": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7"
+ },
+ {
+ "source": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff",
+ "target": "8ac0f67b-336c-4828-bb0f-e981494cf189"
+ },
+ {
+ "source": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff",
+ "target": "ea0af31d-6880-4acc-bdbc-09df08f82a64"
+ },
+ {
+ "source": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff",
+ "target": "0c43f375-3bdd-418c-9e3e-0f1f6a253dce"
+ },
+ {
+ "source": "981201fc-c29a-4120-bf30-105110cd4a29",
+ "target": "e5951430-da06-4482-a7d3-7ac17c718d65"
+ },
+ {
+ "source": "981201fc-c29a-4120-bf30-105110cd4a29",
+ "target": "4d1d4b14-fb53-41d2-bc0d-a1c197cc6df0"
+ },
+ {
+ "source": "981201fc-c29a-4120-bf30-105110cd4a29",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "981201fc-c29a-4120-bf30-105110cd4a29",
+ "target": "f1273fc1-07d3-447d-98ee-b8d5b7debb70"
+ },
+ {
+ "source": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476",
+ "target": "4b10bcb4-8337-4b3e-be7a-adab788f995c"
+ },
+ {
+ "source": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476",
+ "target": "2e0a3a59-3794-4b5f-8313-f630d88a7a87"
+ },
+ {
+ "source": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476",
+ "target": "803d6df6-3d4c-4471-b3bd-a022fad8d1ee"
+ },
+ {
+ "source": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476",
+ "target": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e"
+ },
+ {
+ "source": "77bd5fd3-4f1c-4b8c-a83e-ed8f386ae223",
+ "target": "b92ab975-c5e1-44e4-b0dd-bf9a9d92d218"
+ },
+ {
+ "source": "77bd5fd3-4f1c-4b8c-a83e-ed8f386ae223",
+ "target": "76e4a9a1-244c-4c89-b0b5-e67fdb452625"
+ },
+ {
+ "source": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583",
+ "target": "b9c034ae-c43c-488b-8c96-996789ac2695"
+ },
+ {
+ "source": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583",
+ "target": "b502892a-411c-4fa7-a88c-7141b640d0e7"
+ },
+ {
+ "source": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583",
+ "target": "948182b9-1c2d-4f52-b76b-51ee1c11a9cc"
+ },
+ {
+ "source": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583",
+ "target": "948182b9-1c2d-4f52-b76b-51ee1c11a9cc"
+ },
+ {
+ "source": "6546f4b1-b038-4961-821a-7341495fae1a",
+ "target": "25a5762d-db61-4f84-9962-b96e20c7e84b"
+ },
+ {
+ "source": "6546f4b1-b038-4961-821a-7341495fae1a",
+ "target": "9199d16c-6f46-482c-a188-ce38d680775d"
+ },
+ {
+ "source": "6546f4b1-b038-4961-821a-7341495fae1a",
+ "target": "a5805690-630c-4146-a677-ce8b3ba12700"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "08104a25-3b71-4932-97d8-7db721cbbcfe"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "4c40816b-3a86-471c-b225-ac7b6f988833"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "80ec693a-141b-468b-a062-a29cb5a798b4"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "b0c5254c-045f-4194-bb5c-022772f85a7a"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "79410b7f-6634-4010-96cd-9d2c81a4cd6c"
+ },
+ {
+ "source": "5a40714c-32b5-4277-b737-6a7c3a18e612",
+ "target": "2e6fa60e-0809-43c3-a4d9-54d961b23403"
+ },
+ {
+ "source": "949cedd8-4c37-46cb-8439-aaa582647ef8",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "d5074aea-3aab-4aa7-954c-7307e3907a17",
+ "target": "5ef0b428-994c-4b5b-bf8f-c8b2491baf24"
+ },
+ {
+ "source": "fc0a61f3-2c05-4c30-ac48-08b84203010a",
+ "target": "4b10bcb4-8337-4b3e-be7a-adab788f995c"
+ },
+ {
+ "source": "fc0a61f3-2c05-4c30-ac48-08b84203010a",
+ "target": "8d8aa787-6796-410f-82d8-965c44698794"
+ },
+ {
+ "source": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c",
+ "target": "2e0a3a59-3794-4b5f-8313-f630d88a7a87"
+ },
+ {
+ "source": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c",
+ "target": "c1fb832a-c00d-48d5-8397-1cdd1f7617df"
+ },
+ {
+ "source": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c",
+ "target": "896697ec-2e29-446e-9caf-7919b3639bdb"
+ },
+ {
+ "source": "c5da437c-60bb-45a3-86d5-718b14fd6733",
+ "target": "08b939e1-be1c-4614-9a61-60fa2fd40c66"
+ },
+ {
+ "source": "c5da437c-60bb-45a3-86d5-718b14fd6733",
+ "target": "e3e6db29-ca5c-438e-9aa9-3ee8b79c230f"
+ },
+ {
+ "source": "004ae04b-45b8-4a7a-97b9-56bc3a1d93a8",
+ "target": "ec241de1-fcb9-4020-9004-350e7113f3bf"
+ },
+ {
+ "source": "a23060fd-3415-4bc2-9fb8-e62d1238a31e",
+ "target": "5424b894-6107-48ff-ae87-4aa96b0bc996"
+ },
+ {
+ "source": "10c2686f-c1e0-48bd-bbb5-11d1c0e2d094",
+ "target": "bee2ce36-d91a-454b-8114-4ce08645d10f"
+ },
+ {
+ "source": "a4e3963d-0fc5-474b-b8e6-c62d26e00227",
+ "target": "c95cf3f6-d563-40cd-8914-7f5d501b0113"
+ },
+ {
+ "source": "a4e3963d-0fc5-474b-b8e6-c62d26e00227",
+ "target": "c34664d1-f062-4080-ae76-6a2b8878b67a"
+ },
+ {
+ "source": "a4e3963d-0fc5-474b-b8e6-c62d26e00227",
+ "target": "c34664d1-f062-4080-ae76-6a2b8878b67a"
+ },
+ {
+ "source": "a4e3963d-0fc5-474b-b8e6-c62d26e00227",
+ "target": "c95cf3f6-d563-40cd-8914-7f5d501b0113"
+ },
+ {
+ "source": "8d93c68e-6297-4ec0-b026-90fde4b43c53",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "8d93c68e-6297-4ec0-b026-90fde4b43c53",
+ "target": "913ee774-c9c9-4476-a619-b62d0f351378"
+ },
+ {
+ "source": "8d93c68e-6297-4ec0-b026-90fde4b43c53",
+ "target": "d4e7ecd5-3f71-4e10-b967-b9ad290c27e5"
+ },
+ {
+ "source": "4c40816b-3a86-471c-b225-ac7b6f988833",
+ "target": "f65d81b0-04ad-44e1-a45c-70bb3595ba3b"
+ },
+ {
+ "source": "dcf6aed7-3ff6-4a41-a5ca-150906314204",
+ "target": "5ef0b428-994c-4b5b-bf8f-c8b2491baf24"
+ },
+ {
+ "source": "41ef8c58-7d6d-413d-8f32-0e2b04c7949d",
+ "target": "91cc9a2b-8dd0-45c9-990e-127c413b907e"
+ },
+ {
+ "source": "41ef8c58-7d6d-413d-8f32-0e2b04c7949d",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "41ef8c58-7d6d-413d-8f32-0e2b04c7949d",
+ "target": "09d72e19-5fe2-445e-becb-86ef45bf86b0"
+ },
+ {
+ "source": "50207fe2-18a6-451f-84b8-3d3e934535fa",
+ "target": "4ab6fa70-e092-4c76-a6ca-33ef9d7493e8"
+ },
+ {
+ "source": "2a8826d4-52ec-40da-85c7-76d3deda2ee7",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "2a8826d4-52ec-40da-85c7-76d3deda2ee7",
+ "target": "f257174f-e4a0-42f4-b455-0e2ba307c301"
+ },
+ {
+ "source": "2a8826d4-52ec-40da-85c7-76d3deda2ee7",
+ "target": "8d93c68e-6297-4ec0-b026-90fde4b43c53"
+ },
+ {
+ "source": "2a8826d4-52ec-40da-85c7-76d3deda2ee7",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "05563633-dadc-49d6-a290-b4fe2ab83ec4",
+ "target": "f44e68f8-278a-47b5-b35d-53aed370a0da"
+ },
+ {
+ "source": "05563633-dadc-49d6-a290-b4fe2ab83ec4",
+ "target": "2e0a3a59-3794-4b5f-8313-f630d88a7a87"
+ },
+ {
+ "source": "1acf562b-77cf-458c-bfa1-e9497eae43bb",
+ "target": "a0765c92-7915-4d39-909b-7daeef0ee3dc"
+ },
+ {
+ "source": "1acf562b-77cf-458c-bfa1-e9497eae43bb",
+ "target": "a0765c92-7915-4d39-909b-7daeef0ee3dc"
+ },
+ {
+ "source": "1acf562b-77cf-458c-bfa1-e9497eae43bb",
+ "target": "c4f4d1f1-96a4-487d-b3f6-e4c88d654a81"
+ },
+ {
+ "source": "ad12f4af-6660-4450-b6b6-28f79429f5fd",
+ "target": "69e2c052-8aeb-4b71-9b17-ba64de9f2427"
+ },
+ {
+ "source": "ad12f4af-6660-4450-b6b6-28f79429f5fd",
+ "target": "004ae04b-45b8-4a7a-97b9-56bc3a1d93a8"
+ },
+ {
+ "source": "ad12f4af-6660-4450-b6b6-28f79429f5fd",
+ "target": "d9479fe0-dc08-46b3-9454-b06cfd4ced2e"
+ },
+ {
+ "source": "4f189b39-db6c-40b6-89c2-e0294562fc45",
+ "target": "87c540b3-83bb-4042-abc1-437d55ff874f"
+ },
+ {
+ "source": "4f189b39-db6c-40b6-89c2-e0294562fc45",
+ "target": "c258afc5-7614-4770-aac3-1b6bc58e0c44"
+ },
+ {
+ "source": "cfe64b55-5624-413f-809b-236e78eeb62c",
+ "target": "b784af73-3a94-4ee1-9d42-525a60dca48e"
+ },
+ {
+ "source": "1e1a5607-0cfe-4ee7-b382-65f9567b13a7",
+ "target": "ae58af64-5a26-4562-ab67-ad270494ec16"
+ },
+ {
+ "source": "24f62351-13e0-4179-b628-6e6ae199b1da",
+ "target": "bea97dbc-0250-485d-98cc-bc33fb5a1587"
+ },
+ {
+ "source": "32d4f910-5305-4e22-886f-5f823172aca3",
+ "target": "f44e68f8-278a-47b5-b35d-53aed370a0da"
+ },
+ {
+ "source": "32d4f910-5305-4e22-886f-5f823172aca3",
+ "target": "a873a69f-ba4e-4377-8e39-640861c856f4"
+ },
+ {
+ "source": "32d4f910-5305-4e22-886f-5f823172aca3",
+ "target": "9a6bd1ee-8403-43af-9a53-f68faf686e27"
+ },
+ {
+ "source": "2edc0c8e-4b45-438f-9b9f-288e2079925f",
+ "target": "af1ae4be-bc8b-4d6c-b87b-7add8711b6d6"
+ },
+ {
+ "source": "2edc0c8e-4b45-438f-9b9f-288e2079925f",
+ "target": "2517c712-c625-4cd3-9d8e-93b37baeeac6"
+ },
+ {
+ "source": "2edc0c8e-4b45-438f-9b9f-288e2079925f",
+ "target": "313b3f11-4c94-43af-a5fc-5712f3c02e10"
+ },
+ {
+ "source": "1aad6677-d406-41b6-aecf-be8c0b8e099f",
+ "target": "4c40816b-3a86-471c-b225-ac7b6f988833"
+ },
+ {
+ "source": "c34664d1-f062-4080-ae76-6a2b8878b67a",
+ "target": "c0baac3c-df95-44e9-8c78-5b4f8671232e"
+ },
+ {
+ "source": "c34664d1-f062-4080-ae76-6a2b8878b67a",
+ "target": "87f8854f-0fbb-4e29-b024-e1049ffc4e27"
+ },
+ {
+ "source": "0851b27e-f96a-4c37-836b-2e867c6e6774",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "0851b27e-f96a-4c37-836b-2e867c6e6774",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "0851b27e-f96a-4c37-836b-2e867c6e6774",
+ "target": "429093a9-7c54-4691-ae5f-949a311f5118"
+ },
+ {
+ "source": "0a7d3f8a-e26c-4eaf-910f-38a3db8cca30",
+ "target": "e91108cb-a755-4ffa-861d-b228b26f441e"
+ },
+ {
+ "source": "c3f7a16c-62fa-4b2d-bf47-8ec1832bd118",
+ "target": "429093a9-7c54-4691-ae5f-949a311f5118"
+ },
+ {
+ "source": "c3f7a16c-62fa-4b2d-bf47-8ec1832bd118",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "c3f7a16c-62fa-4b2d-bf47-8ec1832bd118",
+ "target": "1780f5a9-7330-4491-be34-8f8f6e0e010c"
+ },
+ {
+ "source": "4b96a02d-61a4-41c7-a626-579bf60d2ae7",
+ "target": "9acce413-ba7a-4b24-ab00-13772ed94437"
+ },
+ {
+ "source": "f1273fc1-07d3-447d-98ee-b8d5b7debb70",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "f1273fc1-07d3-447d-98ee-b8d5b7debb70",
+ "target": "e5951430-da06-4482-a7d3-7ac17c718d65"
+ },
+ {
+ "source": "f1273fc1-07d3-447d-98ee-b8d5b7debb70",
+ "target": "4b10bcb4-8337-4b3e-be7a-adab788f995c"
+ },
+ {
+ "source": "f1273fc1-07d3-447d-98ee-b8d5b7debb70",
+ "target": "af98c8b8-d6d1-4443-893a-0a516b3664d2"
+ },
+ {
+ "source": "f1273fc1-07d3-447d-98ee-b8d5b7debb70",
+ "target": "e6303312-f094-4dd9-9d74-568bd31a89ea"
+ },
+ {
+ "source": "05db1716-8384-4547-9c71-55f5e7277bf4",
+ "target": "0facab0b-4652-478e-962a-afb8cf9818bb"
+ },
+ {
+ "source": "025d3c91-e52f-4ccd-876f-3b5f8749c77d",
+ "target": "1959e9a1-8e14-4ce7-981b-b04ea9d98bff"
+ },
+ {
+ "source": "025d3c91-e52f-4ccd-876f-3b5f8749c77d",
+ "target": "6695b04e-7e0f-44b9-8402-266e5cc6ab02"
+ },
+ {
+ "source": "025d3c91-e52f-4ccd-876f-3b5f8749c77d",
+ "target": "55aac369-0acc-401e-95d4-0c41e32a7abb"
+ },
+ {
+ "source": "025d3c91-e52f-4ccd-876f-3b5f8749c77d",
+ "target": "c78555dd-6890-476f-b478-93191bd74bf3"
+ },
+ {
+ "source": "025d3c91-e52f-4ccd-876f-3b5f8749c77d",
+ "target": "ca415422-1727-4863-ac9c-da7f6a588331"
+ },
+ {
+ "source": "e5951430-da06-4482-a7d3-7ac17c718d65",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "fa1238e2-29b2-4685-816a-ec82b5e49e46",
+ "target": "e35ecfec-6fe4-4b28-a9c2-d2b0a598ac25"
+ },
+ {
+ "source": "fa1238e2-29b2-4685-816a-ec82b5e49e46",
+ "target": "a702a4a0-1987-4af7-931e-c6db269186b4"
+ },
+ {
+ "source": "fa1238e2-29b2-4685-816a-ec82b5e49e46",
+ "target": "f4e81ed9-51d5-4767-b920-6f983e58ca96"
+ },
+ {
+ "source": "d3cb6e55-c56d-4933-a4d8-d778238b2248",
+ "target": "71b7fa31-7712-4a3a-a3ff-825298ed86cd"
+ },
+ {
+ "source": "d3cb6e55-c56d-4933-a4d8-d778238b2248",
+ "target": "50207fe2-18a6-451f-84b8-3d3e934535fa"
+ },
+ {
+ "source": "d3cb6e55-c56d-4933-a4d8-d778238b2248",
+ "target": "c18acba0-88cd-48c2-bfa7-755bb15bee31"
+ },
+ {
+ "source": "15bca012-860d-4685-8ff4-bda2dbf2fca7",
+ "target": "ec0921e8-d9b2-4a4b-a95a-b638970bc679"
+ },
+ {
+ "source": "15bca012-860d-4685-8ff4-bda2dbf2fca7",
+ "target": "6734d031-a55d-4428-99f9-16cd9525a8f7"
+ },
+ {
+ "source": "15bca012-860d-4685-8ff4-bda2dbf2fca7",
+ "target": "83d73e23-610d-4977-8106-c8b4c78ba0c7"
+ },
+ {
+ "source": "e358c53a-eddc-46f4-b693-d4cc93d7210c",
+ "target": "475c6db1-e5a0-4ebb-8291-5454a9e6d12e"
+ },
+ {
+ "source": "e358c53a-eddc-46f4-b693-d4cc93d7210c",
+ "target": "deba623a-e0d9-4db3-96e3-3cf22681ef43"
+ },
+ {
+ "source": "be531c4b-59b0-4392-a134-0da5828a7692",
+ "target": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7"
+ },
+ {
+ "source": "bce603cd-3eea-4dbc-b188-153845a24e16",
+ "target": "78088a8e-cdbf-4f1f-8c86-0cc8d37b6afb"
+ },
+ {
+ "source": "bce603cd-3eea-4dbc-b188-153845a24e16",
+ "target": "64033256-00bb-4f7f-aa9b-b65f317f67fc"
+ },
+ {
+ "source": "bce603cd-3eea-4dbc-b188-153845a24e16",
+ "target": "edd5441b-c528-42a8-b34c-ab06925de205"
+ },
+ {
+ "source": "bce603cd-3eea-4dbc-b188-153845a24e16",
+ "target": "1d52c1b9-6924-4272-9b33-a600b103240a"
+ },
+ {
+ "source": "bce603cd-3eea-4dbc-b188-153845a24e16",
+ "target": "f472f7ab-a182-4bf4-855e-f5ab78b90a87"
+ },
+ {
+ "source": "82518b1f-cfb4-4e5f-b47e-9e3ebc665115",
+ "target": "c45736b9-4f0e-43ef-a8e5-4dcfc632b9f8"
+ },
+ {
+ "source": "82518b1f-cfb4-4e5f-b47e-9e3ebc665115",
+ "target": "cec627c3-5d81-44ed-9fb2-26742662d7cb"
+ },
+ {
+ "source": "82518b1f-cfb4-4e5f-b47e-9e3ebc665115",
+ "target": "652b4828-23da-49ac-ba48-b43d84aeb36a"
+ },
+ {
+ "source": "0b0dbc3b-2ac1-4005-868c-48241f61b80c",
+ "target": "5424b894-6107-48ff-ae87-4aa96b0bc996"
+ },
+ {
+ "source": "37bfaecb-92e6-4cd7-9735-2b6c940c0e03",
+ "target": "4d1d4b14-fb53-41d2-bc0d-a1c197cc6df0"
+ },
+ {
+ "source": "37bfaecb-92e6-4cd7-9735-2b6c940c0e03",
+ "target": "2bd50b77-d226-4853-8bf2-d0e69b570a53"
+ },
+ {
+ "source": "37bfaecb-92e6-4cd7-9735-2b6c940c0e03",
+ "target": "207301aa-718d-417a-b3c0-103264d7a88f"
+ },
+ {
+ "source": "37bfaecb-92e6-4cd7-9735-2b6c940c0e03",
+ "target": "edfca3ee-eb93-46ff-8e10-25794e4cd67e"
+ },
+ {
+ "source": "5bca3bd1-1312-4977-82e9-c5068fde1d9b",
+ "target": "5bca3bd1-1312-4977-82e9-c5068fde1d9b"
+ },
+ {
+ "source": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "target": "99de5040-7b83-4433-850a-6db2d16a629b"
+ },
+ {
+ "source": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "target": "37bfaecb-92e6-4cd7-9735-2b6c940c0e03"
+ },
+ {
+ "source": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "target": "0f8d8982-4c57-4aca-8803-bc6d0eef3e42"
+ },
+ {
+ "source": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "target": "f5e4542f-0c24-4f50-bdfc-5e6d39ab8001"
+ },
+ {
+ "source": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "target": "0e9ad6f0-a085-4a02-a889-d3ac0ceb907b"
+ },
+ {
+ "source": "588f9022-aa97-4f1c-8117-48cc32569afa",
+ "target": "2d68e306-1028-4c93-89a6-479a2e82379d"
+ },
+ {
+ "source": "1be7a59b-6157-45db-8f67-4b242d4c84d0",
+ "target": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e"
+ },
+ {
+ "source": "fd2450df-e046-4d9c-a350-2be198e7fd04",
+ "target": "57213ae1-eff2-4442-b04b-84706076061f"
+ },
+ {
+ "source": "fd2450df-e046-4d9c-a350-2be198e7fd04",
+ "target": "71b7fa31-7712-4a3a-a3ff-825298ed86cd"
+ },
+ {
+ "source": "78d1b656-ccea-4028-9813-0b449b2d8922",
+ "target": "f63020a8-6939-49eb-a653-a4c00e2e46ae"
+ },
+ {
+ "source": "2d68e306-1028-4c93-89a6-479a2e82379d",
+ "target": "8bbe288c-6531-49b4-b9be-8856bf55aa32"
+ },
+ {
+ "source": "2d68e306-1028-4c93-89a6-479a2e82379d",
+ "target": "8a05b076-292f-4b30-8882-ee85ef6020ce"
+ },
+ {
+ "source": "2d68e306-1028-4c93-89a6-479a2e82379d",
+ "target": "072542d6-2d83-41af-9495-aa46583c1ac9"
+ },
+ {
+ "source": "0448eeeb-d0dc-45ca-a850-caa8413b3640",
+ "target": "b415c998-f7c4-4c1c-a83d-9b5225282514"
+ },
+ {
+ "source": "0448eeeb-d0dc-45ca-a850-caa8413b3640",
+ "target": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e"
+ },
+ {
+ "source": "0448eeeb-d0dc-45ca-a850-caa8413b3640",
+ "target": "8884ca0d-a2b7-4021-8668-a54d7a8267c8"
+ },
+ {
+ "source": "bb158d72-0b4b-4f9b-bd13-a0afb3ffbee3",
+ "target": "a7f373ec-b8d9-4822-b969-44415e666a6a"
+ },
+ {
+ "source": "84779137-ff6a-463e-82cd-741475be1140",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "84779137-ff6a-463e-82cd-741475be1140",
+ "target": "025d3c91-e52f-4ccd-876f-3b5f8749c77d"
+ },
+ {
+ "source": "39621947-ed87-43ad-86d6-14a5e4f2b8c2",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "39621947-ed87-43ad-86d6-14a5e4f2b8c2",
+ "target": "8bc70aa3-afcb-422f-a92c-8b06f562df24"
+ },
+ {
+ "source": "39621947-ed87-43ad-86d6-14a5e4f2b8c2",
+ "target": "09d72e19-5fe2-445e-becb-86ef45bf86b0"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "b9c034ae-c43c-488b-8c96-996789ac2695"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "bce603cd-3eea-4dbc-b188-153845a24e16"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "573dfbd0-2b6c-43b2-a08c-37f174de35c3"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "5ef0b428-994c-4b5b-bf8f-c8b2491baf24"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "d5074aea-3aab-4aa7-954c-7307e3907a17"
+ },
+ {
+ "source": "464e340d-b172-43d3-9b45-0f73c0551c25",
+ "target": "a133889b-5982-43d1-a4c5-e46312369b52"
+ },
+ {
+ "source": "2e3c5d06-832e-4f7d-aa12-a8fbb9c4bdb3",
+ "target": "1b978913-f923-48e8-b1e7-d0a42527dd5b"
+ },
+ {
+ "source": "a0465da7-e969-4033-a102-55905c99769a",
+ "target": "e794d4a6-761c-44ad-ae66-eb5a94273958"
+ },
+ {
+ "source": "a0465da7-e969-4033-a102-55905c99769a",
+ "target": "dd6f3089-995d-4354-9140-fb6e4875a294"
+ },
+ {
+ "source": "a0465da7-e969-4033-a102-55905c99769a",
+ "target": "2d4ec4ea-c3ef-4ee1-90b4-17857fe8f21e"
+ },
+ {
+ "source": "f5e4542f-0c24-4f50-bdfc-5e6d39ab8001",
+ "target": "fc0a61f3-2c05-4c30-ac48-08b84203010a"
+ },
+ {
+ "source": "b0c5254c-045f-4194-bb5c-022772f85a7a",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ },
+ {
+ "source": "b0c5254c-045f-4194-bb5c-022772f85a7a",
+ "target": "08104a25-3b71-4932-97d8-7db721cbbcfe"
+ },
+ {
+ "source": "b0c5254c-045f-4194-bb5c-022772f85a7a",
+ "target": "5a40714c-32b5-4277-b737-6a7c3a18e612"
+ },
+ {
+ "source": "b0c5254c-045f-4194-bb5c-022772f85a7a",
+ "target": "b0c5254c-045f-4194-bb5c-022772f85a7a"
+ },
+ {
+ "source": "592de697-f611-46b4-bf0e-7069b9d02683",
+ "target": "24f62351-13e0-4179-b628-6e6ae199b1da"
+ },
+ {
+ "source": "c1a2779f-73d4-491e-8d7b-02f04dd20776",
+ "target": "64033256-00bb-4f7f-aa9b-b65f317f67fc"
+ },
+ {
+ "source": "02b6ff5c-6cae-468c-960b-6067c494c9d6",
+ "target": "a420af4a-97bf-4b87-8ab4-5f180808e27a"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "69945ee0-4f04-419b-8680-e45203302491"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "edcab4d4-3171-4b32-9833-451bfc53bafa"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "c2ab82ac-8f25-4f9e-aabe-9fe53484c1d3"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "8fc72829-7ad9-4c8a-b400-229add0957bb"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "bce603cd-3eea-4dbc-b188-153845a24e16"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "db39298a-cd09-457c-b438-f369418c2be2"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "a4d107d5-467a-48b1-9385-e3348f07d049"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "41a6a097-12e9-4a05-a6f6-f496fdf515ff"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "56d07c1b-54da-4876-b7c5-6b7d0cc08fe2"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "2562a804-ec65-45e4-bae7-be73e0980e97"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "83d73e23-610d-4977-8106-c8b4c78ba0c7"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "b415c998-f7c4-4c1c-a83d-9b5225282514"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "f472f7ab-a182-4bf4-855e-f5ab78b90a87"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "1d52c1b9-6924-4272-9b33-a600b103240a"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "64033256-00bb-4f7f-aa9b-b65f317f67fc"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "573dfbd0-2b6c-43b2-a08c-37f174de35c3"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "1d5f8392-5e49-45b9-a998-e3b6636bff41"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "bd8b598f-7c03-4f61-a250-f408e437232c"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "2517c712-c625-4cd3-9d8e-93b37baeeac6"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "607655ae-3263-4bd2-a03f-b4b877e42c1f"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "f5640b4e-737d-48e5-a8c0-512c284f986c"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "12bf23b8-7c2f-439b-84f1-92807e5f93b3"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "9edb93f2-bb71-42ed-8a72-89abaa8a5cc3"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "5775b1e9-f5ac-4961-ad58-d3b139b4ad68"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "b9c034ae-c43c-488b-8c96-996789ac2695"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "c1fb832a-c00d-48d5-8397-1cdd1f7617df"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "75068634-a939-42ae-815f-8c31d02cf5f5"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "837f70f5-94cf-4257-87cf-d9394ba2e8ba"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "7afb3d23-edad-45ad-97c1-58ac1ca6857d"
+ },
+ {
+ "source": "40453cb7-ee57-42b9-8180-cb973ce219c3",
+ "target": "8f75ad04-3266-4fbc-8159-9a5b7532ccb4"
+ },
+ {
+ "source": "76a2711e-8e05-4058-9808-3cefeffce717",
+ "target": "b93fa016-999a-4f1a-a471-8c631db1879a"
+ },
+ {
+ "source": "313b3f11-4c94-43af-a5fc-5712f3c02e10",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "afbe098d-aaae-4a63-8f16-80e750363f54",
+ "target": "699c72e4-3d39-4e06-ae3b-9f3bd4780203"
+ },
+ {
+ "source": "afbe098d-aaae-4a63-8f16-80e750363f54",
+ "target": "4b96a02d-61a4-41c7-a626-579bf60d2ae7"
+ },
+ {
+ "source": "afbe098d-aaae-4a63-8f16-80e750363f54",
+ "target": "5b5b1d93-8293-4d05-89b2-b0415c186d92"
+ },
+ {
+ "source": "5ff6e7ef-717d-40b1-a4de-daf4d3ac038a",
+ "target": "c67c895b-d974-42cc-b2e9-c4128af74b44"
+ },
+ {
+ "source": "4b5c6424-14de-4ac9-92ad-98c4881a1879",
+ "target": "71b7fa31-7712-4a3a-a3ff-825298ed86cd"
+ },
+ {
+ "source": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e",
+ "target": "803d6df6-3d4c-4471-b3bd-a022fad8d1ee"
+ },
+ {
+ "source": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e",
+ "target": "4b6fa3c6-3650-4f16-a651-838d3e964536"
+ },
+ {
+ "source": "6695b04e-7e0f-44b9-8402-266e5cc6ab02",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "6695b04e-7e0f-44b9-8402-266e5cc6ab02",
+ "target": "c78555dd-6890-476f-b478-93191bd74bf3"
+ },
+ {
+ "source": "6695b04e-7e0f-44b9-8402-266e5cc6ab02",
+ "target": "025d3c91-e52f-4ccd-876f-3b5f8749c77d"
+ },
+ {
+ "source": "6695b04e-7e0f-44b9-8402-266e5cc6ab02",
+ "target": "1959e9a1-8e14-4ce7-981b-b04ea9d98bff"
+ },
+ {
+ "source": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-3-1",
+ "target": "387f8c62-c2ce-422e-b43e-d5ba4d66f05b"
+ },
+ {
+ "source": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-7-0",
+ "target": "c0eb984b-d890-4625-884f-c5a1c0c3abd1"
+ },
+ {
+ "source": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/UffinkJ_2011_Subjective_Probability_and_Statistical_Physics.pdf-annot-18-0",
+ "target": "79a2be17-799a-410d-9158-155f40c939f6"
+ },
+ {
+ "source": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e",
+ "target": "3f765d0a-12aa-4c1c-b7b0-6e633a7ebbfe"
+ },
+ {
+ "source": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e",
+ "target": "017be746-f4e9-4678-a67d-5fb8b255cd92"
+ },
+ {
+ "source": "0b697698-9e37-4bd7-a833-5580e878925e",
+ "target": "26cf4180-c383-462c-8a35-2698bc11003a"
+ },
+ {
+ "source": "0b697698-9e37-4bd7-a833-5580e878925e",
+ "target": "f25a5d3d-a827-462a-b5a3-eca42fd966c0"
+ },
+ {
+ "source": "a12d8d0a-5036-4f17-b3e4-910afa0269fa",
+ "target": "2bd50b77-d226-4853-8bf2-d0e69b570a53"
+ },
+ {
+ "source": "a12d8d0a-5036-4f17-b3e4-910afa0269fa",
+ "target": "51a3a4c5-9019-4607-915a-05b1e5c02671"
+ },
+ {
+ "source": "26cf4180-c383-462c-8a35-2698bc11003a",
+ "target": "e5db852b-a680-4f56-8a2d-cba2f13aecb4"
+ },
+ {
+ "source": "26cf4180-c383-462c-8a35-2698bc11003a",
+ "target": "0b697698-9e37-4bd7-a833-5580e878925e"
+ },
+ {
+ "source": "26cf4180-c383-462c-8a35-2698bc11003a",
+ "target": "3c3b33a1-b8db-4be9-8acc-244cc7230172"
+ },
+ {
+ "source": "9b6689ee-0f75-41c3-836e-eedd79ff8a55",
+ "target": "9fe27d90-4d10-4215-a21f-7ace21c827c7"
+ },
+ {
+ "source": "9b6689ee-0f75-41c3-836e-eedd79ff8a55",
+ "target": "90aca3fd-8a96-43c8-a88c-d22745aae934"
+ },
+ {
+ "source": "3fac15f8-0852-48db-a6c6-9c1389cf85c8",
+ "target": "699c72e4-3d39-4e06-ae3b-9f3bd4780203"
+ },
+ {
+ "source": "3fac15f8-0852-48db-a6c6-9c1389cf85c8",
+ "target": "4b96a02d-61a4-41c7-a626-579bf60d2ae7"
+ },
+ {
+ "source": "3fac15f8-0852-48db-a6c6-9c1389cf85c8",
+ "target": "5b5b1d93-8293-4d05-89b2-b0415c186d92"
+ },
+ {
+ "source": "072542d6-2d83-41af-9495-aa46583c1ac9",
+ "target": "8bbe288c-6531-49b4-b9be-8856bf55aa32"
+ },
+ {
+ "source": "305bf122-f5a3-4b64-a465-1d24d54b693c",
+ "target": "e6303312-f094-4dd9-9d74-568bd31a89ea"
+ },
+ {
+ "source": "305bf122-f5a3-4b64-a465-1d24d54b693c",
+ "target": "625136f8-9529-46ab-9f18-204fcca628df"
+ },
+ {
+ "source": "fabbeef8-31fe-4144-860f-f01a4ee4aaf1",
+ "target": "3cf8ff6c-0ff4-4597-814c-d1b81aeaad67"
+ },
+ {
+ "source": "fabbeef8-31fe-4144-860f-f01a4ee4aaf1",
+ "target": "eadcc86c-506d-4bd2-8922-61de2f301806"
+ },
+ {
+ "source": "fabbeef8-31fe-4144-860f-f01a4ee4aaf1",
+ "target": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e"
+ },
+ {
+ "source": "761df6b4-1623-47aa-a996-6e6d50ac0e8e",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "761df6b4-1623-47aa-a996-6e6d50ac0e8e",
+ "target": "913ee774-c9c9-4476-a619-b62d0f351378"
+ },
+ {
+ "source": "761df6b4-1623-47aa-a996-6e6d50ac0e8e",
+ "target": "f257174f-e4a0-42f4-b455-0e2ba307c301"
+ },
+ {
+ "source": "87f8854f-0fbb-4e29-b024-e1049ffc4e27",
+ "target": "a4e3963d-0fc5-474b-b8e6-c62d26e00227"
+ },
+ {
+ "source": "87f8854f-0fbb-4e29-b024-e1049ffc4e27",
+ "target": "c95cf3f6-d563-40cd-8914-7f5d501b0113"
+ },
+ {
+ "source": "87f8854f-0fbb-4e29-b024-e1049ffc4e27",
+ "target": "b3563f9d-b89d-4255-9509-6c63943c095f"
+ },
+ {
+ "source": "273c7d2a-e23c-4991-b680-6af3cb1d9162",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "273c7d2a-e23c-4991-b680-6af3cb1d9162",
+ "target": "0448eeeb-d0dc-45ca-a850-caa8413b3640"
+ },
+ {
+ "source": "cec627c3-5d81-44ed-9fb2-26742662d7cb",
+ "target": "72b645ad-5de5-4f43-97dd-0d48dc6fdd7f"
+ },
+ {
+ "source": "02e9671c-5b26-41de-9adb-395e46900d6a",
+ "target": "14706a8f-09ac-470b-bb95-27623dca914e"
+ },
+ {
+ "source": "a4e0561b-4adb-473c-9d35-8cb29c429c96",
+ "target": "f309f07d-1509-4356-9547-97f101cefbb4"
+ },
+ {
+ "source": "e9b44c4b-4aa1-40e9-b52b-064df8e159a5",
+ "target": "b6c24e91-e450-4753-af3a-2cbc4605f60d"
+ },
+ {
+ "source": "e9b44c4b-4aa1-40e9-b52b-064df8e159a5",
+ "target": "ac45b6a5-f72f-489c-b2e7-5a5ac1b0b61b"
+ },
+ {
+ "source": "e9b44c4b-4aa1-40e9-b52b-064df8e159a5",
+ "target": "7f261de6-15bb-4970-b21b-e5437ea241d7"
+ },
+ {
+ "source": "ec2782b6-bd0d-46b2-a01f-9fe2f38f5c8c",
+ "target": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583"
+ },
+ {
+ "source": "ec2782b6-bd0d-46b2-a01f-9fe2f38f5c8c",
+ "target": "0035acdd-b286-4942-a440-30b854b236ab"
+ },
+ {
+ "source": "ec2782b6-bd0d-46b2-a01f-9fe2f38f5c8c",
+ "target": "af1ae4be-bc8b-4d6c-b87b-7add8711b6d6"
+ },
+ {
+ "source": "c615103d-1e0a-4b27-917c-70d935e267a6",
+ "target": "1c7c5c98-9acf-44e1-8921-4bb34eed0f92"
+ },
+ {
+ "source": "b92ab975-c5e1-44e4-b0dd-bf9a9d92d218",
+ "target": "76e4a9a1-244c-4c89-b0b5-e67fdb452625"
+ },
+ {
+ "source": "b92ab975-c5e1-44e4-b0dd-bf9a9d92d218",
+ "target": "b1667b51-b5c4-4b99-934e-9f071c76b507"
+ },
+ {
+ "source": "a283fa45-22fc-4aec-b5a1-ac6c0af9950c",
+ "target": "9acce413-ba7a-4b24-ab00-13772ed94437"
+ },
+ {
+ "source": "a283fa45-22fc-4aec-b5a1-ac6c0af9950c",
+ "target": "ea0af31d-6880-4acc-bdbc-09df08f82a64"
+ },
+ {
+ "source": "0facab0b-4652-478e-962a-afb8cf9818bb",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "0facab0b-4652-478e-962a-afb8cf9818bb",
+ "target": "8d93c68e-6297-4ec0-b026-90fde4b43c53"
+ },
+ {
+ "source": "0facab0b-4652-478e-962a-afb8cf9818bb",
+ "target": "9bf1101b-fbba-4740-b101-7c98e9b0df41"
+ },
+ {
+ "source": "2fa90488-38aa-478f-bc3a-2290fb9def10",
+ "target": "48bc42ba-ca1a-4614-b735-74ab0609a33d"
+ },
+ {
+ "source": "480b61a1-987c-4dfd-8933-57b9613868bd",
+ "target": "a1c3d4b6-baeb-4644-9799-a4c376e785a1"
+ },
+ {
+ "source": "9a102d0f-bbd5-421d-af39-854eb34cb8a3",
+ "target": "0efec85b-7a67-4c32-9760-73a6f663e713"
+ },
+ {
+ "source": "9a102d0f-bbd5-421d-af39-854eb34cb8a3",
+ "target": "76a2711e-8e05-4058-9808-3cefeffce717"
+ },
+ {
+ "source": "9a102d0f-bbd5-421d-af39-854eb34cb8a3",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ },
+ {
+ "source": "b77047a2-24b9-4b2b-8891-e6b45c4e43fa",
+ "target": "2e82330a-c348-43c7-bd93-213859d832c5"
+ },
+ {
+ "source": "387f8c62-c2ce-422e-b43e-d5ba4d66f05b",
+ "target": "938cd116-d01e-4f84-828e-cb0bce730afa"
+ },
+ {
+ "source": "1d2d3aac-4dcf-4533-9358-f099a69878af",
+ "target": "a420af4a-97bf-4b87-8ab4-5f180808e27a"
+ },
+ {
+ "source": "1d2d3aac-4dcf-4533-9358-f099a69878af",
+ "target": "c2ab82ac-8f25-4f9e-aabe-9fe53484c1d3"
+ },
+ {
+ "source": "1d2d3aac-4dcf-4533-9358-f099a69878af",
+ "target": "c0a0fa46-e6d5-404c-a567-1828972ccdad"
+ },
+ {
+ "source": "c18acba0-88cd-48c2-bfa7-755bb15bee31",
+ "target": "aa5fdff9-863c-4288-88ac-217f69b70cc1"
+ },
+ {
+ "source": "c18acba0-88cd-48c2-bfa7-755bb15bee31",
+ "target": "deba623a-e0d9-4db3-96e3-3cf22681ef43"
+ },
+ {
+ "source": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "target": "8ac0f67b-336c-4828-bb0f-e981494cf189"
+ },
+ {
+ "source": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "target": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff"
+ },
+ {
+ "source": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "target": "e7ba78fd-c700-41b0-af2f-0ca8b862ab66"
+ },
+ {
+ "source": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "target": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7"
+ },
+ {
+ "source": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "target": "e7ba78fd-c700-41b0-af2f-0ca8b862ab66"
+ },
+ {
+ "source": "ea0af31d-6880-4acc-bdbc-09df08f82a64",
+ "target": "e7ba78fd-c700-41b0-af2f-0ca8b862ab66"
+ },
+ {
+ "source": "c56b569d-53b1-41bd-bd57-43af9c07882a",
+ "target": "6734d031-a55d-4428-99f9-16cd9525a8f7"
+ },
+ {
+ "source": "af98c8b8-d6d1-4443-893a-0a516b3664d2",
+ "target": "57213ae1-eff2-4442-b04b-84706076061f"
+ },
+ {
+ "source": "af98c8b8-d6d1-4443-893a-0a516b3664d2",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "af98c8b8-d6d1-4443-893a-0a516b3664d2",
+ "target": "429093a9-7c54-4691-ae5f-949a311f5118"
+ },
+ {
+ "source": "af98c8b8-d6d1-4443-893a-0a516b3664d2",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "af98c8b8-d6d1-4443-893a-0a516b3664d2",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "c79acc9d-b1d6-4054-9031-ea6bd6a00b4e",
+ "target": "b8d7cc1f-a10e-4257-91bb-f9231a0481a5"
+ },
+ {
+ "source": "c79acc9d-b1d6-4054-9031-ea6bd6a00b4e",
+ "target": "fc8347d6-2935-49bb-98a7-ff72d52e5e0b"
+ },
+ {
+ "source": "c79acc9d-b1d6-4054-9031-ea6bd6a00b4e",
+ "target": "74a3624f-ca91-499a-998a-9be79b49aeb1"
+ },
+ {
+ "source": "9a6bd1ee-8403-43af-9a53-f68faf686e27",
+ "target": "1c7c5c98-9acf-44e1-8921-4bb34eed0f92"
+ },
+ {
+ "source": "9a6bd1ee-8403-43af-9a53-f68faf686e27",
+ "target": "b6b8ec07-b1e0-4b35-b7cc-1ce42947f146"
+ },
+ {
+ "source": "9a6bd1ee-8403-43af-9a53-f68faf686e27",
+ "target": "c615103d-1e0a-4b27-917c-70d935e267a6"
+ },
+ {
+ "source": "9a6bd1ee-8403-43af-9a53-f68faf686e27",
+ "target": "1b978913-f923-48e8-b1e7-d0a42527dd5b"
+ },
+ {
+ "source": "02efc391-fd46-4d2e-84e2-e191e90cc0c7",
+ "target": "c49838cd-6024-4d9d-8eb3-3df31c529ceb"
+ },
+ {
+ "source": "02efc391-fd46-4d2e-84e2-e191e90cc0c7",
+ "target": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e"
+ },
+ {
+ "source": "02efc391-fd46-4d2e-84e2-e191e90cc0c7",
+ "target": "a3ef6468-2bf3-42c8-a90c-2e9bd5f22941"
+ },
+ {
+ "source": "3c3b33a1-b8db-4be9-8acc-244cc7230172",
+ "target": "1fbefa5c-d5a1-4061-a043-e7c2ffd7c596"
+ },
+ {
+ "source": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "target": "8fc72829-7ad9-4c8a-b400-229add0957bb"
+ },
+ {
+ "source": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "target": "c49838cd-6024-4d9d-8eb3-3df31c529ceb"
+ },
+ {
+ "source": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "target": "c98192f6-09b5-4a85-a1a7-aab632829493"
+ },
+ {
+ "source": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "target": "b415c998-f7c4-4c1c-a83d-9b5225282514"
+ },
+ {
+ "source": "a420af4a-97bf-4b87-8ab4-5f180808e27a",
+ "target": "e9e3997b-048e-4b07-b2c2-355cb2bf6bb2"
+ },
+ {
+ "source": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7",
+ "target": "9acce413-ba7a-4b24-ab00-13772ed94437"
+ },
+ {
+ "source": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7",
+ "target": "92ba6235-1786-4612-8f55-5a79105aa570"
+ },
+ {
+ "source": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7",
+ "target": "ea0af31d-6880-4acc-bdbc-09df08f82a64"
+ },
+ {
+ "source": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7",
+ "target": "cfe64b55-5624-413f-809b-236e78eeb62c"
+ },
+ {
+ "source": "ab40bc7e-2669-4ecc-b02a-17b8cf20b9e7",
+ "target": "a283fa45-22fc-4aec-b5a1-ac6c0af9950c"
+ },
+ {
+ "source": "b99e36c9-b494-4c8a-a0b9-3573e7caf4d7",
+ "target": "1780f5a9-7330-4491-be34-8f8f6e0e010c"
+ },
+ {
+ "source": "ce695b2b-1054-480b-83f2-3b1d2e53c298",
+ "target": "d9479fe0-dc08-46b3-9454-b06cfd4ced2e"
+ },
+ {
+ "source": "ce695b2b-1054-480b-83f2-3b1d2e53c298",
+ "target": "9b6689ee-0f75-41c3-836e-eedd79ff8a55"
+ },
+ {
+ "source": "edfca3ee-eb93-46ff-8e10-25794e4cd67e",
+ "target": "8fc72829-7ad9-4c8a-b400-229add0957bb"
+ },
+ {
+ "source": "f44e68f8-278a-47b5-b35d-53aed370a0da",
+ "target": "a873a69f-ba4e-4377-8e39-640861c856f4"
+ },
+ {
+ "source": "101c2d08-afcf-477f-8a76-7f70966bbe63",
+ "target": "ad600caa-8176-4353-ace6-3c8842260c6c"
+ },
+ {
+ "source": "4ae799af-3a59-413c-9bc2-1886f078cf70",
+ "target": "c79acc9d-b1d6-4054-9031-ea6bd6a00b4e"
+ },
+ {
+ "source": "582866bf-f015-4bae-b8ca-307450e77d49",
+ "target": "d5074aea-3aab-4aa7-954c-7307e3907a17"
+ },
+ {
+ "source": "a226fa3f-7a60-4f59-83df-98976b17d0eb",
+ "target": "fc6472a8-6abb-41d9-b73e-d019d6093869"
+ },
+ {
+ "source": "8b14c42a-cce5-4be1-b740-c051397a06c2",
+ "target": "b671608b-4efc-4c3a-afea-5e392abaa86c"
+ },
+ {
+ "source": "8b14c42a-cce5-4be1-b740-c051397a06c2",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "8b14c42a-cce5-4be1-b740-c051397a06c2",
+ "target": "1b978913-f923-48e8-b1e7-d0a42527dd5b"
+ },
+ {
+ "source": "8b14c42a-cce5-4be1-b740-c051397a06c2",
+ "target": "0facab0b-4652-478e-962a-afb8cf9818bb"
+ },
+ {
+ "source": "8b14c42a-cce5-4be1-b740-c051397a06c2",
+ "target": "2e3c5d06-832e-4f7d-aa12-a8fbb9c4bdb3"
+ },
+ {
+ "source": "e6303312-f094-4dd9-9d74-568bd31a89ea",
+ "target": "a07166f2-4a5c-40e6-a312-bc04b1b3d97e"
+ },
+ {
+ "source": "90b942e4-ed45-4fd2-909f-e74312c2dab0",
+ "target": "4ab6fa70-e092-4c76-a6ca-33ef9d7493e8"
+ },
+ {
+ "source": "90b942e4-ed45-4fd2-909f-e74312c2dab0",
+ "target": "1aad6677-d406-41b6-aecf-be8c0b8e099f"
+ },
+ {
+ "source": "90b942e4-ed45-4fd2-909f-e74312c2dab0",
+ "target": "8aeed50e-4ba6-46f3-b1d2-4fdd0557951f"
+ },
+ {
+ "source": "e56af431-8894-47e5-a752-97ae1e1a2848",
+ "target": "fc0a61f3-2c05-4c30-ac48-08b84203010a"
+ },
+ {
+ "source": "e56af431-8894-47e5-a752-97ae1e1a2848",
+ "target": "1fbefa5c-d5a1-4061-a043-e7c2ffd7c596"
+ },
+ {
+ "source": "e56af431-8894-47e5-a752-97ae1e1a2848",
+ "target": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e"
+ },
+ {
+ "source": "e56af431-8894-47e5-a752-97ae1e1a2848",
+ "target": "4b10bcb4-8337-4b3e-be7a-adab788f995c"
+ },
+ {
+ "source": "0efec85b-7a67-4c32-9760-73a6f663e713",
+ "target": "b93fa016-999a-4f1a-a471-8c631db1879a"
+ },
+ {
+ "source": "0efec85b-7a67-4c32-9760-73a6f663e713",
+ "target": "2349baf0-9228-4bb9-a9a9-86ebb2ecf030"
+ },
+ {
+ "source": "ed9abae9-2e87-41f7-add2-0e436d1831be",
+ "target": "78f5434e-ad00-4cc8-819f-7f9616ca7589"
+ },
+ {
+ "source": "ed9abae9-2e87-41f7-add2-0e436d1831be",
+ "target": "313f0a05-b6e3-43f8-8f2f-f004790dc798"
+ },
+ {
+ "source": "ed9abae9-2e87-41f7-add2-0e436d1831be",
+ "target": "fabbeef8-31fe-4144-860f-f01a4ee4aaf1"
+ },
+ {
+ "source": "ed9abae9-2e87-41f7-add2-0e436d1831be",
+ "target": "a3ef6468-2bf3-42c8-a90c-2e9bd5f22941"
+ },
+ {
+ "source": "8a05b076-292f-4b30-8882-ee85ef6020ce",
+ "target": "e33a9a8c-05a7-465a-8b52-03b53923dc4e"
+ },
+ {
+ "source": "8a05b076-292f-4b30-8882-ee85ef6020ce",
+ "target": "8bbe288c-6531-49b4-b9be-8856bf55aa32"
+ },
+ {
+ "source": "8a05b076-292f-4b30-8882-ee85ef6020ce",
+ "target": "a28d10e8-9398-4cad-b795-cb177650fd66"
+ },
+ {
+ "source": "8a05b076-292f-4b30-8882-ee85ef6020ce",
+ "target": "76e4a9a1-244c-4c89-b0b5-e67fdb452625"
+ },
+ {
+ "source": "b6c24e91-e450-4753-af3a-2cbc4605f60d",
+ "target": "e9b44c4b-4aa1-40e9-b52b-064df8e159a5"
+ },
+ {
+ "source": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-2-0",
+ "target": "05e035ce-eea9-4100-a381-4bd44a34f730"
+ },
+ {
+ "source": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-3-5",
+ "target": "82fe1fb4-c84f-4638-9785-bd89231e7c30"
+ },
+ {
+ "source": "/mnt/c/Users/thoma/OneDrive/HPS/Thesis/Papers/Thesis/Physics/Foundations_of_SM/JaynesE_1957_Information_Theory_and_Statistical_Mechanics.pdf-annot-7-2",
+ "target": "d6c7efd2-014f-4692-9538-f3569e5283d3"
+ },
+ {
+ "source": "b1667b51-b5c4-4b99-934e-9f071c76b507",
+ "target": "1daf9cd9-f9ed-444e-aa1b-df2281be3a34"
+ },
+ {
+ "source": "e28cf1ba-433a-46ea-baf2-260df85ba7ec",
+ "target": "d5074aea-3aab-4aa7-954c-7307e3907a17"
+ },
+ {
+ "source": "e28cf1ba-433a-46ea-baf2-260df85ba7ec",
+ "target": "a133889b-5982-43d1-a4c5-e46312369b52"
+ },
+ {
+ "source": "e28cf1ba-433a-46ea-baf2-260df85ba7ec",
+ "target": "ac38176f-a082-4073-a084-f258b4db6efe"
+ },
+ {
+ "source": "e28cf1ba-433a-46ea-baf2-260df85ba7ec",
+ "target": "91cc9a2b-8dd0-45c9-990e-127c413b907e"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "e94cf4f9-71a7-4717-a9b7-5881c3679461"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "c4cfc3fd-c497-44b6-80b3-a2ae6b35047b"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "479d3088-01ee-4224-86e8-e7ada158f9fe"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "313f0a05-b6e3-43f8-8f2f-f004790dc798"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "75068634-a939-42ae-815f-8c31d02cf5f5"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "41ef8c58-7d6d-413d-8f32-0e2b04c7949d"
+ },
+ {
+ "source": "3dad96b9-a6bf-449f-981e-4e141f865dd5",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "8884ca0d-a2b7-4021-8668-a54d7a8267c8",
+ "target": "0448eeeb-d0dc-45ca-a850-caa8413b3640"
+ },
+ {
+ "source": "8884ca0d-a2b7-4021-8668-a54d7a8267c8",
+ "target": "5e598557-43cc-48c3-ad9d-6b9c639214df"
+ },
+ {
+ "source": "b450a866-ad0d-4452-bb83-e7e169787953",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "b450a866-ad0d-4452-bb83-e7e169787953",
+ "target": "2a8826d4-52ec-40da-85c7-76d3deda2ee7"
+ },
+ {
+ "source": "b450a866-ad0d-4452-bb83-e7e169787953",
+ "target": "d4e7ecd5-3f71-4e10-b967-b9ad290c27e5"
+ },
+ {
+ "source": "f0b78212-d6ba-495e-a3bc-cb02176d4f0c",
+ "target": "32d4f910-5305-4e22-886f-5f823172aca3"
+ },
+ {
+ "source": "429093a9-7c54-4691-ae5f-949a311f5118",
+ "target": "6734d031-a55d-4428-99f9-16cd9525a8f7"
+ },
+ {
+ "source": "429093a9-7c54-4691-ae5f-949a311f5118",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "2e6fa60e-0809-43c3-a4d9-54d961b23403",
+ "target": "552da469-86ec-401c-9125-5aa40eb89fcf"
+ },
+ {
+ "source": "2e6fa60e-0809-43c3-a4d9-54d961b23403",
+ "target": "79410b7f-6634-4010-96cd-9d2c81a4cd6c"
+ },
+ {
+ "source": "2e6fa60e-0809-43c3-a4d9-54d961b23403",
+ "target": "5a40714c-32b5-4277-b737-6a7c3a18e612"
+ },
+ {
+ "source": "edd5441b-c528-42a8-b34c-ab06925de205",
+ "target": "6734d031-a55d-4428-99f9-16cd9525a8f7"
+ },
+ {
+ "source": "edd5441b-c528-42a8-b34c-ab06925de205",
+ "target": "fab92aca-8392-49e1-8c66-922fc37d77a1"
+ },
+ {
+ "source": "edd5441b-c528-42a8-b34c-ab06925de205",
+ "target": "bf66c7bf-4489-4606-96b9-aba5e0ef43c3"
+ },
+ {
+ "source": "edd5441b-c528-42a8-b34c-ab06925de205",
+ "target": "f5640b4e-737d-48e5-a8c0-512c284f986c"
+ },
+ {
+ "source": "dbe6233d-e0e1-4f89-9f93-ae30a1664cb4",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ },
+ {
+ "source": "dbe6233d-e0e1-4f89-9f93-ae30a1664cb4",
+ "target": "513da0c5-b2e5-4e32-b18c-ab765901f913"
+ },
+ {
+ "source": "d4e7ecd5-3f71-4e10-b967-b9ad290c27e5",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "d4e7ecd5-3f71-4e10-b967-b9ad290c27e5",
+ "target": "761df6b4-1623-47aa-a996-6e6d50ac0e8e"
+ },
+ {
+ "source": "87c540b3-83bb-4042-abc1-437d55ff874f",
+ "target": "3c3b33a1-b8db-4be9-8acc-244cc7230172"
+ },
+ {
+ "source": "5061d36d-a542-45d3-b76a-b6744c0df01a",
+ "target": "949cedd8-4c37-46cb-8439-aaa582647ef8"
+ },
+ {
+ "source": "5061d36d-a542-45d3-b76a-b6744c0df01a",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "5061d36d-a542-45d3-b76a-b6744c0df01a",
+ "target": "8d93c68e-6297-4ec0-b026-90fde4b43c53"
+ },
+ {
+ "source": "ed909983-c859-4e7c-a311-aeccfdd17e69",
+ "target": "f5e4542f-0c24-4f50-bdfc-5e6d39ab8001"
+ },
+ {
+ "source": "ed909983-c859-4e7c-a311-aeccfdd17e69",
+ "target": "d06eff85-7065-41af-b0e4-bb0720f7d4ec"
+ },
+ {
+ "source": "ed909983-c859-4e7c-a311-aeccfdd17e69",
+ "target": "82518b1f-cfb4-4e5f-b47e-9e3ebc665115"
+ },
+ {
+ "source": "ed909983-c859-4e7c-a311-aeccfdd17e69",
+ "target": "557cddd2-4269-4532-b93a-7a5101d98872"
+ },
+ {
+ "source": "803d6df6-3d4c-4471-b3bd-a022fad8d1ee",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ },
+ {
+ "source": "d6f12fd2-85e8-4cba-9d81-a0b0aea67ed2",
+ "target": "90b942e4-ed45-4fd2-909f-e74312c2dab0"
+ },
+ {
+ "source": "d6f12fd2-85e8-4cba-9d81-a0b0aea67ed2",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "4e447c8d-cd1e-45f2-a01a-39e6af1c742c",
+ "target": "3a0c98e2-d00e-4199-80c8-5e19d0d30bb0"
+ },
+ {
+ "source": "4e447c8d-cd1e-45f2-a01a-39e6af1c742c",
+ "target": "04906abc-d7bc-4c68-9da6-235e81c8e78c"
+ },
+ {
+ "source": "4e447c8d-cd1e-45f2-a01a-39e6af1c742c",
+ "target": "cfe64b55-5624-413f-809b-236e78eeb62c"
+ },
+ {
+ "source": "1b978913-f923-48e8-b1e7-d0a42527dd5b",
+ "target": "c615103d-1e0a-4b27-917c-70d935e267a6"
+ },
+ {
+ "source": "1b978913-f923-48e8-b1e7-d0a42527dd5b",
+ "target": "9a6bd1ee-8403-43af-9a53-f68faf686e27"
+ },
+ {
+ "source": "1b978913-f923-48e8-b1e7-d0a42527dd5b",
+ "target": "2e3c5d06-832e-4f7d-aa12-a8fbb9c4bdb3"
+ },
+ {
+ "source": "2c68f855-7068-4a0a-97f5-d3ad09edf6f7",
+ "target": "e048a132-a205-43b9-931d-ec1ea39dacca"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "a2a03229-0b2e-4371-aa78-b3d58abd0530"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "cc7d20ea-a909-4289-b7df-40721476648f"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "c6020cb1-594a-45f0-b58b-fa721ad6603d"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "5b4881e8-77dd-4b96-8ead-93b9d2b3071e"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "c0ab3766-598e-41b5-8721-e659a2b3f3d1"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "25895a4f-0428-4db5-b41d-5b1d46b30d48"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "dc71d3f6-5c1b-47d0-9065-1cfdc2c15f6c"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "04287b3d-df9b-495f-9079-67c01e02ee32"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "d4852232-7218-41e8-ab75-ba2d216c99c4"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "6b83e5c7-e092-4e94-b3f7-849cce62bca2"
+ },
+ {
+ "source": "c5e503a1-cdc1-4456-8abf-d70f3a55627f",
+ "target": "b6fe9876-1fa4-43b5-b2d5-471733531aac"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "55712cb2-9e39-44e3-b5a7-ad610f673b4d"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "bfc85e5b-ab3d-4b2e-a8c5-fb4043c2b8b4"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "0de41b08-4649-425b-9201-9bfdbe5e88ea"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "cc1533ef-e8e9-4eb7-9f4e-a8b46ff7ca69"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "cc2f4b26-1f46-47f9-b9a6-d1012639f903"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "d7a33815-5514-4e35-9321-fadd445f2683"
+ },
+ {
+ "source": "314183a2-06f5-432b-b360-b8e741fe900c",
+ "target": "ae58af64-5a26-4562-ab67-ad270494ec16"
+ },
+ {
+ "source": "e844dcee-eae7-41d2-b1cf-fbe0104fe452",
+ "target": "c45736b9-4f0e-43ef-a8e5-4dcfc632b9f8"
+ },
+ {
+ "source": "e844dcee-eae7-41d2-b1cf-fbe0104fe452",
+ "target": "e6303312-f094-4dd9-9d74-568bd31a89ea"
+ },
+ {
+ "source": "8cd2e3e1-f09d-4b79-96cc-2fbdbd7e7370",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "8cd2e3e1-f09d-4b79-96cc-2fbdbd7e7370",
+ "target": "c1fb832a-c00d-48d5-8397-1cdd1f7617df"
+ },
+ {
+ "source": "e08f7288-cb1b-4b9c-8e9b-41aa978db99a",
+ "target": "1acf562b-77cf-458c-bfa1-e9497eae43bb"
+ },
+ {
+ "source": "e08f7288-cb1b-4b9c-8e9b-41aa978db99a",
+ "target": "afc9fc68-2249-4309-be96-138c51dd941a"
+ },
+ {
+ "source": "e08f7288-cb1b-4b9c-8e9b-41aa978db99a",
+ "target": "a0765c92-7915-4d39-909b-7daeef0ee3dc"
+ },
+ {
+ "source": "e08f7288-cb1b-4b9c-8e9b-41aa978db99a",
+ "target": "4b0e5554-ba02-4a9f-8744-d8d8cbdc53ed"
+ },
+ {
+ "source": "e08f7288-cb1b-4b9c-8e9b-41aa978db99a",
+ "target": "fd7e2c4d-4ee2-4476-9729-33968c21062b"
+ },
+ {
+ "source": "cb93fd0f-30d4-40d1-8d80-4485aa3ca3fb",
+ "target": "be531c4b-59b0-4392-a134-0da5828a7692"
+ },
+ {
+ "source": "cb93fd0f-30d4-40d1-8d80-4485aa3ca3fb",
+ "target": "0e9ad6f0-a085-4a02-a889-d3ac0ceb907b"
+ },
+ {
+ "source": "deba623a-e0d9-4db3-96e3-3cf22681ef43",
+ "target": "0e0ce252-47b1-4b13-a4f5-a2b587b6f40c"
+ },
+ {
+ "source": "da5add9d-61c4-453c-88be-f2c1eb8246fb",
+ "target": "66fc979f-2e21-4469-8518-88a4aa19be9a"
+ },
+ {
+ "source": "da5add9d-61c4-453c-88be-f2c1eb8246fb",
+ "target": "6546f4b1-b038-4961-821a-7341495fae1a"
+ },
+ {
+ "source": "e94cf4f9-71a7-4717-a9b7-5881c3679461",
+ "target": "c4cfc3fd-c497-44b6-80b3-a2ae6b35047b"
+ },
+ {
+ "source": "e94cf4f9-71a7-4717-a9b7-5881c3679461",
+ "target": "479d3088-01ee-4224-86e8-e7ada158f9fe"
+ },
+ {
+ "source": "e94cf4f9-71a7-4717-a9b7-5881c3679461",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "e94cf4f9-71a7-4717-a9b7-5881c3679461",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "e94cf4f9-71a7-4717-a9b7-5881c3679461",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "0c4fd4aa-2511-471a-a260-8b810db1990b",
+ "target": "6193e0d2-8e6a-416f-9fae-6060ae73852c"
+ },
+ {
+ "source": "0c4fd4aa-2511-471a-a260-8b810db1990b",
+ "target": "c49838cd-6024-4d9d-8eb3-3df31c529ceb"
+ },
+ {
+ "source": "0c4fd4aa-2511-471a-a260-8b810db1990b",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "e3752111-11b7-45d0-a61f-fd3b3359e872",
+ "target": "9acce413-ba7a-4b24-ab00-13772ed94437"
+ },
+ {
+ "source": "a447a480-f217-4bf4-9372-683afe4aced7",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "a447a480-f217-4bf4-9372-683afe4aced7",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "9acce413-ba7a-4b24-ab00-13772ed94437",
+ "target": "480b61a1-987c-4dfd-8933-57b9613868bd"
+ },
+ {
+ "source": "9acce413-ba7a-4b24-ab00-13772ed94437",
+ "target": "a1c3d4b6-baeb-4644-9799-a4c376e785a1"
+ },
+ {
+ "source": "9acce413-ba7a-4b24-ab00-13772ed94437",
+ "target": "279f6898-f667-498f-a01c-98afc9069017"
+ },
+ {
+ "source": "9acce413-ba7a-4b24-ab00-13772ed94437",
+ "target": "5e0cfb56-06a3-4960-a97f-a9aaa2853e6e"
+ },
+ {
+ "source": "33525eea-8d9d-4455-a071-c38ccc69978b",
+ "target": "a23060fd-3415-4bc2-9fb8-e62d1238a31e"
+ },
+ {
+ "source": "33525eea-8d9d-4455-a071-c38ccc69978b",
+ "target": "b77047a2-24b9-4b2b-8891-e6b45c4e43fa"
+ },
+ {
+ "source": "1c7c5c98-9acf-44e1-8921-4bb34eed0f92",
+ "target": "2d657ec8-df42-4209-b009-6b4a4a01dbdb"
+ },
+ {
+ "source": "1c7c5c98-9acf-44e1-8921-4bb34eed0f92",
+ "target": "0139e8db-0030-43b9-ac14-1eaf850a270c"
+ },
+ {
+ "source": "57213ae1-eff2-4442-b04b-84706076061f",
+ "target": "eb38a30c-92f6-4abe-b0fc-e7537da7ef8f"
+ },
+ {
+ "source": "57213ae1-eff2-4442-b04b-84706076061f",
+ "target": "c18acba0-88cd-48c2-bfa7-755bb15bee31"
+ },
+ {
+ "source": "57213ae1-eff2-4442-b04b-84706076061f",
+ "target": "085d376c-0967-4f50-b369-87369033bcf0"
+ },
+ {
+ "source": "78f5434e-ad00-4cc8-819f-7f9616ca7589",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "78f5434e-ad00-4cc8-819f-7f9616ca7589",
+ "target": "313f0a05-b6e3-43f8-8f2f-f004790dc798"
+ },
+ {
+ "source": "78f5434e-ad00-4cc8-819f-7f9616ca7589",
+ "target": "3f8656b0-7344-43e3-8d25-f837674dc739"
+ },
+ {
+ "source": "78f5434e-ad00-4cc8-819f-7f9616ca7589",
+ "target": "1c72fe21-bb24-453d-afbb-d58ac0059086"
+ },
+ {
+ "source": "78f5434e-ad00-4cc8-819f-7f9616ca7589",
+ "target": "a3ef6468-2bf3-42c8-a90c-2e9bd5f22941"
+ },
+ {
+ "source": "e6409aab-f55e-42d2-b09f-6388903442a4",
+ "target": "46d1e907-798c-474e-b36d-e41df8a0a5f4"
+ },
+ {
+ "source": "92ba6235-1786-4612-8f55-5a79105aa570",
+ "target": "3f0e13f0-5cb1-4a37-8dee-df8db521ad9c"
+ },
+ {
+ "source": "92ba6235-1786-4612-8f55-5a79105aa570",
+ "target": "4f0cbdf8-2fa6-4cd7-afe6-1e1f2be573ff"
+ },
+ {
+ "source": "92ba6235-1786-4612-8f55-5a79105aa570",
+ "target": "8ac0f67b-336c-4828-bb0f-e981494cf189"
+ },
+ {
+ "source": "50dd38aa-c38e-4cb8-88e7-24046c3d906d",
+ "target": "f78af4d0-f42c-43ca-b683-2b123c34cacd"
+ },
+ {
+ "source": "37c25546-4135-4012-b414-7747d6cedb2a",
+ "target": "57213ae1-eff2-4442-b04b-84706076061f"
+ },
+ {
+ "source": "37c25546-4135-4012-b414-7747d6cedb2a",
+ "target": "085d376c-0967-4f50-b369-87369033bcf0"
+ },
+ {
+ "source": "37c25546-4135-4012-b414-7747d6cedb2a",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "ab5bb5af-cdfc-43c3-9b5c-701c178ef8ba"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "c5a1aba6-0fcd-4bb0-993c-a9d6c4601b22"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "3ca6c917-fb1a-48c9-80ff-228ba5f937a0"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "b020cd25-a954-4ca5-b853-c435c26203ce"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "7fae1bd2-1942-4b55-82d7-9eb0bd082f6f"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "7583e35a-c327-443b-b0e5-c45c670421c6"
+ },
+ {
+ "source": "f7aacd93-af19-4ebf-bd04-02b37d32796f",
+ "target": "252a9a07-0378-4533-8e08-640a9f6eded8"
+ },
+ {
+ "source": "99de5040-7b83-4433-850a-6db2d16a629b",
+ "target": "3a80df2a-77b4-4626-a9fe-933257549a07"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "69945ee0-4f04-419b-8680-e45203302491"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "edcab4d4-3171-4b32-9833-451bfc53bafa"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "c2ab82ac-8f25-4f9e-aabe-9fe53484c1d3"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "3cb8cc7b-70c4-4613-9f5e-3d73f9c6d476"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "8fc72829-7ad9-4c8a-b400-229add0957bb"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "bce603cd-3eea-4dbc-b188-153845a24e16"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "96aec7c9-c31b-48da-9872-2690b057e7ca"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "bce603cd-3eea-4dbc-b188-153845a24e16"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "1d52c1b9-6924-4272-9b33-a600b103240a"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "573dfbd0-2b6c-43b2-a08c-37f174de35c3"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "2517c712-c625-4cd3-9d8e-93b37baeeac6"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "607655ae-3263-4bd2-a03f-b4b877e42c1f"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "f5640b4e-737d-48e5-a8c0-512c284f986c"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "12bf23b8-7c2f-439b-84f1-92807e5f93b3"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "9edb93f2-bb71-42ed-8a72-89abaa8a5cc3"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "5775b1e9-f5ac-4961-ad58-d3b139b4ad68"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "b9c034ae-c43c-488b-8c96-996789ac2695"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "c1fb832a-c00d-48d5-8397-1cdd1f7617df"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "75068634-a939-42ae-815f-8c31d02cf5f5"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "5441a486-c826-424d-a30a-e08b9208642b"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "af98c8b8-d6d1-4443-893a-0a516b3664d2"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "6abcbdbc-c817-4688-be54-1a7c534af1fa"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "71b7fa31-7712-4a3a-a3ff-825298ed86cd"
+ },
+ {
+ "source": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e",
+ "target": "4b5c6424-14de-4ac9-92ad-98c4881a1879"
+ },
+ {
+ "source": "75068634-a939-42ae-815f-8c31d02cf5f5",
+ "target": "cab6efcd-b205-45e7-8873-31026d149490"
+ },
+ {
+ "source": "75068634-a939-42ae-815f-8c31d02cf5f5",
+ "target": "16c28b52-8850-460a-87b2-1d1cdb1f6580"
+ },
+ {
+ "source": "4d1d4b14-fb53-41d2-bc0d-a1c197cc6df0",
+ "target": "de0d2a39-720a-4a73-a533-2e197b0c3de9"
+ },
+ {
+ "source": "4d1d4b14-fb53-41d2-bc0d-a1c197cc6df0",
+ "target": "87c540b3-83bb-4042-abc1-437d55ff874f"
+ },
+ {
+ "source": "fc6472a8-6abb-41d9-b73e-d019d6093869",
+ "target": "ad12f4af-6660-4450-b6b6-28f79429f5fd"
+ },
+ {
+ "source": "fc6472a8-6abb-41d9-b73e-d019d6093869",
+ "target": "07899edc-5aec-414e-8f99-b9f414a31f79"
+ },
+ {
+ "source": "81bc17b9-b374-464e-a3fe-16291a49f8b1",
+ "target": "71b7fa31-7712-4a3a-a3ff-825298ed86cd"
+ },
+ {
+ "source": "81bc17b9-b374-464e-a3fe-16291a49f8b1",
+ "target": "57213ae1-eff2-4442-b04b-84706076061f"
+ },
+ {
+ "source": "81bc17b9-b374-464e-a3fe-16291a49f8b1",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "81bc17b9-b374-464e-a3fe-16291a49f8b1",
+ "target": "75068634-a939-42ae-815f-8c31d02cf5f5"
+ },
+ {
+ "source": "085d376c-0967-4f50-b369-87369033bcf0",
+ "target": "57213ae1-eff2-4442-b04b-84706076061f"
+ },
+ {
+ "source": "4b10bcb4-8337-4b3e-be7a-adab788f995c",
+ "target": "ad600caa-8176-4353-ace6-3c8842260c6c"
+ },
+ {
+ "source": "2d4ec4ea-c3ef-4ee1-90b4-17857fe8f21e",
+ "target": "82251b8e-2856-490d-82e2-de0da38f71d8"
+ },
+ {
+ "source": "8539bd4a-0af3-452d-9867-e5462637645a",
+ "target": "a420af4a-97bf-4b87-8ab4-5f180808e27a"
+ },
+ {
+ "source": "8136709d-9d43-44f6-8904-d411973bcfdd",
+ "target": "fa5f4b7f-e222-4c6e-94c5-c2008dff7d26"
+ },
+ {
+ "source": "2f08dfa3-61e2-4648-b45e-963ab852f688",
+ "target": "25a5762d-db61-4f84-9962-b96e20c7e84b"
+ },
+ {
+ "source": "2f08dfa3-61e2-4648-b45e-963ab852f688",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "2f08dfa3-61e2-4648-b45e-963ab852f688",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "2f08dfa3-61e2-4648-b45e-963ab852f688",
+ "target": "4ab6fa70-e092-4c76-a6ca-33ef9d7493e8"
+ },
+ {
+ "source": "2517c712-c625-4cd3-9d8e-93b37baeeac6",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "2517c712-c625-4cd3-9d8e-93b37baeeac6",
+ "target": "12bf23b8-7c2f-439b-84f1-92807e5f93b3"
+ },
+ {
+ "source": "2517c712-c625-4cd3-9d8e-93b37baeeac6",
+ "target": "9edb93f2-bb71-42ed-8a72-89abaa8a5cc3"
+ },
+ {
+ "source": "45f76d34-afef-47e0-9436-a8e7c4f8b18e",
+ "target": "af98c8b8-d6d1-4443-893a-0a516b3664d2"
+ },
+ {
+ "source": "45f76d34-afef-47e0-9436-a8e7c4f8b18e",
+ "target": "3cf8ff6c-0ff4-4597-814c-d1b81aeaad67"
+ },
+ {
+ "source": "45f76d34-afef-47e0-9436-a8e7c4f8b18e",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "afc9fc68-2249-4309-be96-138c51dd941a",
+ "target": "d251fd60-bb9d-4eb1-a921-6b57980fd9e7"
+ },
+ {
+ "source": "3dd4c938-1173-4c86-9398-1af322d63239",
+ "target": "c98192f6-09b5-4a85-a1a7-aab632829493"
+ },
+ {
+ "source": "cff5454f-1cca-49a9-ae0d-739df5b0b0b6",
+ "target": "bfc85e5b-ab3d-4b2e-a8c5-fb4043c2b8b4"
+ },
+ {
+ "source": "36400a6e-56c1-4d37-b23f-2097c325e31f",
+ "target": "c5da437c-60bb-45a3-86d5-718b14fd6733"
+ },
+ {
+ "source": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "target": "a4e0561b-4adb-473c-9d35-8cb29c429c96"
+ },
+ {
+ "source": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "target": "aa5fdff9-863c-4288-88ac-217f69b70cc1"
+ },
+ {
+ "source": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "target": "475c6db1-e5a0-4ebb-8291-5454a9e6d12e"
+ },
+ {
+ "source": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "target": "deba623a-e0d9-4db3-96e3-3cf22681ef43"
+ },
+ {
+ "source": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "target": "ecb99e35-f821-48bc-84c9-2db2559d3bee"
+ },
+ {
+ "source": "b07c52c3-f3d0-47c6-8d55-ad2b9ccdeabe",
+ "target": "e358c53a-eddc-46f4-b693-d4cc93d7210c"
+ },
+ {
+ "source": "0de41b08-4649-425b-9201-9bfdbe5e88ea",
+ "target": "0cecffd2-6a76-4403-ab6f-463d2cb2ce25"
+ },
+ {
+ "source": "0de41b08-4649-425b-9201-9bfdbe5e88ea",
+ "target": "20f9ca30-46af-44e2-b84b-6296879e7798"
+ },
+ {
+ "source": "0de41b08-4649-425b-9201-9bfdbe5e88ea",
+ "target": "66d70402-8e8d-4284-a65b-6c621a766e52"
+ },
+ {
+ "source": "0de41b08-4649-425b-9201-9bfdbe5e88ea",
+ "target": "ee60d371-67df-432d-bcd3-48bc7b239178"
+ },
+ {
+ "source": "8ac0f67b-336c-4828-bb0f-e981494cf189",
+ "target": "be531c4b-59b0-4392-a134-0da5828a7692"
+ },
+ {
+ "source": "8ac0f67b-336c-4828-bb0f-e981494cf189",
+ "target": "81c97242-4245-43e1-96d6-d2a02998d903"
+ },
+ {
+ "source": "8ac0f67b-336c-4828-bb0f-e981494cf189",
+ "target": "9acce413-ba7a-4b24-ab00-13772ed94437"
+ },
+ {
+ "source": "8ac0f67b-336c-4828-bb0f-e981494cf189",
+ "target": "0875094f-d050-4355-bf45-d2fd129d9e1e"
+ },
+ {
+ "source": "8ac0f67b-336c-4828-bb0f-e981494cf189",
+ "target": "ea0af31d-6880-4acc-bdbc-09df08f82a64"
+ },
+ {
+ "source": "0f439030-4c44-4c62-88a1-eca8e027a3da",
+ "target": "fab92aca-8392-49e1-8c66-922fc37d77a1"
+ },
+ {
+ "source": "0f439030-4c44-4c62-88a1-eca8e027a3da",
+ "target": "32d4f910-5305-4e22-886f-5f823172aca3"
+ },
+ {
+ "source": "913ee774-c9c9-4476-a619-b62d0f351378",
+ "target": "e997346e-b3dd-48da-8597-93acac415fa1"
+ },
+ {
+ "source": "1d5f8392-5e49-45b9-a998-e3b6636bff41",
+ "target": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583"
+ },
+ {
+ "source": "1d5f8392-5e49-45b9-a998-e3b6636bff41",
+ "target": "51fff562-fc33-4090-95ea-538bb57fbdda"
+ },
+ {
+ "source": "1d5f8392-5e49-45b9-a998-e3b6636bff41",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "1d5f8392-5e49-45b9-a998-e3b6636bff41",
+ "target": "ac38176f-a082-4073-a084-f258b4db6efe"
+ },
+ {
+ "source": "aa5fdff9-863c-4288-88ac-217f69b70cc1",
+ "target": "f94c39c4-0e5f-4166-8299-336c11a70973"
+ },
+ {
+ "source": "b3d2d386-470f-4f7f-adcb-c1ac1be3e876",
+ "target": "d251fd60-bb9d-4eb1-a921-6b57980fd9e7"
+ },
+ {
+ "source": "b3d2d386-470f-4f7f-adcb-c1ac1be3e876",
+ "target": "bfda1a66-cc3e-4992-b4a2-bdf59d17aa62"
+ },
+ {
+ "source": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "target": "3cf8ff6c-0ff4-4597-814c-d1b81aeaad67"
+ },
+ {
+ "source": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "target": "31cd49eb-770f-4d11-98b2-ca666b534201"
+ },
+ {
+ "source": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "target": "b10edb04-99eb-46cd-af12-4fde2a7aff6a"
+ },
+ {
+ "source": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "target": "15cba8d5-9f42-4169-9a0a-6d03a2a9a45e"
+ },
+ {
+ "source": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "target": "edcab4d4-3171-4b32-9833-451bfc53bafa"
+ },
+ {
+ "source": "313f0a05-b6e3-43f8-8f2f-f004790dc798",
+ "target": "69945ee0-4f04-419b-8680-e45203302491"
+ },
+ {
+ "source": "b6b8ec07-b1e0-4b35-b7cc-1ce42947f146",
+ "target": "1c7c5c98-9acf-44e1-8921-4bb34eed0f92"
+ },
+ {
+ "source": "b6b8ec07-b1e0-4b35-b7cc-1ce42947f146",
+ "target": "9bf1101b-fbba-4740-b101-7c98e9b0df41"
+ },
+ {
+ "source": "f11abbe3-da85-4f8c-8914-552f991a3b00",
+ "target": "c18acba0-88cd-48c2-bfa7-755bb15bee31"
+ },
+ {
+ "source": "a873a69f-ba4e-4377-8e39-640861c856f4",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "a873a69f-ba4e-4377-8e39-640861c856f4",
+ "target": "80e95479-ebab-4e5a-bf1f-e56ba9d7cb7d"
+ },
+ {
+ "source": "a873a69f-ba4e-4377-8e39-640861c856f4",
+ "target": "1c46b3c0-d744-4946-8e9b-656e9373a2aa"
+ },
+ {
+ "source": "b0e08530-ad69-4bb2-9457-5b004ab3481a",
+ "target": "5061d36d-a542-45d3-b76a-b6744c0df01a"
+ },
+ {
+ "source": "b0e08530-ad69-4bb2-9457-5b004ab3481a",
+ "target": "a53911c6-5516-4467-8c9c-e3b078acdb4c"
+ },
+ {
+ "source": "b0e08530-ad69-4bb2-9457-5b004ab3481a",
+ "target": "0facab0b-4652-478e-962a-afb8cf9818bb"
+ },
+ {
+ "source": "fe87fdb4-b86b-48db-8a2d-eb402b095ad2",
+ "target": "25a5762d-db61-4f84-9962-b96e20c7e84b"
+ },
+ {
+ "source": "fe87fdb4-b86b-48db-8a2d-eb402b095ad2",
+ "target": "b476726a-277a-49aa-88e3-afe48b85fc14"
+ },
+ {
+ "source": "72bfc1f1-a0e7-4f66-9709-7c0ea3693abf",
+ "target": "02efc391-fd46-4d2e-84e2-e191e90cc0c7"
+ },
+ {
+ "source": "72bfc1f1-a0e7-4f66-9709-7c0ea3693abf",
+ "target": "ed9abae9-2e87-41f7-add2-0e436d1831be"
+ },
+ {
+ "source": "72bfc1f1-a0e7-4f66-9709-7c0ea3693abf",
+ "target": "196a4e47-9e68-4022-afee-85dcc611172d"
+ },
+ {
+ "source": "72bfc1f1-a0e7-4f66-9709-7c0ea3693abf",
+ "target": "68f00dbf-23aa-496a-9e05-df48f0793259"
+ },
+ {
+ "source": "4aeebd45-da84-4d95-9195-e6905f5d095f",
+ "target": "f78af4d0-f42c-43ca-b683-2b123c34cacd"
+ },
+ {
+ "source": "4aeebd45-da84-4d95-9195-e6905f5d095f",
+ "target": "b93fa016-999a-4f1a-a471-8c631db1879a"
+ },
+ {
+ "source": "5775b1e9-f5ac-4961-ad58-d3b139b4ad68",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "5775b1e9-f5ac-4961-ad58-d3b139b4ad68",
+ "target": "41ef8c58-7d6d-413d-8f32-0e2b04c7949d"
+ },
+ {
+ "source": "2b42fed3-1c4d-4e02-bd35-9a4f6b53af30",
+ "target": "76e4a9a1-244c-4c89-b0b5-e67fdb452625"
+ },
+ {
+ "source": "2b42fed3-1c4d-4e02-bd35-9a4f6b53af30",
+ "target": "b1667b51-b5c4-4b99-934e-9f071c76b507"
+ },
+ {
+ "source": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "target": "313f0a05-b6e3-43f8-8f2f-f004790dc798"
+ },
+ {
+ "source": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "target": "75068634-a939-42ae-815f-8c31d02cf5f5"
+ },
+ {
+ "source": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "target": "934df62f-db20-4c3f-917e-862161f797fc"
+ },
+ {
+ "source": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "target": "cb0659a9-ab48-42c9-a518-f059a12aeb0e"
+ },
+ {
+ "source": "23e0cf04-bd7f-4c24-bdd0-7f65dea6df6b",
+ "target": "50b9ed61-c160-435d-aa77-6ffb6cc7cd27"
+ },
+ {
+ "source": "a5590aa3-2d53-45d4-b7a7-f28f8c32ecbc",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ },
+ {
+ "source": "a5590aa3-2d53-45d4-b7a7-f28f8c32ecbc",
+ "target": "fe87fdb4-b86b-48db-8a2d-eb402b095ad2"
+ },
+ {
+ "source": "92b7d85e-a2d8-4db0-8dec-9994e8625acf",
+ "target": "b3d2d386-470f-4f7f-adcb-c1ac1be3e876"
+ },
+ {
+ "source": "c78555dd-6890-476f-b478-93191bd74bf3",
+ "target": "84779137-ff6a-463e-82cd-741475be1140"
+ },
+ {
+ "source": "c78555dd-6890-476f-b478-93191bd74bf3",
+ "target": "6695b04e-7e0f-44b9-8402-266e5cc6ab02"
+ },
+ {
+ "source": "c78555dd-6890-476f-b478-93191bd74bf3",
+ "target": "1959e9a1-8e14-4ce7-981b-b04ea9d98bff"
+ },
+ {
+ "source": "c78555dd-6890-476f-b478-93191bd74bf3",
+ "target": "3eb352c4-cbc7-47be-8c0f-98cd9168e850"
+ },
+ {
+ "source": "c78555dd-6890-476f-b478-93191bd74bf3",
+ "target": "6695b04e-7e0f-44b9-8402-266e5cc6ab02"
+ },
+ {
+ "source": "8dc66a21-b480-492e-b769-a58500bc4468",
+ "target": "a12d8d0a-5036-4f17-b3e4-910afa0269fa"
+ },
+ {
+ "source": "ae58af64-5a26-4562-ab67-ad270494ec16",
+ "target": "ad12f4af-6660-4450-b6b6-28f79429f5fd"
+ },
+ {
+ "source": "8c848baa-058b-43ca-ad0d-b96b0daabb7a",
+ "target": "dc6b1689-a488-4d8a-82b6-9ecff5087d16"
+ },
+ {
+ "source": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "target": "c5e503a1-cdc1-4456-8abf-d70f3a55627f"
+ },
+ {
+ "source": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "target": "f7aacd93-af19-4ebf-bd04-02b37d32796f"
+ },
+ {
+ "source": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "target": "e543bfb1-89c4-4bb8-916e-f46d5107ac6c"
+ },
+ {
+ "source": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "target": "69da4d27-6341-4e9c-b0be-0bc4698dbda6"
+ },
+ {
+ "source": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "target": "f3c3745d-d8f5-43f3-8022-c021d1c4e5e9"
+ },
+ {
+ "source": "a49efd7b-77e4-478e-b625-7dbf9d884c2a",
+ "target": "af079d12-b7c8-494d-945e-3b85299bd68f"
+ },
+ {
+ "source": "af1ae4be-bc8b-4d6c-b87b-7add8711b6d6",
+ "target": "a420af4a-97bf-4b87-8ab4-5f180808e27a"
+ },
+ {
+ "source": "46d1e907-798c-474e-b36d-e41df8a0a5f4",
+ "target": "76e4a9a1-244c-4c89-b0b5-e67fdb452625"
+ },
+ {
+ "source": "46d1e907-798c-474e-b36d-e41df8a0a5f4",
+ "target": "4ad6283e-a148-4176-abea-543ce6e3e921"
+ },
+ {
+ "source": "439233ec-f391-41ed-8179-05472fbc09a2",
+ "target": "af98c8b8-d6d1-4443-893a-0a516b3664d2"
+ },
+ {
+ "source": "439233ec-f391-41ed-8179-05472fbc09a2",
+ "target": "32d4f910-5305-4e22-886f-5f823172aca3"
+ },
+ {
+ "source": "439233ec-f391-41ed-8179-05472fbc09a2",
+ "target": "085d376c-0967-4f50-b369-87369033bcf0"
+ },
+ {
+ "source": "a3694051-3129-4f3b-873d-3fdb385bcdab",
+ "target": "1fbefa5c-d5a1-4061-a043-e7c2ffd7c596"
+ },
+ {
+ "source": "a3694051-3129-4f3b-873d-3fdb385bcdab",
+ "target": "8c848baa-058b-43ca-ad0d-b96b0daabb7a"
+ },
+ {
+ "source": "a1c3d4b6-baeb-4644-9799-a4c376e785a1",
+ "target": "afbe098d-aaae-4a63-8f16-80e750363f54"
+ },
+ {
+ "source": "a1c3d4b6-baeb-4644-9799-a4c376e785a1",
+ "target": "bddd3b6d-3ef3-4b26-8cd1-fc18e0bf84b0"
+ },
+ {
+ "source": "a1c3d4b6-baeb-4644-9799-a4c376e785a1",
+ "target": "5424b894-6107-48ff-ae87-4aa96b0bc996"
+ },
+ {
+ "source": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "target": "96aec7c9-c31b-48da-9872-2690b057e7ca"
+ },
+ {
+ "source": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "target": "8fc72829-7ad9-4c8a-b400-229add0957bb"
+ },
+ {
+ "source": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "target": "c936a9ab-092e-4fe3-8b96-b6f4ae91e583"
+ },
+ {
+ "source": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "target": "2fa90488-38aa-478f-bc3a-2290fb9def10"
+ },
+ {
+ "source": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "target": "1d5f8392-5e49-45b9-a998-e3b6636bff41"
+ },
+ {
+ "source": "b415c998-f7c4-4c1c-a83d-9b5225282514",
+ "target": "bd8b598f-7c03-4f61-a250-f408e437232c"
+ },
+ {
+ "source": "b38fb14b-d2c8-43b5-9bd9-7950b016be2a",
+ "target": "321146cd-2bcc-4cd9-baf7-b0f4f5c75da3"
+ },
+ {
+ "source": "c67c895b-d974-42cc-b2e9-c4128af74b44",
+ "target": "81c97242-4245-43e1-96d6-d2a02998d903"
+ },
+ {
+ "source": "c67c895b-d974-42cc-b2e9-c4128af74b44",
+ "target": "5ff6e7ef-717d-40b1-a4de-daf4d3ac038a"
+ },
+ {
+ "source": "e9e3997b-048e-4b07-b2c2-355cb2bf6bb2",
+ "target": "c98192f6-09b5-4a85-a1a7-aab632829493"
+ },
+ {
+ "source": "d87796bd-da4e-41e8-a692-4c24e030ad58",
+ "target": "b93fa016-999a-4f1a-a471-8c631db1879a"
+ },
+ {
+ "source": "562ce63a-63cb-4d03-a1d9-43bcf3001d77",
+ "target": "d343ba0a-0f9d-40f1-9710-6a2724a85389"
+ },
+ {
+ "source": "562ce63a-63cb-4d03-a1d9-43bcf3001d77",
+ "target": "af98c8b8-d6d1-4443-893a-0a516b3664d2"
+ },
+ {
+ "source": "562ce63a-63cb-4d03-a1d9-43bcf3001d77",
+ "target": "0b5e14bd-264f-456a-92b3-4ef6dc008fa7"
+ },
+ {
+ "source": "562ce63a-63cb-4d03-a1d9-43bcf3001d77",
+ "target": "4fc8e36a-7809-4f06-ae38-cbe0a6ad22da"
+ },
+ {
+ "source": "56022aeb-28c1-4dee-bcb1-6f1fbae1b782",
+ "target": "b7491bb2-49d2-4a79-8f27-e27944eeefbb"
+ },
+ {
+ "source": "55ab32eb-52cc-476f-ba11-1f326d8545b4",
+ "target": "56022aeb-28c1-4dee-bcb1-6f1fbae1b782"
+ },
+ {
+ "source": "61af2123-c19b-4f80-9b10-610287e3297a",
+ "target": "56022aeb-28c1-4dee-bcb1-6f1fbae1b782"
+ },
+ {
+ "source": "a8133b00-1c77-41fc-b0cf-c5390d78af7f",
+ "target": "55ab32eb-52cc-476f-ba11-1f326d8545b4"
+ },
+ {
+ "source": "a8133b00-1c77-41fc-b0cf-c5390d78af7f",
+ "target": "aeb63a55-e56a-41c7-8bef-2b1ee7ba5a4f"
+ },
+ {
+ "source": "a8133b00-1c77-41fc-b0cf-c5390d78af7f",
+ "target": "56022aeb-28c1-4dee-bcb1-6f1fbae1b782"
+ },
+ {
+ "source": "a8133b00-1c77-41fc-b0cf-c5390d78af7f",
+ "target": "61af2123-c19b-4f80-9b10-610287e3297a"
+ },
+ {
+ "source": "481293d6-42ea-484a-975b-1cc5ba1708fa",
+ "target": "013d6de0-7da7-4894-be91-ef3705945daa"
+ },
+ {
+ "source": "481293d6-42ea-484a-975b-1cc5ba1708fa",
+ "target": "1fbefa5c-d5a1-4061-a043-e7c2ffd7c596"
+ },
+ {
+ "source": "481293d6-42ea-484a-975b-1cc5ba1708fa",
+ "target": "c45736b9-4f0e-43ef-a8e5-4dcfc632b9f8"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "8b14c42a-cce5-4be1-b740-c051397a06c2"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "654e4bfd-594e-48f2-b6b1-7ad252e1c05c"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "fd2450df-e046-4d9c-a350-2be198e7fd04"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "71b7fa31-7712-4a3a-a3ff-825298ed86cd"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "3dad96b9-a6bf-449f-981e-4e141f865dd5"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "fff6c214-ce92-4f4f-be7f-71eb21efff79"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "66aff1d3-bd45-45e5-9d31-d4292d76ae8e"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "0448eeeb-d0dc-45ca-a850-caa8413b3640"
+ },
+ {
+ "source": "84c8fdf0-a17d-4610-b644-d298235f699e",
+ "target": "0bbb9ce7-191f-4fde-8924-cad8a3886e2e"
+ }
+ ]
+}
diff --git a/app_expo/i18n/en.json b/app_expo/i18n/en.json
new file mode 100644
index 0000000..be5c35c
--- /dev/null
+++ b/app_expo/i18n/en.json
@@ -0,0 +1,34 @@
+{
+ "common": {
+ "ok": "OK!",
+ "cancel": "Cancel",
+ "back": "Back"
+ },
+ "errors": {
+ "invalidEmail": "Invalid email address."
+ },
+ "welcomeScreen": {
+ "poweredBy": "POWERED BY IGNITE",
+ "readyForLaunch": "Ready for launch.",
+ "continue": "CONTINUE"
+ },
+ "demoScreen": {
+ "howTo": "HOW TO",
+ "title": "What’s In This Stack?",
+ "tagLine": "Congratulations, you’ve got a very advanced React Native app template here. Take advantage of this boilerplate!",
+ "reactotron": "Demo Reactotron",
+ "demoList": "Demo List",
+ "androidReactotronHint": "If this doesn't work, ensure the Reactotron desktop app is running, run adb reverse tcp:9090 tcp:9090 from your terminal, and reload the app.",
+ "iosReactotronHint": "If this doesn't work, ensure the Reactotron desktop app is running and reload app.",
+ "macosReactotronHint": "If this doesn't work, ensure the Reactotron desktop app is running and reload app.",
+ "webReactotronHint": "If this doesn't work, ensure the Reactotron desktop app is running and reload app.",
+ "windowsReactotronHint": "If this doesn't work, ensure the Reactotron desktop app is running and reload app."
+ },
+ "demoListScreen": {
+ "title": "Demo List"
+ },
+ "storybook": {
+ "placeholder": "Placeholder",
+ "field": "Field"
+ }
+}
diff --git a/app_expo/i18n/i18n.ts b/app_expo/i18n/i18n.ts
new file mode 100644
index 0000000..b29e80b
--- /dev/null
+++ b/app_expo/i18n/i18n.ts
@@ -0,0 +1,22 @@
+import * as Localization from 'expo-localization'
+import i18n from 'i18n-js'
+import en from './en.json'
+import ja from './ja.json'
+
+i18n.fallbacks = true
+i18n.translations = { en, ja }
+
+i18n.locale = Localization.locale || 'en'
+
+/**
+ * Builds up valid keypaths for translations.
+ * Update to your default locale of choice if not English.
+ */
+type DefaultLocale = typeof en
+export type TxKeyPath = RecursiveKeyOf<DefaultLocale>
+
+type RecursiveKeyOf<TObj extends Record<string, any>> = {
+ [TKey in keyof TObj & string]: TObj[TKey] extends Record<string, any>
+ ? `${TKey}` | `${TKey}.${RecursiveKeyOf<TObj[TKey]>}`
+ : `${TKey}`
+}[keyof TObj & string]
diff --git a/app_expo/i18n/index.ts b/app_expo/i18n/index.ts
new file mode 100644
index 0000000..b0ff148
--- /dev/null
+++ b/app_expo/i18n/index.ts
@@ -0,0 +1,3 @@
+import './i18n'
+export * from './i18n'
+export * from './translate'
diff --git a/app_expo/i18n/ja.json b/app_expo/i18n/ja.json
new file mode 100644
index 0000000..7f53c8c
--- /dev/null
+++ b/app_expo/i18n/ja.json
@@ -0,0 +1,7 @@
+{
+ "common": {
+ "ok": "OK 🇯🇵",
+ "cancel": "Cancel 🇯🇵",
+ "back": "Back 🇯🇵"
+ }
+}
diff --git a/app_expo/i18n/translate.ts b/app_expo/i18n/translate.ts
new file mode 100644
index 0000000..6481874
--- /dev/null
+++ b/app_expo/i18n/translate.ts
@@ -0,0 +1,11 @@
+import i18n from 'i18n-js'
+import { TxKeyPath } from './i18n'
+
+/**
+ * Translates text.
+ *
+ * @param key The i18n key.
+ */
+export function translate(key: TxKeyPath, options?: i18n.TranslateOptions) {
+ return key ? i18n.t(key, options) : null
+}
diff --git a/app_expo/models/character-store/character-store.test.ts b/app_expo/models/character-store/character-store.test.ts
new file mode 100644
index 0000000..fc17694
--- /dev/null
+++ b/app_expo/models/character-store/character-store.test.ts
@@ -0,0 +1,7 @@
+import { CharacterStoreModel } from './character-store'
+
+test('can be created', () => {
+ const instance = CharacterStoreModel.create({})
+
+ expect(instance).toBeTruthy()
+})
diff --git a/app_expo/models/character-store/character-store.ts b/app_expo/models/character-store/character-store.ts
new file mode 100644
index 0000000..9751118
--- /dev/null
+++ b/app_expo/models/character-store/character-store.ts
@@ -0,0 +1,37 @@
+import { Instance, SnapshotOut, types } from 'mobx-state-tree'
+import { CharacterModel, CharacterSnapshot } from '../character/character'
+import { CharacterApi } from '../../services/api/character-api'
+import { withEnvironment } from '../extensions/with-environment'
+
+/**
+ * Example store containing Rick and Morty characters
+ */
+export const CharacterStoreModel = types
+ .model('CharacterStore')
+ .props({
+ characters: types.optional(types.array(CharacterModel), []),
+ })
+ .extend(withEnvironment)
+ .actions((self) => ({
+ saveCharacters: (characterSnapshots: CharacterSnapshot[]) => {
+ self.characters.replace(characterSnapshots)
+ },
+ }))
+ .actions((self) => ({
+ getCharacters: async () => {
+ const characterApi = new CharacterApi(self.environment.api)
+ const result = await characterApi.getCharacters()
+
+ if (result.kind === 'ok') {
+ self.saveCharacters(result.characters)
+ } else {
+ __DEV__ && console.tron.log(result.kind)
+ }
+ },
+ }))
+
+type CharacterStoreType = Instance<typeof CharacterStoreModel>
+export interface CharacterStore extends CharacterStoreType {}
+type CharacterStoreSnapshotType = SnapshotOut<typeof CharacterStoreModel>
+export interface CharacterStoreSnapshot extends CharacterStoreSnapshotType {}
+export const createCharacterStoreDefaultModel = () => types.optional(CharacterStoreModel, {})
diff --git a/app_expo/models/character/character.test.ts b/app_expo/models/character/character.test.ts
new file mode 100644
index 0000000..d7bfac7
--- /dev/null
+++ b/app_expo/models/character/character.test.ts
@@ -0,0 +1,10 @@
+import { CharacterModel } from './character'
+
+test('can be created', () => {
+ const instance = CharacterModel.create({
+ id: 1,
+ name: 'Rick Sanchez',
+ })
+
+ expect(instance).toBeTruthy()
+})
diff --git a/app_expo/models/character/character.ts b/app_expo/models/character/character.ts
new file mode 100644
index 0000000..4405338
--- /dev/null
+++ b/app_expo/models/character/character.ts
@@ -0,0 +1,17 @@
+import { Instance, SnapshotOut, types } from 'mobx-state-tree'
+
+/**
+ * Rick and Morty character model.
+ */
+export const CharacterModel = types.model('Character').props({
+ id: types.identifierNumber,
+ name: types.maybe(types.string),
+ status: types.maybe(types.string),
+ image: types.maybe(types.string),
+})
+
+type CharacterType = Instance<typeof CharacterModel>
+export interface Character extends CharacterType {}
+type CharacterSnapshotType = SnapshotOut<typeof CharacterModel>
+export interface CharacterSnapshot extends CharacterSnapshotType {}
+export const createCharacterDefaultModel = () => types.optional(CharacterModel, {})
diff --git a/app_expo/models/environment.ts b/app_expo/models/environment.ts
new file mode 100644
index 0000000..a29586b
--- /dev/null
+++ b/app_expo/models/environment.ts
@@ -0,0 +1,40 @@
+import { Api } from '../services/api'
+
+let ReactotronDev
+if (__DEV__) {
+ const { Reactotron } = require('../services/reactotron')
+ ReactotronDev = Reactotron
+}
+
+/**
+ * The environment is a place where services and shared dependencies between
+ * models live. They are made available to every model via dependency injection.
+ */
+export class Environment {
+ constructor() {
+ // create each service
+ if (__DEV__) {
+ // dev-only services
+ this.reactotron = new ReactotronDev()
+ }
+ this.api = new Api()
+ }
+
+ async setup() {
+ // allow each service to setup
+ if (__DEV__) {
+ await this.reactotron.setup()
+ }
+ await this.api.setup()
+ }
+
+ /**
+ * Reactotron is only available in dev.
+ */
+ reactotron: typeof ReactotronDev
+
+ /**
+ * Our api.
+ */
+ api: Api
+}
diff --git a/app_expo/models/extensions/with-environment.ts b/app_expo/models/extensions/with-environment.ts
new file mode 100644
index 0000000..1fc190e
--- /dev/null
+++ b/app_expo/models/extensions/with-environment.ts
@@ -0,0 +1,17 @@
+import { getEnv, IStateTreeNode } from 'mobx-state-tree'
+import { Environment } from '../environment'
+
+/**
+ * Adds a environment property to the node for accessing our
+ * Environment in strongly typed.
+ */
+export const withEnvironment = (self: IStateTreeNode) => ({
+ views: {
+ /**
+ * The environment.
+ */
+ get environment() {
+ return getEnv<Environment>(self)
+ },
+ },
+})
diff --git a/app_expo/models/extensions/with-root-store.ts b/app_expo/models/extensions/with-root-store.ts
new file mode 100644
index 0000000..72ab478
--- /dev/null
+++ b/app_expo/models/extensions/with-root-store.ts
@@ -0,0 +1,17 @@
+import { getRoot, IStateTreeNode } from 'mobx-state-tree'
+import { RootStoreModel } from '../root-store/root-store'
+
+/**
+ * Adds a rootStore property to the node for a convenient
+ * and strongly typed way for stores to access other stores.
+ */
+export const withRootStore = (self: IStateTreeNode) => ({
+ views: {
+ /**
+ * The root store.
+ */
+ get rootStore() {
+ return getRoot<typeof RootStoreModel>(self)
+ },
+ },
+})
diff --git a/app_expo/models/index.ts b/app_expo/models/index.ts
new file mode 100644
index 0000000..74909fc
--- /dev/null
+++ b/app_expo/models/index.ts
@@ -0,0 +1,5 @@
+export * from './extensions/with-environment'
+export * from './extensions/with-root-store'
+export * from './root-store/root-store'
+export * from './root-store/root-store-context'
+export * from './root-store/setup-root-store'
diff --git a/app_expo/models/root-store/root-store-context.ts b/app_expo/models/root-store/root-store-context.ts
new file mode 100644
index 0000000..f01a35c
--- /dev/null
+++ b/app_expo/models/root-store/root-store-context.ts
@@ -0,0 +1,22 @@
+import { createContext, useContext } from 'react'
+import { RootStore } from './root-store'
+
+/**
+ * Create a context we can use to
+ * - Provide access to our stores from our root component
+ * - Consume stores in our screens (or other components, though it's
+ * preferable to just connect screens)
+ */
+const RootStoreContext = createContext<RootStore>({} as RootStore)
+
+/**
+ * The provider our root component will use to expose the root store
+ */
+export const RootStoreProvider = RootStoreContext.Provider
+
+/**
+ * A hook that screens can use to gain access to our stores, with
+ * `const { someStore, someOtherStore } = useStores()`,
+ * or less likely: `const rootStore = useStores()`
+ */
+export const useStores = () => useContext(RootStoreContext)
diff --git a/app_expo/models/root-store/root-store.ts b/app_expo/models/root-store/root-store.ts
new file mode 100644
index 0000000..56425bc
--- /dev/null
+++ b/app_expo/models/root-store/root-store.ts
@@ -0,0 +1,20 @@
+import { Instance, SnapshotOut, types } from 'mobx-state-tree'
+import { CharacterStoreModel } from '../character-store/character-store'
+
+/**
+ * A RootStore model.
+ */
+// prettier-ignore
+export const RootStoreModel = types.model("RootStore").props({
+ characterStore: types.optional(CharacterStoreModel, {} as any),
+})
+
+/**
+ * The RootStore instance.
+ */
+export interface RootStore extends Instance<typeof RootStoreModel> {}
+
+/**
+ * The data of a RootStore.
+ */
+export interface RootStoreSnapshot extends SnapshotOut<typeof RootStoreModel> {}
diff --git a/app_expo/models/root-store/setup-root-store.ts b/app_expo/models/root-store/setup-root-store.ts
new file mode 100644
index 0000000..40e3ad8
--- /dev/null
+++ b/app_expo/models/root-store/setup-root-store.ts
@@ -0,0 +1,55 @@
+import { onSnapshot } from 'mobx-state-tree'
+import { RootStoreModel, RootStore } from './root-store'
+import { Environment } from '../environment'
+import * as storage from '../../utils/storage'
+
+/**
+ * The key we'll be saving our state as within async storage.
+ */
+const ROOT_STATE_STORAGE_KEY = 'root'
+
+/**
+ * Setup the environment that all the models will be sharing.
+ *
+ * The environment includes other functions that will be picked from some
+ * of the models that get created later. This is how we loosly couple things
+ * like events between models.
+ */
+export async function createEnvironment() {
+ const env = new Environment()
+ await env.setup()
+ return env
+}
+
+/**
+ * Setup the root state.
+ */
+export async function setupRootStore() {
+ let rootStore: RootStore
+ let data: any
+
+ // prepare the environment that will be associated with the RootStore.
+ const env = await createEnvironment()
+ try {
+ // load data from storage
+ data = (await storage.load(ROOT_STATE_STORAGE_KEY)) || {}
+ rootStore = RootStoreModel.create(data, env)
+ } catch (e) {
+ // if there's any problems loading, then let's at least fallback to an empty state
+ // instead of crashing.
+ rootStore = RootStoreModel.create({}, env)
+
+ // but please inform us what happened
+ __DEV__ && console.tron.error(e.message, null)
+ }
+
+ // reactotron logging
+ if (__DEV__) {
+ env.reactotron.setRootStore(rootStore, data)
+ }
+
+ // track changes & save to storage
+ onSnapshot(rootStore, (snapshot) => storage.save(ROOT_STATE_STORAGE_KEY, snapshot))
+
+ return rootStore
+}
diff --git a/app_expo/navigators/index.ts b/app_expo/navigators/index.ts
new file mode 100644
index 0000000..57dfc6f
--- /dev/null
+++ b/app_expo/navigators/index.ts
@@ -0,0 +1,4 @@
+export * from './main-navigator'
+export * from './root-navigator'
+export * from './navigation-utilities'
+// export other navigators from here
diff --git a/app_expo/navigators/main-navigator.tsx b/app_expo/navigators/main-navigator.tsx
new file mode 100644
index 0000000..095a9bf
--- /dev/null
+++ b/app_expo/navigators/main-navigator.tsx
@@ -0,0 +1,59 @@
+/**
+ * This is the navigator you will modify to display the logged-in screens of your app.
+ * You can use RootNavigator to also display an auth flow or other user flows.
+ *
+ * You'll likely spend most of your time in this file.
+ */
+import React from 'react'
+import { createStackNavigator } from '@react-navigation/stack'
+import { WelcomeScreen, DemoScreen, DemoListScreen, GraphScreen } from '../screens'
+
+/**
+ * This type allows TypeScript to know what routes are defined in this navigator
+ * as well as what properties (if any) they might take when navigating to them.
+ *
+ * If no params are allowed, pass through `undefined`. Generally speaking, we
+ * recommend using your MobX-State-Tree store(s) to keep application state
+ * rather than passing state through navigation params.
+ *
+ * For more information, see this documentation:
+ * https://reactnavigation.org/docs/params/
+ * https://reactnavigation.org/docs/typescript#type-checking-the-navigator
+ */
+export type PrimaryParamList = {
+ welcome: undefined
+ demo: undefined
+ demoList: undefined
+ graph: undefined
+}
+
+// Documentation: https://reactnavigation.org/docs/stack-navigator/
+const Stack = createStackNavigator<PrimaryParamList>()
+
+export function MainNavigator() {
+ return (
+ <Stack.Navigator
+ screenOptions={{
+ cardStyle: { backgroundColor: 'transparent' },
+ headerShown: false,
+ }}
+ >
+ <Stack.Screen name="graph" component={GraphScreen} />
+ </Stack.Navigator>
+ )
+}
+
+/**
+ <Stack.Screen name="welcome" component={WelcomeScreen} />
+ <Stack.Screen name="demo" component={DemoScreen} />
+ <Stack.Screen name="demoList" component={DemoListScreen} />
+ * A list of routes from which we're allowed to leave the app when
+ * the user presses the back button on Android.
+ *
+ * Anything not on this list will be a standard `back` action in
+ * react-navigation.
+ *
+ * `canExit` is used in ./app/app.tsx in the `useBackButtonHandler` hook.
+ */
+const exitRoutes = ['welcome']
+export const canExit = (routeName: string) => exitRoutes.includes(routeName)
diff --git a/app_expo/navigators/navigation-utilities.tsx b/app_expo/navigators/navigation-utilities.tsx
new file mode 100644
index 0000000..95137a4
--- /dev/null
+++ b/app_expo/navigators/navigation-utilities.tsx
@@ -0,0 +1,127 @@
+import React, { useState, useEffect, useRef } from 'react'
+import { BackHandler } from 'react-native'
+import { PartialState, NavigationState, NavigationContainerRef } from '@react-navigation/native'
+
+export const RootNavigation = {
+ navigate(name: string) {
+ name // eslint-disable-line no-unused-expressions
+ },
+ goBack() {}, // eslint-disable-line @typescript-eslint/no-empty-function
+ resetRoot(state?: PartialState<NavigationState> | NavigationState) {}, // eslint-disable-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
+ getRootState(): NavigationState {
+ return {} as any
+ },
+}
+
+export const setRootNavigation = (ref: React.RefObject<NavigationContainerRef>) => {
+ for (const method in RootNavigation) {
+ RootNavigation[method] = (...args: any) => {
+ if (ref.current) {
+ return ref.current[method](...args)
+ }
+ }
+ }
+}
+
+/**
+ * Gets the current screen from any navigation state.
+ */
+export function getActiveRouteName(state: NavigationState | PartialState<NavigationState>) {
+ const route = state.routes[state.index]
+
+ // Found the active route -- return the name
+ if (!route.state) return route.name
+
+ // Recursive call to deal with nested routers
+ return getActiveRouteName(route.state)
+}
+
+/**
+ * Hook that handles Android back button presses and forwards those on to
+ * the navigation or allows exiting the app.
+ */
+export function useBackButtonHandler(
+ ref: React.RefObject<NavigationContainerRef>,
+ canExit: (routeName: string) => boolean,
+) {
+ const canExitRef = useRef(canExit)
+
+ useEffect(() => {
+ canExitRef.current = canExit
+ }, [canExit])
+
+ useEffect(() => {
+ // We'll fire this when the back button is pressed on Android.
+ const onBackPress = () => {
+ const navigation = ref.current
+
+ if (navigation == null) {
+ return false
+ }
+
+ // grab the current route
+ const routeName = getActiveRouteName(navigation.getRootState())
+
+ // are we allowed to exit?
+ if (canExitRef.current(routeName)) {
+ // let the system know we've not handled this event
+ return false
+ }
+
+ // we can't exit, so let's turn this into a back action
+ if (navigation.canGoBack()) {
+ navigation.goBack()
+
+ return true
+ }
+
+ return false
+ }
+
+ // Subscribe when we come to life
+ BackHandler.addEventListener('hardwareBackPress', onBackPress)
+
+ // Unsubscribe when we're done
+ return () => BackHandler.removeEventListener('hardwareBackPress', onBackPress)
+ }, [ref])
+}
+
+/**
+ * Custom hook for persisting navigation state.
+ */
+export function useNavigationPersistence(storage: any, persistenceKey: string) {
+ const [initialNavigationState, setInitialNavigationState] = useState()
+ const [isRestoringNavigationState, setIsRestoringNavigationState] = useState(true)
+
+ const routeNameRef = useRef()
+ const onNavigationStateChange = (state) => {
+ const previousRouteName = routeNameRef.current
+ const currentRouteName = getActiveRouteName(state)
+
+ if (previousRouteName !== currentRouteName) {
+ // track screens.
+ __DEV__ && console.tron.log(currentRouteName)
+ }
+
+ // Save the current route name for later comparision
+ routeNameRef.current = currentRouteName
+
+ // Persist state to storage
+ storage.save(persistenceKey, state)
+ }
+
+ const restoreState = async () => {
+ try {
+ const state = await storage.load(persistenceKey)
+ if (state) setInitialNavigationState(state)
+ } finally {
+ setIsRestoringNavigationState(false)
+ }
+ }
+
+ useEffect(() => {
+ if (isRestoringNavigationState) restoreState()
+ }, [isRestoringNavigationState])
+
+ return { onNavigationStateChange, restoreState, initialNavigationState }
+}
diff --git a/app_expo/navigators/root-navigator.tsx b/app_expo/navigators/root-navigator.tsx
new file mode 100644
index 0000000..ed48dd5
--- /dev/null
+++ b/app_expo/navigators/root-navigator.tsx
@@ -0,0 +1,59 @@
+/**
+ * The root navigator is used to switch between major navigation flows of your app.
+ * Generally speaking, it will contain an auth flow (registration, login, forgot password)
+ * and a "main" flow (which is contained in your MainNavigator) which the user
+ * will use once logged in.
+ */
+import React from 'react'
+import { NavigationContainer, NavigationContainerRef } from '@react-navigation/native'
+import { createStackNavigator } from '@react-navigation/stack'
+import { MainNavigator } from './main-navigator'
+import { color } from '../theme'
+
+/**
+ * This type allows TypeScript to know what routes are defined in this navigator
+ * as well as what properties (if any) they might take when navigating to them.
+ *
+ * We recommend using MobX-State-Tree store(s) to handle state rather than navigation params.
+ *
+ * For more information, see this documentation:
+ * https://reactnavigation.org/docs/params/
+ * https://reactnavigation.org/docs/typescript#type-checking-the-navigator
+ */
+export type RootParamList = {
+ mainStack: undefined
+}
+
+const Stack = createStackNavigator<RootParamList>()
+
+const RootStack = () => {
+ return (
+ <Stack.Navigator
+ screenOptions={{
+ cardStyle: { backgroundColor: color.palette.deepPurple },
+ headerShown: false,
+ }}
+ >
+ <Stack.Screen
+ name="mainStack"
+ component={MainNavigator}
+ options={{
+ headerShown: false,
+ }}
+ />
+ </Stack.Navigator>
+ )
+}
+
+export const RootNavigator = React.forwardRef<
+ NavigationContainerRef,
+ Partial<React.ComponentProps<typeof NavigationContainer>>
+>((props, ref) => {
+ return (
+ <NavigationContainer {...props} ref={ref}>
+ <RootStack />
+ </NavigationContainer>
+ )
+})
+
+RootNavigator.displayName = 'RootNavigator'
diff --git a/app_expo/screens/demo/demo-list-screen.tsx b/app_expo/screens/demo/demo-list-screen.tsx
new file mode 100644
index 0000000..9164ccb
--- /dev/null
+++ b/app_expo/screens/demo/demo-list-screen.tsx
@@ -0,0 +1,86 @@
+import React, { useEffect } from 'react'
+import { FlatList, TextStyle, View, ViewStyle, ImageStyle } from 'react-native'
+import { useNavigation } from '@react-navigation/native'
+import { observer } from 'mobx-react-lite'
+import { Header, Screen, Text, Wallpaper, AutoImage as Image } from '../../components'
+import { color, spacing } from '../../theme'
+import { useStores } from '../../models'
+
+const FULL: ViewStyle = {
+ flex: 1,
+}
+const CONTAINER: ViewStyle = {
+ backgroundColor: color.transparent,
+}
+const HEADER: TextStyle = {
+ paddingBottom: spacing[5] - 1,
+ paddingHorizontal: spacing[4],
+ paddingTop: spacing[3],
+}
+const HEADER_TITLE: TextStyle = {
+ fontSize: 12,
+ fontWeight: 'bold',
+ letterSpacing: 1.5,
+ lineHeight: 15,
+ textAlign: 'center',
+}
+const LIST_CONTAINER: ViewStyle = {
+ alignItems: 'center',
+ flexDirection: 'row',
+ padding: 10,
+}
+const IMAGE: ImageStyle = {
+ borderRadius: 35,
+ height: 65,
+ width: 65,
+}
+const LIST_TEXT: TextStyle = {
+ marginLeft: 10,
+}
+const FLAT_LIST: ViewStyle = {
+ paddingHorizontal: spacing[4],
+}
+
+export const DemoListScreen = observer(function DemoListScreen() {
+ const navigation = useNavigation()
+ const goBack = () => navigation.goBack()
+
+ const { characterStore } = useStores()
+ const { characters } = characterStore
+
+ useEffect(() => {
+ async function fetchData() {
+ await characterStore.getCharacters()
+ }
+
+ fetchData()
+ }, [])
+
+ return (
+ <View testID="DemoListScreen" style={FULL}>
+ <Wallpaper />
+ <Screen style={CONTAINER} preset="fixed" backgroundColor={color.transparent}>
+ <Header
+ headerTx="demoListScreen.title"
+ leftIcon="back"
+ onLeftPress={goBack}
+ style={HEADER}
+ titleStyle={HEADER_TITLE}
+ />
+ <FlatList
+ contentContainerStyle={FLAT_LIST}
+ data={[...characters]}
+ keyExtractor={(item) => String(item.id)}
+ renderItem={({ item }) => (
+ <View style={LIST_CONTAINER}>
+ <Image source={{ uri: item.image }} style={IMAGE} />
+ <Text style={LIST_TEXT}>
+ {item.name} ({item.status})
+ </Text>
+ </View>
+ )}
+ />
+ </Screen>
+ </View>
+ )
+})
diff --git a/app_expo/screens/demo/demo-screen.tsx b/app_expo/screens/demo/demo-screen.tsx
new file mode 100644
index 0000000..a387c01
--- /dev/null
+++ b/app_expo/screens/demo/demo-screen.tsx
@@ -0,0 +1,180 @@
+import React from 'react'
+import { ImageStyle, Platform, TextStyle, View, ViewStyle } from 'react-native'
+import { useNavigation } from '@react-navigation/native'
+import { observer } from 'mobx-react-lite'
+import {
+ BulletItem,
+ Button,
+ Header,
+ Text,
+ Screen,
+ Wallpaper,
+ AutoImage as Image,
+} from '../../components'
+import { color, spacing } from '../../theme'
+import { Api } from '../../services/api'
+import { save } from '../../utils/storage'
+export const logoIgnite = require('./logo-ignite.png')
+export const heart = require('./heart.png')
+
+const FULL: ViewStyle = { flex: 1 }
+const CONTAINER: ViewStyle = {
+ backgroundColor: color.transparent,
+ paddingHorizontal: spacing[4],
+}
+const DEMO: ViewStyle = {
+ paddingVertical: spacing[4],
+ paddingHorizontal: spacing[4],
+ backgroundColor: color.palette.deepPurple,
+}
+const BOLD: TextStyle = { fontWeight: 'bold' }
+const DEMO_TEXT: TextStyle = {
+ ...BOLD,
+ fontSize: 13,
+ letterSpacing: 2,
+}
+const HEADER: TextStyle = {
+ paddingTop: spacing[3],
+ paddingBottom: spacing[5] - 1,
+ paddingHorizontal: 0,
+}
+const HEADER_TITLE: TextStyle = {
+ ...BOLD,
+ fontSize: 12,
+ lineHeight: 15,
+ textAlign: 'center',
+ letterSpacing: 1.5,
+}
+const TITLE: TextStyle = {
+ ...BOLD,
+ fontSize: 28,
+ lineHeight: 38,
+ textAlign: 'center',
+ marginBottom: spacing[5],
+}
+const TAGLINE: TextStyle = {
+ color: '#BAB6C8',
+ fontSize: 15,
+ lineHeight: 22,
+ marginBottom: spacing[4] + spacing[1],
+}
+const IGNITE: ImageStyle = {
+ marginVertical: spacing[6],
+ alignSelf: 'center',
+ width: 180,
+ height: 100,
+}
+const LOVE_WRAPPER: ViewStyle = {
+ flexDirection: 'row',
+ alignItems: 'center',
+ alignSelf: 'center',
+}
+const LOVE: TextStyle = {
+ color: '#BAB6C8',
+ fontSize: 15,
+ lineHeight: 22,
+}
+const HEART: ImageStyle = {
+ marginHorizontal: spacing[2],
+ width: 10,
+ height: 10,
+ resizeMode: 'contain',
+}
+const HINT: TextStyle = {
+ color: '#BAB6C8',
+ fontSize: 12,
+ lineHeight: 15,
+ marginVertical: spacing[2],
+}
+
+const platformCommand = Platform.select({
+ ios: 'Cmd + D',
+ android: 'Cmd/Ctrl + M',
+})
+
+export const DemoScreen = observer(function DemoScreen() {
+ const navigation = useNavigation()
+ const goBack = () => navigation.goBack()
+
+ const demoReactotron = React.useMemo(
+ () => async () => {
+ console.tron.log('Your Friendly tron log message')
+ console.tron.logImportant('I am important')
+ console.tron.display({
+ name: 'DISPLAY',
+ value: {
+ numbers: 1,
+ strings: 'strings',
+ booleans: true,
+ arrays: [1, 2, 3],
+ objects: {
+ deeper: {
+ deeper: {
+ yay: '👾',
+ },
+ },
+ },
+ functionNames: function hello() {
+ /* dummy function */
+ },
+ },
+ preview: 'More control with display()',
+ important: true,
+ image: {
+ uri: 'https://avatars2.githubusercontent.com/u/3902527?s=200&u=a0d16b13ed719f35d95ca0f4440f5d07c32c349a&v=4',
+ },
+ })
+ // make an API call for the demo
+ // Don't do API like this, use store's API
+ const demo = new Api()
+ demo.setup()
+ demo.getUser('1')
+ // Let's do some async storage stuff
+ await save('Cool Name', 'Boaty McBoatface')
+ },
+ [],
+ )
+
+ return (
+ <View testID="DemoScreen" style={FULL}>
+ <Wallpaper />
+ <Screen style={CONTAINER} preset="scroll" backgroundColor={color.transparent}>
+ <Header
+ headerTx="demoScreen.howTo"
+ leftIcon="back"
+ onLeftPress={goBack}
+ style={HEADER}
+ titleStyle={HEADER_TITLE}
+ />
+ <Text style={TITLE} preset="header" tx="demoScreen.title" />
+ <Text style={TAGLINE} tx="demoScreen.tagLine" />
+ <BulletItem text="Integrated here, Navigation with State, TypeScript, Storybook, Solidarity, and i18n." />
+ <BulletItem
+ text={`To run Storybook, press ${platformCommand} or shake the device to show the developer menu, then select "Toggle Storybook"`}
+ />
+ <BulletItem text="Load up Reactotron! You can inspect your app, view the events, interact, and so much more!" />
+ <View>
+ <Button
+ style={DEMO}
+ textStyle={DEMO_TEXT}
+ tx="demoScreen.reactotron"
+ onPress={demoReactotron}
+ />
+ <Text style={HINT} tx={`demoScreen.${Platform.OS}ReactotronHint` as const} />
+ </View>
+ <Button
+ style={DEMO}
+ textStyle={DEMO_TEXT}
+ tx="demoScreen.demoList"
+ onPress={() => navigation.navigate('demoList')}
+ />
+ <Image source={logoIgnite} style={IGNITE} />
+ <View style={LOVE_WRAPPER}>
+ <Text style={LOVE} text="Made with" />
+ <Image source={heart} style={HEART} />
+ <Text style={LOVE} text="by Infinite Red" />
+ </View>
+ </Screen>
+ </View>
+ )
+})
diff --git a/app_expo/screens/demo/heart.png b/app_expo/screens/demo/heart.png
new file mode 100644
index 0000000..9890998
--- /dev/null
+++ b/app_expo/screens/demo/heart.png
Binary files differ
diff --git a/app_expo/screens/demo/[email protected] b/app_expo/screens/demo/[email protected]
new file mode 100644
index 0000000..e8b70d9
--- /dev/null
+++ b/app_expo/screens/demo/[email protected]
Binary files differ
diff --git a/app_expo/screens/demo/logo-ignite.png b/app_expo/screens/demo/logo-ignite.png
new file mode 100644
index 0000000..36af16d
--- /dev/null
+++ b/app_expo/screens/demo/logo-ignite.png
Binary files differ
diff --git a/app_expo/screens/demo/[email protected] b/app_expo/screens/demo/[email protected]
new file mode 100644
index 0000000..fdbfad8
--- /dev/null
+++ b/app_expo/screens/demo/[email protected]
Binary files differ
diff --git a/app_expo/screens/graph/graph-screen.tsx b/app_expo/screens/graph/graph-screen.tsx
new file mode 100644
index 0000000..8c35590
--- /dev/null
+++ b/app_expo/screens/graph/graph-screen.tsx
@@ -0,0 +1,264 @@
+import React, { useEffect, useState } from 'react'
+import { observer } from 'mobx-react-lite'
+import { TouchableOpacity, View, ViewStyle } from 'react-native'
+import { Screen, Text } from '../../components'
+// import { useNavigation } from "@react-navigation/native"
+// import { useStores } from "../../models"
+import { color } from '../../theme'
+
+import { Graph } from '../../components'
+import { Tweaks } from '../../components'
+
+import genRandomTree from '../../data/randomdata'
+
+import AsyncStorage from '@react-native-async-storage/async-storage'
+
+import axios from 'axios'
+
+import rando from '../../data/rando.json'
+
+const ROOT: ViewStyle = {
+ backgroundColor: color.palette.black,
+ flex: 1,
+}
+
+import { LocalButton } from '../../components/'
+import { GraphUi } from '../../components/graph-ui/graph-ui'
+import { Switch } from 'react-native-elements'
+export const GraphScreen = observer(function GraphScreen() {
+ // Pull in one of our MST stores
+ // const { someStore, anotherStore } = useStores()
+
+ // Pull in navigation via hook
+ // const navigation = useNavigation()
+
+ const [physics, setPhysics] = useState({})
+ const [graphData, setGraphData] = useState()
+ const [nodeIds, setNodeIds] = useState([])
+ // { "nodes": [{ "id": 1 }, { "id": 2 }], "links": [{ "target": 1, "source": 2 }] });
+ const physicsInit = {
+ charge: -350,
+ collision: true,
+ linkStrength: 0.1,
+ linkIts: 1,
+ particles: 2,
+ linkOpacity: 0.4,
+ linkWidth: 1,
+ particleWidth: 4,
+ nodeRel: 4,
+ labels: true,
+ labelScale: 1.5,
+ alphaDecay: 0.16,
+ alphaTarget: 0,
+ velocityDecay: 0.25,
+ gravity: 0.5,
+ gravityOn: true,
+ hover: true,
+ colorful: true,
+ galaxy: true,
+ rootId: 0,
+ }
+
+ const getData = async () => {
+ try {
+ const value: string = await AsyncStorage.getItem('@physics')
+ if (value !== null) {
+ const valueJson = JSON.parse(value)
+ if (Object.keys(valueJson).length === Object.keys(physicsInit).length) {
+ valueJson.local = false
+ return valueJson
+ } else {
+ return physicsInit
+ }
+ } else {
+ return physicsInit
+ }
+ } catch (e) {
+ console.log(e)
+ }
+ }
+ const storeData = async (value) => {
+ try {
+ let jsonVal = JSON.stringify(value)
+ console.log(jsonVal + ' ' + value)
+ await AsyncStorage.setItem('@physics', jsonVal)
+ } catch (e) {
+ console.log(e)
+ }
+ }
+
+ // hook to save the current configuration of the physics tweaks
+ // after it is updated
+ useEffect(() => {
+ if (timer) {
+ clearTimeout(timer)
+ }
+ // set timer so the thing doesn't run every single slider tick
+ const timer = setTimeout(() => {
+ storeData(physics)
+ }, 1000)
+ return () => clearTimeout(timer)
+ }, [physics])
+
+ //"ComponentOnMount"
+ // Get previous settings and the data from the org-roam-server
+ const sanitizeGraph = (data) => {
+ const cleanLinks = []
+ data.links.forEach((link, j) => {
+ let target
+ let source
+ for (let i = 0; i < data.nodes.length; i++) {
+ let a = data.nodes[i]
+ !a.neighbors && (a.neighbors = [])
+ !a.links && (a.links = [])
+ // the first time around,
+ // index the node as not a part of the local graph
+ !j && (a.local = false)
+ if (link.target === data.nodes[i].id) {
+ a.links.push(link)
+ target = [a, i]
+ link.target === link.source ? null : cleanLinks.push(link)
+ } else if (link.source === data.nodes[i].id) {
+ a.links.push(link)
+ source = [a, i]
+ }
+ }
+ if (target && source) {
+ data.nodes[target[1]].neighbors.push(source[0])
+ data.nodes[source[1]].neighbors.push(target[0])
+ link.sourceIndex = source[1]
+ link.targetIndex = target[1]
+ link.index = [j]
+ link.local = false
+ }
+ })
+ data.links = cleanLinks
+ return data
+ }
+
+ const [theme, setTheme] = useState({
+ base1: '#1c1f24',
+ base2: '#21272d',
+ base3: '#23272e',
+ base4: '#484854',
+ base5: '#62686E',
+ base6: '#757B80',
+ base7: '#9ca0a4',
+ base8: '#DFDFDF',
+ bg: '#242730',
+ 'bg-alt': '#2a2e38',
+ blue: '#51afef',
+ cyan: '#5cEfFF',
+ 'dark-blue': '#1f5582',
+ 'dark-cyan': '#6A8FBF',
+ fg: '#bbc2cf',
+ 'fg-alt': '#5D656B',
+ green: '#7bc275',
+ grey: '#484854',
+ magenta: '#C57BDB',
+ orange: '#e69055',
+ red: '#ff665c',
+ teal: '#4db5bd',
+ violet: '#a991f1',
+ yellow: '#FCCE7B',
+ })
+
+ useEffect(() => {
+ getData().then((data) => setPhysics(data))
+ axios
+ .get('http://localhost:35901/theme')
+ .then((theme) => {
+ setTheme(theme.data)
+ console.log(theme.data)
+ })
+ .catch((e) => {
+ console.log('No theme found')
+ })
+ axios
+ .get('http://localhost:35901/graph')
+ .then((dataa) => {
+ let cleanData = sanitizeGraph(dataa.data)
+ console.log(cleanData)
+ setGraphData(cleanData)
+ })
+ .catch((e) => {
+ console.log(e)
+ console.log("Couldn't get data.")
+ //setGraphData(rando);
+ })
+ }, [])
+
+ const [threeDim, setThreeDim] = useState(false)
+ const [local, setLocal] = useState(false)
+
+ if (!graphData) {
+ return null
+ } else {
+ return (
+ <Screen style={ROOT} preset="fixed">
+ <View
+ style={{
+ display: 'flex',
+ flexDirection: 'row',
+ height: '100%',
+ width: '100%',
+ position: 'absolute',
+ zIndex: 150,
+ }}
+ >
+ <Tweaks physics={physics} setPhysics={setPhysics} />
+ <View
+ style={{
+ marginLeft: 'auto',
+ marginRight: '2%',
+ marginTop: '2%',
+ zIndex: 5,
+ position: 'relative',
+ height: '15%',
+ }}
+ >
+ <LocalButton local={local} setLocal={setLocal} />
+ <View
+ style={{
+ display: 'flex',
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingTop: '2%',
+ }}
+ >
+ <Text preset="header" text="3D" style={{ marginLeft: 10 }} />
+ <Switch
+ color="#a991f1"
+ trackColor={{
+ false: '#62686E',
+ true: '#a991f1',
+ }}
+ style={{
+ height: 25,
+ marginVertical: 10,
+ marginLeft: 20,
+ }}
+ value={threeDim}
+ onValueChange={() => {
+ setThreeDim(!threeDim)
+ }}
+ />
+ </View>
+ </View>
+ <Graph
+ style={{ position: 'absolute' }}
+ setPhysics={setPhysics}
+ physics={physics}
+ gData={graphData}
+ nodeIds={nodeIds}
+ threeDim={threeDim}
+ setThreeDim={setThreeDim}
+ local={local}
+ setLocal={setLocal}
+ />
+ </View>
+ </Screen>
+ )
+ }
+})
diff --git a/app_expo/screens/index.ts b/app_expo/screens/index.ts
new file mode 100644
index 0000000..1ba716f
--- /dev/null
+++ b/app_expo/screens/index.ts
@@ -0,0 +1,5 @@
+export * from './welcome/welcome-screen'
+export * from './demo/demo-screen'
+export * from './demo/demo-list-screen'
+// export other screens here
+export * from './graph/graph-screen'
diff --git a/app_expo/screens/welcome/bowser.png b/app_expo/screens/welcome/bowser.png
new file mode 100644
index 0000000..2b0bdbc
--- /dev/null
+++ b/app_expo/screens/welcome/bowser.png
Binary files differ
diff --git a/app_expo/screens/welcome/[email protected] b/app_expo/screens/welcome/[email protected]
new file mode 100644
index 0000000..85cc693
--- /dev/null
+++ b/app_expo/screens/welcome/[email protected]
Binary files differ
diff --git a/app_expo/screens/welcome/welcome-screen.tsx b/app_expo/screens/welcome/welcome-screen.tsx
new file mode 100644
index 0000000..49a6777
--- /dev/null
+++ b/app_expo/screens/welcome/welcome-screen.tsx
@@ -0,0 +1,118 @@
+import React from 'react'
+import { View, ViewStyle, TextStyle, ImageStyle, SafeAreaView } from 'react-native'
+import { useNavigation } from '@react-navigation/native'
+import { observer } from 'mobx-react-lite'
+import { Button, Header, Screen, Text, Wallpaper, AutoImage as Image } from '../../components'
+import { color, spacing, typography } from '../../theme'
+const bowserLogo = require('./bowser.png')
+
+const FULL: ViewStyle = { flex: 1 }
+const CONTAINER: ViewStyle = {
+ backgroundColor: color.transparent,
+ paddingHorizontal: spacing[4],
+}
+const TEXT: TextStyle = {
+ color: color.palette.white,
+ fontFamily: typography.primary,
+}
+const BOLD: TextStyle = { fontWeight: 'bold' }
+const HEADER: TextStyle = {
+ paddingTop: spacing[3],
+ paddingBottom: spacing[4] + spacing[1],
+ paddingHorizontal: 0,
+}
+const HEADER_TITLE: TextStyle = {
+ ...TEXT,
+ ...BOLD,
+ fontSize: 12,
+ lineHeight: 15,
+ textAlign: 'center',
+ letterSpacing: 1.5,
+}
+const TITLE_WRAPPER: TextStyle = {
+ ...TEXT,
+ textAlign: 'center',
+}
+const TITLE: TextStyle = {
+ ...TEXT,
+ ...BOLD,
+ fontSize: 28,
+ lineHeight: 38,
+ textAlign: 'center',
+}
+const ALMOST: TextStyle = {
+ ...TEXT,
+ ...BOLD,
+ fontSize: 26,
+ fontStyle: 'italic',
+}
+const BOWSER: ImageStyle = {
+ alignSelf: 'center',
+ marginVertical: spacing[5],
+ maxWidth: '100%',
+ width: 343,
+ height: 230,
+}
+const CONTENT: TextStyle = {
+ ...TEXT,
+ color: '#BAB6C8',
+ fontSize: 15,
+ lineHeight: 22,
+ marginBottom: spacing[5],
+}
+const CONTINUE: ViewStyle = {
+ paddingVertical: spacing[4],
+ paddingHorizontal: spacing[4],
+ backgroundColor: color.palette.deepPurple,
+}
+const CONTINUE_TEXT: TextStyle = {
+ ...TEXT,
+ ...BOLD,
+ fontSize: 13,
+ letterSpacing: 2,
+}
+const FOOTER: ViewStyle = { backgroundColor: '#20162D' }
+const FOOTER_CONTENT: ViewStyle = {
+ paddingVertical: spacing[4],
+ paddingHorizontal: spacing[4],
+}
+
+export const WelcomeScreen = observer(function WelcomeScreen() {
+ const navigation = useNavigation()
+ const nextScreen = () => navigation.navigate('demo')
+
+ return (
+ <View testID="WelcomeScreen" style={FULL}>
+ <Wallpaper />
+ <Screen style={CONTAINER} preset="scroll" backgroundColor={color.transparent}>
+ <Header headerTx="welcomeScreen.poweredBy" style={HEADER} titleStyle={HEADER_TITLE} />
+ <Text style={TITLE_WRAPPER}>
+ <Text style={TITLE} text="Your new app, " />
+ <Text style={ALMOST} text="almost" />
+ <Text style={TITLE} text="!" />
+ </Text>
+ <Text style={TITLE} preset="header" tx="welcomeScreen.readyForLaunch" />
+ <Image source={bowserLogo} style={BOWSER} />
+ <Text style={CONTENT}>
+ This probably isn't what your app is going to look like. Unless your designer handed you
+ this screen and, in that case, congrats! You're ready to ship.
+ </Text>
+ <Text style={CONTENT}>
+ For everyone else, this is where you'll see a live preview of your fully functioning app
+ using Ignite.
+ </Text>
+ </Screen>
+ <SafeAreaView style={FOOTER}>
+ <View style={FOOTER_CONTENT}>
+ <Button
+ testID="next-screen-button"
+ style={CONTINUE}
+ textStyle={CONTINUE_TEXT}
+ tx="welcomeScreen.continue"
+ onPress={nextScreen}
+ />
+ </View>
+ </SafeAreaView>
+ </View>
+ )
+})
diff --git a/app_expo/services/api/api-config.ts b/app_expo/services/api/api-config.ts
new file mode 100644
index 0000000..b939c0e
--- /dev/null
+++ b/app_expo/services/api/api-config.ts
@@ -0,0 +1,27 @@
+// Use this import if you want to use "env.js" file
+// const { API_URL } = require("../../config/env")
+// Or just specify it directly like this:
+const API_URL = 'http://example.com'
+
+/**
+ * The options used to configure the API.
+ */
+export interface ApiConfig {
+ /**
+ * The URL of the api.
+ */
+ url: string
+
+ /**
+ * Milliseconds before we timeout the request.
+ */
+ timeout: number
+}
+
+/**
+ * The default configuration for the app.
+ */
+export const DEFAULT_API_CONFIG: ApiConfig = {
+ url: API_URL || 'https://jsonplaceholder.typicode.com',
+ timeout: 10000,
+}
diff --git a/app_expo/services/api/api-problem.test.ts b/app_expo/services/api/api-problem.test.ts
new file mode 100644
index 0000000..f8b4041
--- /dev/null
+++ b/app_expo/services/api/api-problem.test.ts
@@ -0,0 +1,100 @@
+import { getGeneralApiProblem } from './api-problem'
+import { ApiErrorResponse } from 'apisauce'
+
+test('handles connection errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'CONNECTION_ERROR',
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'cannot-connect',
+ temporary: true,
+ })
+})
+
+test('handles network errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'NETWORK_ERROR',
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'cannot-connect',
+ temporary: true,
+ })
+})
+
+test('handles timeouts', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'TIMEOUT_ERROR',
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'timeout',
+ temporary: true,
+ })
+})
+
+test('handles server errors', () => {
+ expect(getGeneralApiProblem({ problem: 'SERVER_ERROR' } as ApiErrorResponse<null>)).toEqual({
+ kind: 'server',
+ })
+})
+
+test('handles unknown errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'UNKNOWN_ERROR',
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'unknown',
+ temporary: true,
+ })
+})
+
+test('handles unauthorized errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'CLIENT_ERROR',
+ status: 401,
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'unauthorized',
+ })
+})
+
+test('handles forbidden errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'CLIENT_ERROR',
+ status: 403,
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'forbidden',
+ })
+})
+
+test('handles not-found errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'CLIENT_ERROR',
+ status: 404,
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'not-found',
+ })
+})
+
+test('handles other client errors', () => {
+ expect(
+ getGeneralApiProblem({
+ problem: 'CLIENT_ERROR',
+ status: 418,
+ } as ApiErrorResponse<null>),
+ ).toEqual({
+ kind: 'rejected',
+ })
+})
+
+test('handles cancellation errors', () => {
+ expect(getGeneralApiProblem({ problem: 'CANCEL_ERROR' } as ApiErrorResponse<null>)).toBeNull()
+})
diff --git a/app_expo/services/api/api-problem.ts b/app_expo/services/api/api-problem.ts
new file mode 100644
index 0000000..15ca850
--- /dev/null
+++ b/app_expo/services/api/api-problem.ts
@@ -0,0 +1,74 @@
+import { ApiResponse } from 'apisauce'
+
+export type GeneralApiProblem =
+ /**
+ * Times up.
+ */
+ | { kind: 'timeout'; temporary: true }
+ /**
+ * Cannot connect to the server for some reason.
+ */
+ | { kind: 'cannot-connect'; temporary: true }
+ /**
+ * The server experienced a problem. Any 5xx error.
+ */
+ | { kind: 'server' }
+ /**
+ * We're not allowed because we haven't identified ourself. This is 401.
+ */
+ | { kind: 'unauthorized' }
+ /**
+ * We don't have access to perform that request. This is 403.
+ */
+ | { kind: 'forbidden' }
+ /**
+ * Unable to find that resource. This is a 404.
+ */
+ | { kind: 'not-found' }
+ /**
+ * All other 4xx series errors.
+ */
+ | { kind: 'rejected' }
+ /**
+ * Something truly unexpected happened. Most likely can try again. This is a catch all.
+ */
+ | { kind: 'unknown'; temporary: true }
+ /**
+ * The data we received is not in the expected format.
+ */
+ | { kind: 'bad-data' }
+
+/**
+ * Attempts to get a common cause of problems from an api response.
+ *
+ * @param response The api response.
+ */
+export function getGeneralApiProblem(response: ApiResponse<any>): GeneralApiProblem | void {
+ switch (response.problem) {
+ case 'CONNECTION_ERROR':
+ return { kind: 'cannot-connect', temporary: true }
+ case 'NETWORK_ERROR':
+ return { kind: 'cannot-connect', temporary: true }
+ case 'TIMEOUT_ERROR':
+ return { kind: 'timeout', temporary: true }
+ case 'SERVER_ERROR':
+ return { kind: 'server' }
+ case 'UNKNOWN_ERROR':
+ return { kind: 'unknown', temporary: true }
+ case 'CLIENT_ERROR':
+ switch (response.status) {
+ case 401:
+ return { kind: 'unauthorized' }
+ case 403:
+ return { kind: 'forbidden' }
+ case 404:
+ return { kind: 'not-found' }
+ default:
+ return { kind: 'rejected' }
+ }
+ case 'CANCEL_ERROR':
+ return null
+ }
+
+ return null
+}
diff --git a/app_expo/services/api/api.ts b/app_expo/services/api/api.ts
new file mode 100644
index 0000000..4093d34
--- /dev/null
+++ b/app_expo/services/api/api.ts
@@ -0,0 +1,102 @@
+import { ApisauceInstance, create, ApiResponse } from 'apisauce'
+import { getGeneralApiProblem } from './api-problem'
+import { ApiConfig, DEFAULT_API_CONFIG } from './api-config'
+import * as Types from './api.types'
+
+/**
+ * Manages all requests to the API.
+ */
+export class Api {
+ /**
+ * The underlying apisauce instance which performs the requests.
+ */
+ apisauce: ApisauceInstance
+
+ /**
+ * Configurable options.
+ */
+ config: ApiConfig
+
+ /**
+ * Creates the api.
+ *
+ * @param config The configuration to use.
+ */
+ constructor(config: ApiConfig = DEFAULT_API_CONFIG) {
+ this.config = config
+ }
+
+ /**
+ * Sets up the API. This will be called during the bootup
+ * sequence and will happen before the first React component
+ * is mounted.
+ *
+ * Be as quick as possible in here.
+ */
+ setup() {
+ // construct the apisauce instance
+ this.apisauce = create({
+ baseURL: this.config.url,
+ timeout: this.config.timeout,
+ headers: {
+ Accept: 'application/json',
+ },
+ })
+ }
+
+ /**
+ * Gets a list of users.
+ */
+ async getUsers(): Promise<Types.GetUsersResult> {
+ // make the api call
+ const response: ApiResponse<any> = await this.apisauce.get(`/users`)
+
+ // the typical ways to die when calling an api
+ if (!response.ok) {
+ const problem = getGeneralApiProblem(response)
+ if (problem) return problem
+ }
+
+ const convertUser = (raw) => {
+ return {
+ id: raw.id,
+ name: raw.name,
+ }
+ }
+
+ // transform the data into the format we are expecting
+ try {
+ const rawUsers = response.data
+ const resultUsers: Types.User[] = rawUsers.map(convertUser)
+ return { kind: 'ok', users: resultUsers }
+ } catch {
+ return { kind: 'bad-data' }
+ }
+ }
+
+ /**
+ * Gets a single user by ID
+ */
+
+ async getUser(id: string): Promise<Types.GetUserResult> {
+ // make the api call
+ const response: ApiResponse<any> = await this.apisauce.get(`/users/${id}`)
+
+ // the typical ways to die when calling an api
+ if (!response.ok) {
+ const problem = getGeneralApiProblem(response)
+ if (problem) return problem
+ }
+
+ // transform the data into the format we are expecting
+ try {
+ const resultUser: Types.User = {
+ id: response.data.id,
+ name: response.data.name,
+ }
+ return { kind: 'ok', user: resultUser }
+ } catch {
+ return { kind: 'bad-data' }
+ }
+ }
+}
diff --git a/app_expo/services/api/api.types.ts b/app_expo/services/api/api.types.ts
new file mode 100644
index 0000000..21d3c87
--- /dev/null
+++ b/app_expo/services/api/api.types.ts
@@ -0,0 +1,13 @@
+import { GeneralApiProblem } from './api-problem'
+import { Character } from '../../models/character/character'
+
+export interface User {
+ id: number
+ name: string
+}
+
+export type GetUsersResult = { kind: 'ok'; users: User[] } | GeneralApiProblem
+export type GetUserResult = { kind: 'ok'; user: User } | GeneralApiProblem
+
+export type GetCharactersResult = { kind: 'ok'; characters: Character[] } | GeneralApiProblem
+export type GetCharacterResult = { kind: 'ok'; character: Character } | GeneralApiProblem
diff --git a/app_expo/services/api/character-api.ts b/app_expo/services/api/character-api.ts
new file mode 100644
index 0000000..e28ec48
--- /dev/null
+++ b/app_expo/services/api/character-api.ts
@@ -0,0 +1,37 @@
+import { ApiResponse } from 'apisauce'
+import { Api } from './api'
+import { GetCharactersResult } from './api.types'
+import { getGeneralApiProblem } from './api-problem'
+
+const API_PAGE_SIZE = 50
+
+export class CharacterApi {
+ private api: Api
+
+ constructor(api: Api) {
+ this.api = api
+ }
+
+ async getCharacters(): Promise<GetCharactersResult> {
+ try {
+ // make the api call
+ const response: ApiResponse<any> = await this.api.apisauce.get(
+ 'https://raw.githubusercontent.com/infinitered/ignite/master/data/rick-and-morty.json',
+ { amount: API_PAGE_SIZE },
+ )
+
+ // the typical ways to die when calling an api
+ if (!response.ok) {
+ const problem = getGeneralApiProblem(response)
+ if (problem) return problem
+ }
+
+ const characters = response.data.results
+
+ return { kind: 'ok', characters }
+ } catch (e) {
+ __DEV__ && console.tron.log(e.message)
+ return { kind: 'bad-data' }
+ }
+ }
+}
diff --git a/app_expo/services/api/index.ts b/app_expo/services/api/index.ts
new file mode 100644
index 0000000..f133e64
--- /dev/null
+++ b/app_expo/services/api/index.ts
@@ -0,0 +1,2 @@
+export * from './api'
+export * from './api.types'
diff --git a/app_expo/services/reactotron/index.ts b/app_expo/services/reactotron/index.ts
new file mode 100644
index 0000000..0c02f1f
--- /dev/null
+++ b/app_expo/services/reactotron/index.ts
@@ -0,0 +1 @@
+export * from './reactotron'
diff --git a/app_expo/services/reactotron/reactotron-config.ts b/app_expo/services/reactotron/reactotron-config.ts
new file mode 100644
index 0000000..40e9c93
--- /dev/null
+++ b/app_expo/services/reactotron/reactotron-config.ts
@@ -0,0 +1,30 @@
+export interface ReactotronConfig {
+ /** The name of the app. */
+ name?: string
+ /** The host to connect to: default 'localhost'. */
+ host?: string
+ /** Should we use async storage */
+ useAsyncStorage?: boolean
+ /** Should we clear Reactotron when load? */
+ clearOnLoad?: boolean
+ /** Root state logging. */
+ state?: {
+ /** log the initial data that we put into the state on startup? */
+ initial?: boolean
+ /** log snapshot changes. */
+ snapshots?: boolean
+ }
+}
+
+/**
+ * The default Reactotron configuration.
+ */
+export const DEFAULT_REACTOTRON_CONFIG: ReactotronConfig = {
+ clearOnLoad: true,
+ host: 'localhost',
+ useAsyncStorage: true,
+ state: {
+ initial: true,
+ snapshots: false,
+ },
+}
diff --git a/app_expo/services/reactotron/reactotron.ts b/app_expo/services/reactotron/reactotron.ts
new file mode 100644
index 0000000..6a20a75
--- /dev/null
+++ b/app_expo/services/reactotron/reactotron.ts
@@ -0,0 +1,185 @@
+import { Tron } from './tron'
+import AsyncStorage from '@react-native-async-storage/async-storage'
+import { RootStore } from '../../models/root-store/root-store'
+import { onSnapshot } from 'mobx-state-tree'
+import { ReactotronConfig, DEFAULT_REACTOTRON_CONFIG } from './reactotron-config'
+import { mst } from 'reactotron-mst'
+import { clear } from '../../utils/storage'
+import { RootNavigation } from '../../navigators'
+import { Platform } from 'react-native'
+
+// Teach TypeScript about the bad things we want to do.
+declare global {
+ interface Console {
+ /**
+ * Hey, it's Reactotron if we're in dev, and no-ops if we're in prod.
+ */
+ tron: typeof Tron
+ }
+}
+
+/** Do Nothing. */
+const noop = () => undefined
+
+// in dev, we attach Reactotron, in prod we attach a interface-compatible mock.
+if (__DEV__) {
+ console.tron = Tron // attach reactotron to `console.tron`
+} else {
+ // attach a mock so if things sneaky by our __DEV__ guards, we won't crash.
+ console.tron = {
+ benchmark: noop,
+ clear: noop,
+ close: noop,
+ configure: noop,
+ connect: noop,
+ display: noop,
+ error: noop,
+ image: noop,
+ log: noop,
+ logImportant: noop,
+ onCustomCommand: noop,
+ overlay: noop,
+ reportError: noop,
+ send: noop,
+ startTimer: noop,
+ storybookSwitcher: noop,
+ use: noop,
+ useReactNative: noop,
+ warn: noop,
+ }
+}
+
+/**
+ * You'll probably never use the service like this since we hang the Reactotron
+ * instance off of `console.tron`. This is only to be consistent with the other
+ * services.
+ */
+export class Reactotron {
+ config: ReactotronConfig
+
+ rootStore: any
+
+ /**
+ * Create the Reactotron service.
+ *
+ * @param config the configuration
+ */
+ constructor(config: ReactotronConfig = DEFAULT_REACTOTRON_CONFIG) {
+ // merge the passed in config with some defaults
+ this.config = {
+ host: 'localhost',
+ useAsyncStorage: true,
+ ...config,
+ state: {
+ initial: false,
+ snapshots: false,
+ ...(config && config.state),
+ },
+ }
+ }
+
+ /**
+ * Hook into the root store for doing awesome state-related things.
+ *
+ * @param rootStore The root store
+ */
+ setRootStore(rootStore: any, initialData: any) {
+ if (__DEV__) {
+ rootStore = rootStore as RootStore // typescript hack
+ this.rootStore = rootStore
+
+ const { initial, snapshots } = this.config.state
+ const name = 'ROOT STORE'
+
+ // logging features
+ if (initial) {
+ console.tron.display({
+ name,
+ value: initialData,
+ preview: 'Initial State',
+ })
+ }
+ // log state changes?
+ if (snapshots) {
+ onSnapshot(rootStore, (snapshot) => {
+ console.tron.display({ name, value: snapshot, preview: 'New State' })
+ })
+ }
+
+ console.tron.trackMstNode(rootStore)
+ }
+ }
+
+ /**
+ * Configure reactotron based on the the config settings passed in, then connect if we need to.
+ */
+ async setup() {
+ // only run this in dev... metro bundler will ignore this block: 🎉
+ if (__DEV__) {
+ // configure reactotron
+ Tron.configure({
+ name: this.config.name || require('../../../package.json').name,
+ host: this.config.host,
+ })
+
+ // hookup middleware
+ if (Platform.OS !== 'web') {
+ if (this.config.useAsyncStorage) {
+ Tron.setAsyncStorageHandler(AsyncStorage)
+ }
+ Tron.useReactNative({
+ asyncStorage: this.config.useAsyncStorage ? undefined : false,
+ })
+ }
+
+ // ignore some chatty `mobx-state-tree` actions
+ const RX = /postProcessSnapshot|@APPLY_SNAPSHOT/
+
+ // hookup mobx-state-tree middleware
+ Tron.use(
+ mst({
+ filter: (event) => RX.test(event.name) === false,
+ }),
+ )
+
+ // connect to the app
+ Tron.connect()
+
+ // Register Custom Commands
+ Tron.onCustomCommand({
+ title: 'Reset Root Store',
+ description: 'Resets the MST store',
+ command: 'resetStore',
+ handler: () => {
+ console.tron.log('resetting store')
+ clear()
+ },
+ })
+
+ Tron.onCustomCommand({
+ title: 'Reset Navigation State',
+ description: 'Resets the navigation state',
+ command: 'resetNavigation',
+ handler: () => {
+ console.tron.log('resetting navigation state')
+ RootNavigation.resetRoot({ routes: [] })
+ },
+ })
+
+ Tron.onCustomCommand({
+ title: 'Go Back',
+ description: 'Goes back',
+ command: 'goBack',
+ handler: () => {
+ console.tron.log('Going back')
+ RootNavigation.goBack()
+ },
+ })
+
+ // clear if we should
+ if (this.config.clearOnLoad) {
+ Tron.clear()
+ }
+ }
+ }
+}
diff --git a/app_expo/services/reactotron/tron.ts b/app_expo/services/reactotron/tron.ts
new file mode 100644
index 0000000..6086e48
--- /dev/null
+++ b/app_expo/services/reactotron/tron.ts
@@ -0,0 +1,2 @@
+import Reactotron from 'reactotron-react-native'
+export const Tron = Reactotron
diff --git a/app_expo/services/reactotron/tron.web.ts b/app_expo/services/reactotron/tron.web.ts
new file mode 100644
index 0000000..a525c06
--- /dev/null
+++ b/app_expo/services/reactotron/tron.web.ts
@@ -0,0 +1,2 @@
+import Reactotron from 'reactotron-react-js'
+export const Tron = Reactotron
diff --git a/app_expo/theme/color.ts b/app_expo/theme/color.ts
new file mode 100644
index 0000000..aa582e7
--- /dev/null
+++ b/app_expo/theme/color.ts
@@ -0,0 +1,64 @@
+import { palette } from './palette'
+
+/**
+ * Roles for colors. Prefer using these over the palette. It makes it easier
+ * to change things.
+ *
+ * The only roles we need to place in here are the ones that span through the app.
+ *
+ * If you have a specific use-case, like a spinner color. It makes more sense to
+ * put that in the <Spinner /> component.
+ */
+export const color = {
+ /**
+ * The palette is available to use, but prefer using the name.
+ */
+ palette,
+ /**
+ * A helper for making something see-thru. Use sparingly as many layers of transparency
+ * can cause older Android devices to slow down due to the excessive compositing required
+ * by their under-powered GPUs.
+ */
+ transparent: 'rgba(0, 0, 0, 0)',
+ /**
+ * The screen background.
+ */
+ background: palette.white,
+ /**
+ * The main tinting color.
+ */
+ primary: palette.orange,
+ /**
+ * The main tinting color, but darker.
+ */
+ primaryDarker: palette.orangeDarker,
+ /**
+ * A subtle color used for borders and lines.
+ */
+ line: palette.offWhite,
+ /**
+ * The default color of text in many components.
+ */
+ text: palette.white,
+ /**
+ * Secondary information.
+ */
+ dim: palette.lightGrey,
+ /**
+ * Error messages and icons.
+ */
+ error: palette.angry,
+
+ /**
+ * Storybook background for Text stories, or any stories where
+ * the text color is color.text, which is white by default, and does not show
+ * in Stories against the default white background
+ */
+ storybookDarkBg: palette.black,
+
+ /**
+ * Storybook text color for stories that display Text components against the
+ * white background
+ */
+ storybookTextColor: palette.black,
+}
diff --git a/app_expo/theme/fonts/index.ts b/app_expo/theme/fonts/index.ts
new file mode 100644
index 0000000..e55248d
--- /dev/null
+++ b/app_expo/theme/fonts/index.ts
@@ -0,0 +1,12 @@
+// import * as Font from "expo-font"
+
+export const initFonts = async () => {
+ // Refer to ./assets/fonts/custom-fonts.md for instructions.
+ // ...
+ // Welcome back! Just uncomment this and replace/append with your font file names!
+ // ⬇
+ // await Font.loadAsync({
+ // Montserrat: require("./Montserrat-Regular.ttf"),
+ // "Montserrat-Regular": require("./Montserrat-Regular.ttf"),
+ // })
+}
diff --git a/app_expo/theme/index.ts b/app_expo/theme/index.ts
new file mode 100644
index 0000000..95cca26
--- /dev/null
+++ b/app_expo/theme/index.ts
@@ -0,0 +1,4 @@
+export * from './color'
+export * from './spacing'
+export * from './typography'
+export * from './timing'
diff --git a/app_expo/theme/palette.ts b/app_expo/theme/palette.ts
new file mode 100644
index 0000000..b2b075d
--- /dev/null
+++ b/app_expo/theme/palette.ts
@@ -0,0 +1,11 @@
+export const palette = {
+ black: '#1d1d1d',
+ white: '#ffffff',
+ offWhite: '#e6e6e6',
+ orange: '#FBA928',
+ orangeDarker: '#EB9918',
+ lightGrey: '#939AA4',
+ lighterGrey: '#CDD4DA',
+ angry: '#dd3333',
+ deepPurple: '#5D2555',
+}
diff --git a/app_expo/theme/spacing.ts b/app_expo/theme/spacing.ts
new file mode 100644
index 0000000..b1b7935
--- /dev/null
+++ b/app_expo/theme/spacing.ts
@@ -0,0 +1,41 @@
+/**
+ * NOTE TO DEVS:
+ *
+ * Spacing should be consistent and whitespace thought of as a first class technique up
+ * there with color and typefaces.
+ *
+ * Which type of scale you use is based on the design.
+ *
+ * If you've got simpler app, you may only need 6 items. Or maybe you want a spacing scale
+ * to be named:
+ *
+ * export const spacing = {
+ * tiny: 4,
+ * small: 8,
+ * medium: 12,
+ * large: 24,
+ * huge: 64
+ * }
+ *
+ * Whatever you choose, try to stick with these, and not freestyle it everywhere.
+ *
+ * Feel free to delete this block.
+ */
+
+/**
+ * The available spacing.
+ *
+ * Here's the rough guideline. Customize this for you usage. It's ok to put exceptions
+ * within the components themselves if they are truly exceptions.
+ *
+ * 0 = none - nothing. only here to bust out of a zero-based array.
+ * 1 = tiny - elements contextually close to each other
+ * 2 = smaller - for groups of closely related items or perhaps borders
+ * 3 = small - ?
+ * 4 = medium - ?
+ * 5 = medium+ - ?
+ * 6 = large - between groups of content that aren't related?
+ * 7 = huge - ?
+ * 8 = massive - an uncomfortable amount of whitespace
+ */
+export const spacing = [0, 4, 8, 12, 16, 24, 32, 48, 64]
diff --git a/app_expo/theme/timing.ts b/app_expo/theme/timing.ts
new file mode 100644
index 0000000..b8b7203
--- /dev/null
+++ b/app_expo/theme/timing.ts
@@ -0,0 +1,6 @@
+export const timing = {
+ /**
+ * The duration (ms) for quick animations.
+ */
+ quick: 300,
+}
diff --git a/app_expo/theme/typography.ts b/app_expo/theme/typography.ts
new file mode 100644
index 0000000..1695777
--- /dev/null
+++ b/app_expo/theme/typography.ts
@@ -0,0 +1,31 @@
+import { Platform } from 'react-native'
+
+/**
+ * You can find a list of available fonts on both iOS and Android here:
+ * https://github.com/react-native-training/react-native-fonts
+ *
+ * If you're interested in adding a custom font to your project,
+ * check out the readme file in ./assets/fonts/ then come back here
+ * and enter your new font name. Remember the Android font name
+ * is probably different than iOS.
+ * More on that here:
+ * https://github.com/lendup/react-native-cross-platform-text
+ *
+ * The various styles of fonts are defined in the <Text /> component.
+ */
+export const typography = {
+ /**
+ * The primary font. Used in most places.
+ */
+ primary: Platform.select({ ios: 'Helvetica', android: 'normal' }),
+
+ /**
+ * An alternate font used for perhaps titles and stuff.
+ */
+ secondary: Platform.select({ ios: 'Arial', android: 'sans-serif' }),
+
+ /**
+ * Lets get fancy with a monospace font!
+ */
+ code: Platform.select({ ios: 'Courier', android: 'monospace' }),
+}
diff --git a/app_expo/utils/delay.ts b/app_expo/utils/delay.ts
new file mode 100644
index 0000000..6a2ef8d
--- /dev/null
+++ b/app_expo/utils/delay.ts
@@ -0,0 +1,6 @@
+/**
+ * A "modern" sleep statement.
+ *
+ * @param ms The number of milliseconds to wait.
+ */
+export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
diff --git a/app_expo/utils/ignore-warnings.ts b/app_expo/utils/ignore-warnings.ts
new file mode 100644
index 0000000..3d02efd
--- /dev/null
+++ b/app_expo/utils/ignore-warnings.ts
@@ -0,0 +1,10 @@
+/**
+ * Ignore some yellowbox warnings. Some of these are for deprecated functions
+ * that we haven't gotten around to replacing yet.
+ */
+import { LogBox } from 'react-native'
+
+// prettier-ignore
+LogBox.ignoreLogs([
+ "Require cycle:",
+])
diff --git a/app_expo/utils/keychain.ts b/app_expo/utils/keychain.ts
new file mode 100644
index 0000000..bcbc379
--- /dev/null
+++ b/app_expo/utils/keychain.ts
@@ -0,0 +1,63 @@
+import * as ReactNativeKeychain from 'react-native-keychain'
+
+/**
+ * Saves some credentials securely.
+ *
+ * @param username The username
+ * @param password The password
+ * @param server The server these creds are for.
+ */
+export async function save(username: string, password: string, server?: string) {
+ if (server) {
+ await ReactNativeKeychain.setInternetCredentials(server, username, password)
+ return true
+ } else {
+ return ReactNativeKeychain.setGenericPassword(username, password)
+ }
+}
+
+/**
+ * Loads credentials that were already saved.
+ *
+ * @param server The server that these creds are for
+ */
+export async function load(server?: string) {
+ if (server) {
+ const creds = await ReactNativeKeychain.getInternetCredentials(server)
+ return {
+ username: creds ? creds.username : null,
+ password: creds ? creds.password : null,
+ server,
+ }
+ } else {
+ const creds = await ReactNativeKeychain.getGenericPassword()
+ if (typeof creds === 'object') {
+ return {
+ username: creds.username,
+ password: creds.password,
+ server: null,
+ }
+ } else {
+ return {
+ username: null,
+ password: null,
+ server: null,
+ }
+ }
+ }
+}
+
+/**
+ * Resets any existing credentials for the given server.
+ *
+ * @param server The server which has these creds
+ */
+export async function reset(server?: string) {
+ if (server) {
+ await ReactNativeKeychain.resetInternetCredentials(server)
+ return true
+ } else {
+ const result = await ReactNativeKeychain.resetGenericPassword()
+ return result
+ }
+}
diff --git a/app_expo/utils/storage/index.ts b/app_expo/utils/storage/index.ts
new file mode 100644
index 0000000..69b61ec
--- /dev/null
+++ b/app_expo/utils/storage/index.ts
@@ -0,0 +1 @@
+export * from './storage'
diff --git a/app_expo/utils/storage/storage.test.ts b/app_expo/utils/storage/storage.test.ts
new file mode 100644
index 0000000..bb241c0
--- /dev/null
+++ b/app_expo/utils/storage/storage.test.ts
@@ -0,0 +1,39 @@
+import AsyncStorage from '@react-native-async-storage/async-storage'
+import { load, loadString, save, saveString, clear, remove } from './storage'
+
+// fixtures
+const VALUE_OBJECT = { x: 1 }
+const VALUE_STRING = JSON.stringify(VALUE_OBJECT)
+
+beforeEach(() => (AsyncStorage.getItem as jest.Mock).mockReturnValue(Promise.resolve(VALUE_STRING)))
+afterEach(() => jest.clearAllMocks())
+
+test('load', async () => {
+ const value = await load('something')
+ expect(value).toEqual(JSON.parse(VALUE_STRING))
+})
+
+test('loadString', async () => {
+ const value = await loadString('something')
+ expect(value).toEqual(VALUE_STRING)
+})
+
+test('save', async () => {
+ await save('something', VALUE_OBJECT)
+ expect(AsyncStorage.setItem).toHaveBeenCalledWith('something', VALUE_STRING)
+})
+
+test('saveString', async () => {
+ await saveString('something', VALUE_STRING)
+ expect(AsyncStorage.setItem).toHaveBeenCalledWith('something', VALUE_STRING)
+})
+
+test('remove', async () => {
+ await remove('something')
+ expect(AsyncStorage.removeItem).toHaveBeenCalledWith('something')
+})
+
+test('clear', async () => {
+ await clear()
+ expect(AsyncStorage.clear).toHaveBeenCalledWith()
+})
diff --git a/app_expo/utils/storage/storage.ts b/app_expo/utils/storage/storage.ts
new file mode 100644
index 0000000..659e738
--- /dev/null
+++ b/app_expo/utils/storage/storage.ts
@@ -0,0 +1,79 @@
+import AsyncStorage from '@react-native-async-storage/async-storage'
+
+/**
+ * Loads a string from storage.
+ *
+ * @param key The key to fetch.
+ */
+export async function loadString(key: string): Promise<string | null> {
+ try {
+ return await AsyncStorage.getItem(key)
+ } catch {
+ // not sure why this would fail... even reading the RN docs I'm unclear
+ return null
+ }
+}
+
+/**
+ * Saves a string to storage.
+ *
+ * @param key The key to fetch.
+ * @param value The value to store.
+ */
+export async function saveString(key: string, value: string): Promise<boolean> {
+ try {
+ await AsyncStorage.setItem(key, value)
+ return true
+ } catch {
+ return false
+ }
+}
+
+/**
+ * Loads something from storage and runs it thru JSON.parse.
+ *
+ * @param key The key to fetch.
+ */
+export async function load(key: string): Promise<any | null> {
+ try {
+ const almostThere = await AsyncStorage.getItem(key)
+ return JSON.parse(almostThere)
+ } catch {
+ return null
+ }
+}
+
+/**
+ * Saves an object to storage.
+ *
+ * @param key The key to fetch.
+ * @param value The value to store.
+ */
+export async function save(key: string, value: any): Promise<boolean> {
+ try {
+ await AsyncStorage.setItem(key, JSON.stringify(value))
+ return true
+ } catch {
+ return false
+ }
+}
+
+/**
+ * Removes something from storage.
+ *
+ * @param key The key to kill.
+ */
+export async function remove(key: string): Promise<void> {
+ try {
+ await AsyncStorage.removeItem(key)
+ } catch {}
+}
+
+/**
+ * Burn it all to the ground.
+ */
+export async function clear(): Promise<void> {
+ try {
+ await AsyncStorage.clear()
+ } catch {}
+}
diff --git a/app_expo/utils/validate.ts b/app_expo/utils/validate.ts
new file mode 100644
index 0000000..838c0c1
--- /dev/null
+++ b/app_expo/utils/validate.ts
@@ -0,0 +1,77 @@
+const ValidateJS = require('validate.js')
+
+// HACK(steve): wierd typescript situation because of strange typings
+const Validate: any = ValidateJS.default ? ValidateJS.default : ValidateJS
+
+/**
+ * Validates that 1 attribute doesn't appear in another's attributes content.
+ */
+Validate.validators.excludes = function custom(value, options, key, attributes) {
+ const list = attributes[options.attribute] || []
+ if (value && list.includes(value)) {
+ return options.message || `${value} is in the list`
+ }
+}
+
+/**
+ * Validates that another attribute isn't true.
+ */
+Validate.validators.tripped = function custom(value, options, key, attributes) {
+ if (value && attributes[options.attribute] === true) {
+ return options.message || `${options.attribute} is true`
+ }
+}
+
+/**
+ * Defines the rules for validating.
+ *
+ * Example:
+ * ```ts
+ * const RULES = {
+ * favoriteBand: {
+ * inclusion: { ['Weezer', 'Other'], message: 'Pick wisely.' }
+ * },
+ * name: {
+ * presence: { message: 'A developer has no name?' }
+ * }
+ * }
+ * validate(RULES, {})
+ * ```
+ *
+ * See https://validatejs.org/#validators for more examples.
+ *
+ */
+export interface ValidationRules {
+ [key: string]: Record<string, unknown>
+}
+
+/**
+ * An object containing any errors found.
+ *
+ * Example:
+ * ```js
+ * {
+ * email: ['Invalid email address.'],
+ * password: [
+ * 'Password must be 6 characters.',
+ * 'Password must have at least 1 digit.'
+ * ]
+ * }
+ * ```
+ */
+export interface ValidationErrors {
+ [key: string]: string[]
+}
+
+/**
+ * Runs the given rules against the data object.
+ *
+ * @param rules The rules to apply.
+ * @param data The object to validate.
+ */
+export function validate(rules: ValidationRules, data: Record<string, unknown>): ValidationErrors {
+ if (typeof data !== 'object') {
+ return {} as ValidationErrors
+ }
+ return Validate(data, rules, { fullMessages: false }) || {}
+}