diff --git a/.gitignore b/.gitignore
index 9bdfbc71632719..3e87dcc4334ee0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,18 @@
venv/
+.clang-format
.DS_Store
.tags
.ipynb_checkpoints
.idea
+.overlay_init
+.overlay_consistent
.sconsign.dblite
+.vscode*
model2.png
a.out
+.hypothesis
+*.dylib
*.DSYM
*.d
*.pyc
@@ -14,7 +20,11 @@ a.out
.*.swp
.*.swo
.*.un~
+*.tmp
*.o
+*.o-*
+*.os
+*.os-*
*.so
*.a
*.clb
@@ -23,21 +33,52 @@ a.out
*.vcd
config.json
clcache
+compile_commands.json
+persist
board/obj/
selfdrive/boardd/boardd
selfdrive/logcatd/logcatd
selfdrive/mapd/default_speeds_by_region.json
selfdrive/proclogd/proclogd
-selfdrive/ui/ui
-selfdrive/test/tests/plant/out
+selfdrive/ui/_ui
+selfdrive/test/longitudinal_maneuvers/out
selfdrive/visiond/visiond
selfdrive/loggerd/loggerd
-selfdrive/sensord/gpsd
-selfdrive/sensord/sensord
+selfdrive/loggerd/bootlog
+selfdrive/sensord/_gpsd
+selfdrive/sensord/_sensord
+selfdrive/camerad/camerad
+selfdrive/camerad/test/ae_gray_test
+selfdrive/modeld/_modeld
+selfdrive/modeld/_dmonitoringmodeld
/src/
one
openpilot
+notebooks
xx
+yy
+hyperthneed
+panda_jungle
+provisioning
+.coverage*
+coverage.xml
+htmlcov
+pandaextra
+
+.mypy_cache/
+flycheck_*
+
+cppcheck_report.txt
+comma*.sh
+
+selfdrive/modeld/thneed/compile
+models/*.thneed
+
+*.bz2
+
+build/
+
+!**/.gitkeep
diff --git a/.pylintrc b/.pylintrc
deleted file mode 100644
index 64a55daf8fabb3..00000000000000
--- a/.pylintrc
+++ /dev/null
@@ -1,585 +0,0 @@
-[MASTER]
-
-# A comma-separated list of package or module names from where C extensions may
-# be loaded. Extensions are loading into the active Python interpreter and may
-# run arbitrary code
-extension-pkg-whitelist=scipy
-
-# Add files or directories to the blacklist. They should be base names, not
-# paths.
-ignore=CVS
-
-# Add files or directories matching the regex patterns to the blacklist. The
-# regex matches against base names, not paths.
-ignore-patterns=
-
-# Python code to execute, usually for sys.path manipulation such as
-# pygtk.require().
-#init-hook=
-
-# Use multiple processes to speed up Pylint.
-jobs=4
-
-# List of plugins (as comma separated values of python modules names) to load,
-# usually to register additional checkers.
-load-plugins=
-
-# Pickle collected data for later comparisons.
-persistent=yes
-
-# Specify a configuration file.
-#rcfile=
-
-# When enabled, pylint would attempt to guess common misconfiguration and emit
-# user-friendly hints instead of false-positive error messages
-suggestion-mode=yes
-
-# Allow loading of arbitrary C extensions. Extensions are imported into the
-# active Python interpreter and may run arbitrary code.
-unsafe-load-any-extension=no
-
-
-[MESSAGES CONTROL]
-
-# Only show warnings with the listed confidence levels. Leave empty to show
-# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
-confidence=
-
-# Disable the message, report, category or checker with the given id(s). You
-# can either give multiple identifiers separated by comma (,) or put this
-# option multiple times (only on the command line, not in the configuration
-# file where it should appear only once).You can also use "--disable=all" to
-# disable everything first and then reenable specific checks. For example, if
-# you want to run only the similarities checker, you can use "--disable=all
-# --enable=similarities". If you want to run only the classes checker, but have
-# no Warning level messages displayed, use"--disable=all --enable=classes
-# --disable=W"
-disable=print-statement,
- parameter-unpacking,
- unpacking-in-except,
- old-raise-syntax,
- backtick,
- long-suffix,
- old-ne-operator,
- old-octal-literal,
- import-star-module-level,
- non-ascii-bytes-literal,
- raw-checker-failed,
- bad-inline-option,
- locally-disabled,
- locally-enabled,
- file-ignored,
- suppressed-message,
- useless-suppression,
- deprecated-pragma,
- apply-builtin,
- basestring-builtin,
- buffer-builtin,
- cmp-builtin,
- coerce-builtin,
- execfile-builtin,
- file-builtin,
- long-builtin,
- raw_input-builtin,
- reduce-builtin,
- standarderror-builtin,
- unicode-builtin,
- xrange-builtin,
- coerce-method,
- delslice-method,
- getslice-method,
- setslice-method,
- no-absolute-import,
- old-division,
- dict-iter-method,
- dict-view-method,
- next-method-called,
- metaclass-assignment,
- indexing-exception,
- raising-string,
- reload-builtin,
- oct-method,
- hex-method,
- nonzero-method,
- cmp-method,
- input-builtin,
- round-builtin,
- intern-builtin,
- unichr-builtin,
- map-builtin-not-iterating,
- zip-builtin-not-iterating,
- range-builtin-not-iterating,
- filter-builtin-not-iterating,
- using-cmp-argument,
- eq-without-hash,
- div-method,
- idiv-method,
- rdiv-method,
- exception-message-attribute,
- invalid-str-codec,
- sys-max-int,
- bad-python3-import,
- deprecated-string-function,
- deprecated-str-translate-call,
- deprecated-itertools-function,
- deprecated-types-field,
- next-method-defined,
- dict-items-not-iterating,
- dict-keys-not-iterating,
- dict-values-not-iterating,
- bad-indentation,
- line-too-long,
- missing-docstring,
- multiple-statements,
- bad-continuation,
- invalid-name,
- too-many-arguments,
- too-many-locals,
- superfluous-parens,
- bad-whitespace,
- too-many-instance-attributes,
- wrong-import-position,
- ungrouped-imports,
- wrong-import-order,
- protected-access,
- trailing-whitespace,
- too-many-branches,
- too-few-public-methods,
- too-many-statements,
- trailing-newlines,
- attribute-defined-outside-init,
- too-many-return-statements,
- too-many-public-methods,
- unused-argument,
- old-style-class,
- no-init,
- len-as-condition,
- unneeded-not,
- no-self-use,
- multiple-imports,
- no-else-return,
- logging-not-lazy,
- fixme,
- redefined-outer-name,
- unused-variable,
- unsubscriptable-object,
- expression-not-assigned,
- too-many-boolean-expressions,
- consider-using-ternary,
- invalid-unary-operand-type,
- relative-import,
- deprecated-lambda
-
-
-# Enable the message, report, category or checker with the given id(s). You can
-# either give multiple identifier separated by comma (,) or put this option
-# multiple time (only on the command line, not in the configuration file where
-# it should appear only once). See also the "--disable" option for examples.
-enable=c-extension-no-member
-
-
-[REPORTS]
-
-# Python expression which should return a note less than 10 (10 is the highest
-# note). You have access to the variables errors warning, statement which
-# respectively contain the number of errors / warnings messages and the total
-# number of statements analyzed. This is used by the global evaluation report
-# (RP0004).
-evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
-
-# Template used to display messages. This is a python new-style format string
-# used to format the message information. See doc for all details
-#msg-template=
-
-# Set the output format. Available formats are text, parseable, colorized, json
-# and msvs (visual studio).You can also give a reporter class, eg
-# mypackage.mymodule.MyReporterClass.
-output-format=text
-
-# Tells whether to display a full report or only the messages
-reports=no
-
-# Activate the evaluation score.
-score=yes
-
-
-[REFACTORING]
-
-# Maximum number of nested blocks for function / method body
-max-nested-blocks=5
-
-# Complete name of functions that never returns. When checking for
-# inconsistent-return-statements if a never returning function is called then
-# it will be considered as an explicit return statement and no message will be
-# printed.
-never-returning-functions=optparse.Values,sys.exit
-
-
-[LOGGING]
-
-# Logging modules to check that the string format arguments are in logging
-# function parameter format
-logging-modules=logging
-
-
-[SPELLING]
-
-# Limits count of emitted suggestions for spelling mistakes
-max-spelling-suggestions=4
-
-# Spelling dictionary name. Available dictionaries: none. To make it working
-# install python-enchant package.
-spelling-dict=
-
-# List of comma separated words that should not be checked.
-spelling-ignore-words=
-
-# A path to a file that contains private dictionary; one word per line.
-spelling-private-dict-file=
-
-# Tells whether to store unknown words to indicated private dictionary in
-# --spelling-private-dict-file option instead of raising a message.
-spelling-store-unknown-words=no
-
-
-[MISCELLANEOUS]
-
-# List of note tags to take in consideration, separated by a comma.
-notes=FIXME,
- XXX,
- TODO
-
-
-[SIMILARITIES]
-
-# Ignore comments when computing similarities.
-ignore-comments=yes
-
-# Ignore docstrings when computing similarities.
-ignore-docstrings=yes
-
-# Ignore imports when computing similarities.
-ignore-imports=no
-
-# Minimum lines number of a similarity.
-min-similarity-lines=4
-
-
-[TYPECHECK]
-
-# List of decorators that produce context managers, such as
-# contextlib.contextmanager. Add to this list to register other decorators that
-# produce valid context managers.
-contextmanager-decorators=contextlib.contextmanager
-
-# List of members which are set dynamically and missed by pylint inference
-# system, and so shouldn't trigger E1101 when accessed. Python regular
-# expressions are accepted.
-generated-members=capnp.* cereal.* pygame.* zmq.* setproctitle.* smbus2.* usb1.* serial.* cv2.*
-
-# Tells whether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-# This flag controls whether pylint should warn about no-member and similar
-# checks whenever an opaque object is returned when inferring. The inference
-# can return multiple potential results while evaluating a Python object, but
-# some branches might not be evaluated, which results in partial inference. In
-# that case, it might be useful to still emit no-member and other checks for
-# the rest of the inferred objects.
-ignore-on-opaque-inference=yes
-
-# List of class names for which member attributes should not be checked (useful
-# for classes with dynamically set attributes). This supports the use of
-# qualified names.
-ignored-classes=optparse.Values,thread._local,_thread._local
-
-# List of module names for which member attributes should not be checked
-# (useful for modules/projects where namespaces are manipulated during runtime
-# and thus existing member attributes cannot be deduced by static analysis. It
-# supports qualified module names, as well as Unix pattern matching.
-ignored-modules=flask setproctitle usb1 flask.ext.socketio smbus2 usb1.*
-
-# Show a hint with possible names when a member name was not found. The aspect
-# of finding the hint is based on edit distance.
-missing-member-hint=yes
-
-# The minimum edit distance a name should have in order to be considered a
-# similar match for a missing member name.
-missing-member-hint-distance=1
-
-# The total number of similar names that should be taken in consideration when
-# showing a hint for a missing member.
-missing-member-max-choices=1
-
-
-[VARIABLES]
-
-# List of additional names supposed to be defined in builtins. Remember that
-# you should avoid to define new builtins when possible.
-additional-builtins=
-
-# Tells whether unused global variables should be treated as a violation.
-allow-global-unused-variables=yes
-
-# List of strings which can identify a callback function by name. A callback
-# name must start or end with one of those strings.
-callbacks=cb_,
- _cb
-
-# A regular expression matching the name of dummy variables (i.e. expectedly
-# not used).
-dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
-
-# Argument names that match this expression will be ignored. Default to name
-# with leading underscore
-ignored-argument-names=_.*|^ignored_|^unused_
-
-# Tells whether we should check for unused import in __init__ files.
-init-import=no
-
-# List of qualified module names which can have objects that can redefine
-# builtins.
-redefining-builtins-modules=six.moves,past.builtins,future.builtins
-
-
-[FORMAT]
-
-# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
-expected-line-ending-format=
-
-# Regexp for a line that is allowed to be longer than the limit.
-ignore-long-lines=^\s*(# )??$
-
-# Number of spaces of indent required inside a hanging or continued line.
-indent-after-paren=4
-
-# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
-# tab).
-indent-string=' '
-
-# Maximum number of characters on a single line.
-max-line-length=100
-
-# Maximum number of lines in a module
-max-module-lines=1000
-
-# List of optional constructs for which whitespace checking is disabled. `dict-
-# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
-# `trailing-comma` allows a space between comma and closing bracket: (a, ).
-# `empty-line` allows space-only lines.
-no-space-check=trailing-comma,
- dict-separator
-
-# Allow the body of a class to be on the same line as the declaration if body
-# contains single statement.
-single-line-class-stmt=no
-
-# Allow the body of an if to be on the same line as the test if there is no
-# else.
-single-line-if-stmt=no
-
-
-[BASIC]
-
-# Naming style matching correct argument names
-argument-naming-style=snake_case
-
-# Regular expression matching correct argument names. Overrides argument-
-# naming-style
-#argument-rgx=
-
-# Naming style matching correct attribute names
-attr-naming-style=snake_case
-
-# Regular expression matching correct attribute names. Overrides attr-naming-
-# style
-#attr-rgx=
-
-# Bad variable names which should always be refused, separated by a comma
-bad-names=foo,
- bar,
- baz,
- toto,
- tutu,
- tata
-
-# Naming style matching correct class attribute names
-class-attribute-naming-style=any
-
-# Regular expression matching correct class attribute names. Overrides class-
-# attribute-naming-style
-#class-attribute-rgx=
-
-# Naming style matching correct class names
-class-naming-style=PascalCase
-
-# Regular expression matching correct class names. Overrides class-naming-style
-#class-rgx=
-
-# Naming style matching correct constant names
-const-naming-style=UPPER_CASE
-
-# Regular expression matching correct constant names. Overrides const-naming-
-# style
-#const-rgx=
-
-# Minimum line length for functions/classes that require docstrings, shorter
-# ones are exempt.
-docstring-min-length=-1
-
-# Naming style matching correct function names
-function-naming-style=snake_case
-
-# Regular expression matching correct function names. Overrides function-
-# naming-style
-#function-rgx=
-
-# Good variable names which should always be accepted, separated by a comma
-good-names=i,
- j,
- k,
- ex,
- Run,
- _
-
-# Include a hint for the correct naming format with invalid-name
-include-naming-hint=no
-
-# Naming style matching correct inline iteration names
-inlinevar-naming-style=any
-
-# Regular expression matching correct inline iteration names. Overrides
-# inlinevar-naming-style
-#inlinevar-rgx=
-
-# Naming style matching correct method names
-method-naming-style=snake_case
-
-# Regular expression matching correct method names. Overrides method-naming-
-# style
-#method-rgx=
-
-# Naming style matching correct module names
-module-naming-style=snake_case
-
-# Regular expression matching correct module names. Overrides module-naming-
-# style
-#module-rgx=
-
-# Colon-delimited sets of names that determine each other's naming style when
-# the name regexes allow several styles.
-name-group=
-
-# Regular expression which should only match function or class names that do
-# not require a docstring.
-no-docstring-rgx=^_
-
-# List of decorators that produce properties, such as abc.abstractproperty. Add
-# to this list to register other decorators that produce valid properties.
-property-classes=abc.abstractproperty
-
-# Naming style matching correct variable names
-variable-naming-style=snake_case
-
-# Regular expression matching correct variable names. Overrides variable-
-# naming-style
-#variable-rgx=
-
-
-[DESIGN]
-
-# Maximum number of arguments for function / method
-max-args=5
-
-# Maximum number of attributes for a class (see R0902).
-max-attributes=7
-
-# Maximum number of boolean expressions in a if statement
-max-bool-expr=5
-
-# Maximum number of branch for function / method body
-max-branches=12
-
-# Maximum number of locals for function / method body
-max-locals=15
-
-# Maximum number of parents for a class (see R0901).
-max-parents=7
-
-# Maximum number of public methods for a class (see R0904).
-max-public-methods=20
-
-# Maximum number of return / yield for function / method body
-max-returns=6
-
-# Maximum number of statements in function / method body
-max-statements=50
-
-# Minimum number of public methods for a class (see R0903).
-min-public-methods=2
-
-
-[CLASSES]
-
-# List of method names used to declare (i.e. assign) instance attributes.
-defining-attr-methods=__init__,
- __new__,
- setUp
-
-# List of member names, which should be excluded from the protected access
-# warning.
-exclude-protected=_asdict,
- _fields,
- _replace,
- _source,
- _make
-
-# List of valid names for the first argument in a class method.
-valid-classmethod-first-arg=cls
-
-# List of valid names for the first argument in a metaclass class method.
-valid-metaclass-classmethod-first-arg=mcs
-
-
-[IMPORTS]
-
-# Allow wildcard imports from modules that define __all__.
-allow-wildcard-with-all=no
-
-# Analyse import fallback blocks. This can be used to support both Python 2 and
-# 3 compatible code, which means that the block might have code that exists
-# only in one or another interpreter, leading to false positives when analysed.
-analyse-fallback-blocks=no
-
-# Deprecated modules which should not be used, separated by a comma
-deprecated-modules=regsub,
- TERMIOS,
- Bastion,
- rexec
-
-# Create a graph of external dependencies in the given file (report RP0402 must
-# not be disabled)
-ext-import-graph=
-
-# Create a graph of every (i.e. internal and external) dependencies in the
-# given file (report RP0402 must not be disabled)
-import-graph=
-
-# Create a graph of internal dependencies in the given file (report RP0402 must
-# not be disabled)
-int-import-graph=
-
-# Force import order to recognize a module as part of the standard
-# compatibility libraries.
-known-standard-library=
-
-# Force import order to recognize a module as part of a third party library.
-known-third-party=enchant
-
-
-[EXCEPTIONS]
-
-# Exceptions that will emit a warning when being caught. Defaults to
-# "Exception"
-overgeneral-exceptions=Exception
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 8683d8bee015be..00000000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-sudo: required
-
-services:
- - docker
-
-script:
- - ./run_docker_tests.sh
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 738679aca5d5e6..00000000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# How to contribute
-
-Our software is open source so you can solve your own problems without needing help from others. And if you solve a problem and are so kind, you can upstream it for the rest of the world to use.
-
-Most open source development activity is coordinated through our [Discord](https://discord.comma.ai). A lot of documentation is available on our [medium](https://medium.com/@comma_ai/)
-
-## Getting Started
-
- * Join our [Discord](https://discord.comma.ai)
- * Make sure you have a [GitHub account](https://github.com/signup/free)
- * Fork [our repositories](https://github.com/commaai) on GitHub
-
-## Testing
-
-### Local Testing
-
-You can test your changes on your machine by running `run_docker_tests.sh`. This will run some automated tests in docker against your code.
-
-### Automated Testing
-
-All PRs are automatically checked by travis. Check out `.travis.yml` for what travis runs. Any new tests sould be added to travis.
-
-### Code Style and Linting
-
-Code is automatically check for style by travis as part of the automated tests. You can also run these yourself by running `check_code_quality.sh`.
-
-## Car Ports (openpilot)
-
-We've released a [Model Port guide](https://medium.com/@comma_ai/openpilot-port-guide-for-toyota-models-e5467f4b5fe6) for porting to Toyota/Lexus models.
-
-If you port openpilot to a substantially new car brand, see this more generic [Brand Port guide](https://medium.com/@comma_ai/how-to-write-a-car-port-for-openpilot-7ce0785eda84). You might also be eligible for a bounty. See our bounties at [comma.ai/bounties.html](https://comma.ai/bounties.html)
diff --git a/Dockerfile.openpilot b/Dockerfile.openpilot
deleted file mode 100644
index edf6d478607cd7..00000000000000
--- a/Dockerfile.openpilot
+++ /dev/null
@@ -1,57 +0,0 @@
-FROM ubuntu:16.04
-ENV PYTHONUNBUFFERED 1
-
-RUN apt-get update && apt-get install -y \
- autoconf \
- build-essential \
- bzip2 \
- clang \
- git \
- libarchive-dev \
- libavcodec-dev \
- libavdevice-dev \
- libavfilter-dev \
- libavresample-dev \
- libavutil-dev \
- libffi-dev \
- libglib2.0-0 \
- libssl-dev \
- libswscale-dev \
- libtool \
- libusb-1.0-0 \
- libzmq5-dev \
- ocl-icd-libopencl1 \
- ocl-icd-opencl-dev \
- opencl-headers \
- pkg-config \
- python-pip \
- wget
-
-COPY phonelibs/install_capnp.sh /tmp/install_capnp.sh
-RUN /tmp/install_capnp.sh
-
-RUN pip install --upgrade pip==18.0
-RUN pip install pipenv==2018.11.26
-
-COPY Pipfile /tmp/
-COPY Pipfile.lock /tmp/
-RUN cd /tmp && pipenv install --deploy --system
-
-ENV PYTHONPATH /tmp/openpilot:$PYTHONPATH
-
-RUN git clone --branch v0.6 https://github.com/commaai/openpilot-tools.git /tmp/openpilot/tools
-RUN pip install -r /tmp/openpilot/tools/requirements.txt
-RUN pip install fastcluster==1.1.20 scipy==0.19.1
-
-COPY ./.pylintrc /tmp/openpilot/.pylintrc
-COPY ./common /tmp/openpilot/common
-COPY ./cereal /tmp/openpilot/cereal
-COPY ./opendbc /tmp/openpilot/opendbc
-COPY ./selfdrive /tmp/openpilot/selfdrive
-COPY ./phonelibs /tmp/openpilot/phonelibs
-COPY ./pyextra /tmp/openpilot/pyextra
-COPY ./panda /tmp/openpilot/panda
-
-RUN mkdir -p /tmp/openpilot/selfdrive/test/out
-RUN make -C /tmp/openpilot/selfdrive/controls/lib/longitudinal_mpc clean
-RUN make -C /tmp/openpilot/selfdrive/controls/lib/lateral_mpc clean
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 00000000000000..d12c8e4946b56b
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,243 @@
+def phone(String ip, String step_label, String cmd) {
+ withCredentials([file(credentialsId: 'id_rsa', variable: 'key_file')]) {
+ def ssh_cmd = """
+ssh -tt -o StrictHostKeyChecking=no -i ${key_file} 'comma@${ip}' /usr/bin/bash <<'END'
+
+set -e
+
+export CI=1
+export TEST_DIR=${env.TEST_DIR}
+export SOURCE_DIR=${env.SOURCE_DIR}
+export GIT_BRANCH=${env.GIT_BRANCH}
+export GIT_COMMIT=${env.GIT_COMMIT}
+
+source ~/.bash_profile
+if [ -f /TICI ]; then
+ source /etc/profile
+fi
+
+ln -snf ${env.TEST_DIR} /data/pythonpath
+
+if [ -f /EON ]; then
+ echo \$\$ > /dev/cpuset/app/tasks || true
+ echo \$PPID > /dev/cpuset/app/tasks || true
+ mkdir -p /dev/shm
+ chmod 777 /dev/shm
+fi
+
+cd ${env.TEST_DIR} || true
+${cmd}
+exit 0
+
+END"""
+
+ sh script: ssh_cmd, label: step_label
+ }
+}
+
+def phone_steps(String device_type, steps) {
+ lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
+ timeout(time: 60, unit: 'MINUTES') {
+ phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),)
+ steps.each { item ->
+ phone(device_ip, item[0], item[1])
+ }
+ }
+ }
+}
+
+pipeline {
+ agent none
+ environment {
+ TEST_DIR = "/data/openpilot"
+ SOURCE_DIR = "/data/openpilot_source/"
+ }
+ options {
+ timeout(time: 4, unit: 'HOURS')
+ }
+
+ stages {
+ stage('build releases') {
+ when {
+ branch 'devel-staging'
+ }
+
+ parallel {
+ stage('release2') {
+ agent { docker { image 'ghcr.io/commaai/alpine-ssh'; args '--user=root' } }
+ steps {
+ phone_steps("eon-build", [
+ ["build release2-staging & dashcam-staging", "PUSH=1 $SOURCE_DIR/release/build_release.sh"],
+ ])
+ }
+ }
+
+ stage('release3') {
+ agent { docker { image 'ghcr.io/commaai/alpine-ssh'; args '--user=root' } }
+ steps {
+ phone_steps("tici", [
+ ["build release3-staging & dashcam3-staging", "PUSH=1 $SOURCE_DIR/release/build_release.sh"],
+ ])
+ }
+ }
+ }
+ }
+
+ stage('openpilot tests') {
+ when {
+ not {
+ anyOf {
+ branch 'master-ci'; branch 'devel'; branch 'devel-staging';
+ branch 'release2'; branch 'release2-staging'; branch 'dashcam'; branch 'dashcam-staging';
+ branch 'release3'; branch 'release3-staging'; branch 'dashcam3'; branch 'dashcam3-staging';
+ branch 'testing-closet*'; branch 'hotfix-*'
+ }
+ }
+ }
+
+ stages {
+ stage('On-device Tests') {
+ agent { docker { image 'ghcr.io/commaai/alpine-ssh'; args '--user=root' } }
+ stages {
+ stage('parallel tests') {
+ parallel {
+ stage('C2: build') {
+ steps {
+ phone_steps("eon-build", [
+ ["build master-ci", "cd $SOURCE_DIR/release && EXTRA_FILES='tools/' ./build_devel.sh"],
+ ["build openpilot", "cd selfdrive/manager && ./build.py"],
+ ["test manager", "python selfdrive/manager/test/test_manager.py"],
+ ["onroad tests", "cd selfdrive/test/ && ./test_onroad.py"],
+ ["test car interfaces", "cd selfdrive/car/tests/ && ./test_car_interfaces.py"],
+ ])
+ }
+ }
+
+ stage('C2: replay') {
+ steps {
+ phone_steps("eon2", [
+ ["build", "cd selfdrive/manager && ./build.py"],
+ ["model replay", "cd selfdrive/test/process_replay && ./model_replay.py"],
+ ])
+ }
+ }
+
+ stage('C2: HW + Unit Tests') {
+ steps {
+ phone_steps("eon", [
+ ["build", "cd selfdrive/manager && ./build.py"],
+ ["test sounds", "python selfdrive/ui/tests/test_soundd.py"],
+ ["test boardd loopback", "python selfdrive/boardd/tests/test_boardd_loopback.py"],
+ ["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
+ ["test encoder", "python selfdrive/loggerd/tests/test_encoder.py"],
+ ["test logcatd", "python selfdrive/logcatd/tests/test_logcatd_android.py"],
+ ["test updater", "python selfdrive/hardware/eon/test_neos_updater.py"],
+ ])
+ }
+ }
+
+ /*
+ stage('Power Consumption Tests') {
+ steps {
+ lock(resource: "", label: "c2-zookeeper", inversePrecedence: true, variable: 'device_ip', quantity: 1) {
+ timeout(time: 90, unit: 'MINUTES') {
+ sh script: "/home/batman/tools/zookeeper/enable_and_wait.py $device_ip 120", label: "turn on device"
+ phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),)
+ phone(device_ip, "build", "scons -j4 && sync")
+ sh script: "/home/batman/tools/zookeeper/disable.py $device_ip", label: "turn off device"
+ sh script: "/home/batman/tools/zookeeper/enable_and_wait.py $device_ip 120", label: "turn on device"
+ sh script: "/home/batman/tools/zookeeper/check_consumption.py 60 3", label: "idle power consumption after boot"
+ sh script: "/home/batman/tools/zookeeper/ignition.py 1", label: "go onroad"
+ sh script: "/home/batman/tools/zookeeper/check_consumption.py 60 10", label: "onroad power consumption"
+ sh script: "/home/batman/tools/zookeeper/ignition.py 0", label: "go offroad"
+ sh script: "/home/batman/tools/zookeeper/check_consumption.py 60 2", label: "idle power consumption offroad"
+ }
+ }
+ }
+ }
+ */
+
+ stage('C3: build') {
+ environment {
+ R3_PUSH = "${env.BRANCH_NAME == 'master' ? '1' : ' '}"
+ }
+ steps {
+ phone_steps("tici", [
+ ["build master-ci", "cd $SOURCE_DIR/release && EXTRA_FILES='tools/' ./build_devel.sh"],
+ ["build openpilot", "cd selfdrive/manager && ./build.py"],
+ ["test manager", "python selfdrive/manager/test/test_manager.py"],
+ ["onroad tests", "cd selfdrive/test/ && ./test_onroad.py"],
+ ["test car interfaces", "cd selfdrive/car/tests/ && ./test_car_interfaces.py"],
+ ])
+ }
+ }
+
+ stage('C3: HW + Unit Tests') {
+ steps {
+ phone_steps("tici2", [
+ ["build", "cd selfdrive/manager && ./build.py"],
+ ["test boardd loopback", "python selfdrive/boardd/tests/test_boardd_loopback.py"],
+ ["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
+ ["test encoder", "LD_LIBRARY_PATH=/usr/local/lib python selfdrive/loggerd/tests/test_encoder.py"],
+ ])
+ }
+ }
+
+ stage('C2: camerad') {
+ steps {
+ phone_steps("eon-party", [
+ ["build", "cd selfdrive/manager && ./build.py"],
+ ["test camerad", "python selfdrive/camerad/test/test_camerad.py"],
+ ["test exposure", "python selfdrive/camerad/test/test_exposure.py"],
+ ])
+ }
+ }
+
+ stage('C3: camerad') {
+ steps {
+ phone_steps("tici-party", [
+ ["build", "cd selfdrive/manager && ./build.py"],
+ ["test camerad", "python selfdrive/camerad/test/test_camerad.py"],
+ ["test exposure", "python selfdrive/camerad/test/test_exposure.py"],
+ ])
+ }
+ }
+
+ stage('C3: replay') {
+ steps {
+ phone_steps("tici-party", [
+ ["build", "cd selfdrive/manager && ./build.py"],
+ ["model replay", "cd selfdrive/test/process_replay && ./model_replay.py"],
+ ])
+ }
+ }
+
+ }
+ }
+
+ stage('Push master-ci') {
+ when {
+ branch 'master'
+ }
+ steps {
+ phone_steps("eon-build", [
+ ["push devel", "cd $SOURCE_DIR/release && PUSH='master-ci' ./build_devel.sh"],
+ ])
+ }
+ }
+
+ }
+
+ post {
+ always {
+ cleanWs()
+ }
+ }
+
+ }
+
+ }
+ }
+ }
+}
+
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 4f690b2e7e88c1..00000000000000
--- a/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-
-code_dir := $(shell pwd)
-
-# TODO: Add a global build system
-
-.PHONY: all
-all:
- cd selfdrive && PYTHONPATH=$(code_dir) PREPAREONLY=1 ./manager.py
-
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index 614968710c9606..00000000000000
--- a/Pipfile
+++ /dev/null
@@ -1,140 +0,0 @@
-[[source]]
-name = "pypi"
-url = "https://pypi.org/simple"
-verify_ssl = true
-
-[dev-packages]
-ipython = "<6.0"
-aenum = "*"
-azure-batch = "==4.1.3"
-azure-common = "==1.1.16"
-azure-nspkg = "==3.0.1"
-azure-storage-blob = "==1.3.1"
-azure-storage-common = "==1.3.0"
-azure-storage-nspkg = "==3.0.0"
-bincopy = "*"
-bleach = "==1.5.0"
-boto = "*"
-"boto3" = "*"
-celery = "*"
-control = "*"
-datadog = "*"
-decorator = "*"
-dlib = "*"
-dominate = "*"
-elasticsearch = "*"
-entium = "==0.1.4"
-fasteners = "*"
-future = "*"
-futures = "*"
-gevent = "*"
-pycocotools = {git = "https://github.com/cocodataset/cocoapi.git",subdirectory = "PythonAPI"}
-gunicorn = "*"
-"h5py" = "*"
-hexdump = "*"
-"html5lib" = "==0.9999999"
-imageio = "*"
-intervaltree = "*"
-ipykernel = "<5.0"
-joblib = "*"
-json-logging-py = "*"
-jupyter = "*"
-libarchive = "*"
-lru-dict = "*"
-lxml = "*"
-matplotlib = "==2.2.3"
-"mpld3" = "*"
-msgpack-python = "*"
-nbstripout = "*"
-nose-parameterized = "*"
-numpy = "==1.14.5"
-osmium = "==2.15.0"
-pbr = "==5.1.3"
-percache = "*"
-pprofile = "*"
-psutil = "*"
-pycurl = "*"
-git-pylint-commit-hook = "==2.5.1"
-pymongo = "*"
-"pynmea2" = "*"
-pypolyline = "==0.1.17"
-pysendfile = "*"
-python-logstash = "*"
-pyvcd = "*"
-redis = "*"
-redlock = "*"
-"s2sphere" = "*"
-scikit-image = "*"
-"subprocess32" = "*"
-supervisor = "*"
-tenacity = "*"
-tensorflow-gpu = "==1.13.0rc0"
-"transforms3d" = "*"
-utm = "*"
-"v4l2" = "*"
-visdom = "*"
-PyJWT = "==1.4.1"
-PyMySQL = "==0.9.2"
-Theano = "*"
-Werkzeug = "*"
-"backports.lzma" = "*"
-Flask-Cors = "*"
-Flask-SocketIO = "*"
-"GeoAlchemy2" = "*"
-Keras = ">=2.1.6"
-keras-maskrcnn = "*"
-keras-retinanet = "*"
-Pygments = "*"
-PyNaCl = "*"
-"PySDL2" = "*"
-reverse_geocoder = "*"
-Shapely = "*"
-SQLAlchemy = "==1.2.7"
-uWSGI = "*"
-scipy = "*"
-fastcluster = "==1.1.25"
-backports-abc = "*"
-pygame = "*"
-simplejson = "*"
-
-[packages]
-overpy = {git = "https://github.com/commaai/python-overpy.git",ref = "f86529af402d4642e1faeb146671c40284007323"}
-atomicwrites = "*"
-cffi = "*"
-crcmod = "*"
-hexdump = "*"
-libusb1 = "*"
-numpy = "*"
-psutil = "*"
-pycapnp = "*"
-cryptography = "*"
-pyserial = "*"
-python-dateutil = "*"
-pyzmq = "*"
-raven = "*"
-requests = "*"
-setproctitle = "*"
-six = "*"
-smbus2 = "*"
-sympy = "*"
-tqdm = "*"
-Cython = "*"
-PyYAML = "*"
-websocket_client = "*"
-Logentries = {git = "https://github.com/commaai/le_python.git",ref = "5eef8f5be5929d33973e1b10e686fa0cdcd6792f"}
-urllib3 = "*"
-chardet = "*"
-idna = "*"
-gunicorn = "*"
-utm = "*"
-json-rpc = "*"
-Flask = "*"
-PyJWT = "*"
-"Jinja2" = "*"
-nose = "*"
-pyflakes = "*"
-pylint = "*"
-pycryptodome = "*"
-
-[requires]
-python_version = "2.7"
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index e4623df10afb4c..00000000000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,2810 +0,0 @@
-{
- "_meta": {
- "hash": {
- "sha256": "72c6a6eac19abf85ca5f272d04761f8336150d5bec599423c4b16891c99cb0bf"
- },
- "pipfile-spec": 6,
- "requires": {
- "python_version": "2.7"
- },
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "asn1crypto": {
- "hashes": [
- "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
- "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
- ],
- "version": "==0.24.0"
- },
- "astroid": {
- "hashes": [
- "sha256:87de48a92e29cedf7210ffa853d11441e7ad94cb47bacd91b023499b51cbc756",
- "sha256:d25869fc7f44f1d9fb7d24fd7ea0639656f5355fc3089cd1f3d18c6ec6b124c7"
- ],
- "version": "==1.6.6"
- },
- "atomicwrites": {
- "hashes": [
- "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4",
- "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"
- ],
- "index": "pypi",
- "version": "==1.3.0"
- },
- "backports.functools-lru-cache": {
- "hashes": [
- "sha256:9d98697f088eb1b0fa451391f91afb5e3ebde16bbdb272819fd091151fda4f1a",
- "sha256:f0b0e4eba956de51238e17573b7087e852dfe9854afd2e9c873f73fc0ca0a6dd"
- ],
- "markers": "python_version < '3.2'",
- "version": "==1.5"
- },
- "certifi": {
- "hashes": [
- "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5",
- "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"
- ],
- "version": "==2019.3.9"
- },
- "cffi": {
- "hashes": [
- "sha256:041c81822e9f84b1d9c401182e174996f0bae9991f33725d059b771744290774",
- "sha256:046ef9a22f5d3eed06334d01b1e836977eeef500d9b78e9ef693f9380ad0b83d",
- "sha256:066bc4c7895c91812eff46f4b1c285220947d4aa46fa0a2651ff85f2afae9c90",
- "sha256:066c7ff148ae33040c01058662d6752fd73fbc8e64787229ea8498c7d7f4041b",
- "sha256:2444d0c61f03dcd26dbf7600cf64354376ee579acad77aef459e34efcb438c63",
- "sha256:300832850b8f7967e278870c5d51e3819b9aad8f0a2c8dbe39ab11f119237f45",
- "sha256:34c77afe85b6b9e967bd8154e3855e847b70ca42043db6ad17f26899a3df1b25",
- "sha256:46de5fa00f7ac09f020729148ff632819649b3e05a007d286242c4882f7b1dc3",
- "sha256:4aa8ee7ba27c472d429b980c51e714a24f47ca296d53f4d7868075b175866f4b",
- "sha256:4d0004eb4351e35ed950c14c11e734182591465a33e960a4ab5e8d4f04d72647",
- "sha256:4e3d3f31a1e202b0f5a35ba3bc4eb41e2fc2b11c1eff38b362de710bcffb5016",
- "sha256:50bec6d35e6b1aaeb17f7c4e2b9374ebf95a8975d57863546fa83e8d31bdb8c4",
- "sha256:55cad9a6df1e2a1d62063f79d0881a414a906a6962bc160ac968cc03ed3efcfb",
- "sha256:5662ad4e4e84f1eaa8efce5da695c5d2e229c563f9d5ce5b0113f71321bcf753",
- "sha256:59b4dc008f98fc6ee2bb4fd7fc786a8d70000d058c2bbe2698275bc53a8d3fa7",
- "sha256:73e1ffefe05e4ccd7bcea61af76f36077b914f92b76f95ccf00b0c1b9186f3f9",
- "sha256:a1f0fd46eba2d71ce1589f7e50a9e2ffaeb739fb2c11e8192aa2b45d5f6cc41f",
- "sha256:a2e85dc204556657661051ff4bab75a84e968669765c8a2cd425918699c3d0e8",
- "sha256:a5457d47dfff24882a21492e5815f891c0ca35fefae8aa742c6c263dac16ef1f",
- "sha256:a8dccd61d52a8dae4a825cdbb7735da530179fea472903eb871a5513b5abbfdc",
- "sha256:ae61af521ed676cf16ae94f30fe202781a38d7178b6b4ab622e4eec8cefaff42",
- "sha256:b012a5edb48288f77a63dba0840c92d0504aa215612da4541b7b42d849bc83a3",
- "sha256:d2c5cfa536227f57f97c92ac30c8109688ace8fa4ac086d19d0af47d134e2909",
- "sha256:d42b5796e20aacc9d15e66befb7a345454eef794fdb0737d1af593447c6c8f45",
- "sha256:dee54f5d30d775f525894d67b1495625dd9322945e7fee00731952e0368ff42d",
- "sha256:e070535507bd6aa07124258171be2ee8dfc19119c28ca94c9dfb7efd23564512",
- "sha256:e1ff2748c84d97b065cc95429814cdba39bcbd77c9c85c89344b317dc0d9cbff",
- "sha256:ed851c75d1e0e043cbf5ca9a8e1b13c4c90f3fbd863dacb01c0808e2b5204201"
- ],
- "index": "pypi",
- "version": "==1.12.3"
- },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
- ],
- "index": "pypi",
- "version": "==3.0.4"
- },
- "click": {
- "hashes": [
- "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
- "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
- ],
- "version": "==7.0"
- },
- "configparser": {
- "hashes": [
- "sha256:8be81d89d6e7b4c0d4e44bcc525845f6da25821de80cb5e06e7e0238a2899e32",
- "sha256:da60d0014fd8c55eb48c1c5354352e363e2d30bbf7057e5e171a468390184c75"
- ],
- "markers": "python_version == '2.7'",
- "version": "==3.7.4"
- },
- "contextlib2": {
- "hashes": [
- "sha256:509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48",
- "sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"
- ],
- "markers": "python_version < '3.2'",
- "version": "==0.5.5"
- },
- "crcmod": {
- "hashes": [
- "sha256:dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"
- ],
- "index": "pypi",
- "version": "==1.7"
- },
- "cryptography": {
- "hashes": [
- "sha256:24b61e5fcb506424d3ec4e18bca995833839bf13c59fc43e530e488f28d46b8c",
- "sha256:25dd1581a183e9e7a806fe0543f485103232f940fcfc301db65e630512cce643",
- "sha256:3452bba7c21c69f2df772762be0066c7ed5dc65df494a1d53a58b683a83e1216",
- "sha256:41a0be220dd1ed9e998f5891948306eb8c812b512dc398e5a01846d855050799",
- "sha256:5751d8a11b956fbfa314f6553d186b94aa70fdb03d8a4d4f1c82dcacf0cbe28a",
- "sha256:5f61c7d749048fa6e3322258b4263463bfccefecb0dd731b6561cb617a1d9bb9",
- "sha256:72e24c521fa2106f19623a3851e9f89ddfdeb9ac63871c7643790f872a305dfc",
- "sha256:7b97ae6ef5cba2e3bb14256625423413d5ce8d1abb91d4f29b6d1a081da765f8",
- "sha256:961e886d8a3590fd2c723cf07be14e2a91cf53c25f02435c04d39e90780e3b53",
- "sha256:96d8473848e984184b6728e2c9d391482008646276c3ff084a1bd89e15ff53a1",
- "sha256:ae536da50c7ad1e002c3eee101871d93abdc90d9c5f651818450a0d3af718609",
- "sha256:b0db0cecf396033abb4a93c95d1602f268b3a68bb0a9cc06a7cff587bb9a7292",
- "sha256:cfee9164954c186b191b91d4193989ca994703b2fff406f71cf454a2d3c7327e",
- "sha256:e6347742ac8f35ded4a46ff835c60e68c22a536a8ae5c4422966d06946b6d4c6",
- "sha256:f27d93f0139a3c056172ebb5d4f9056e770fdf0206c2f422ff2ebbad142e09ed",
- "sha256:f57b76e46a58b63d1c6375017f4564a28f19a5ca912691fd2e4261b3414b618d"
- ],
- "index": "pypi",
- "version": "==2.7"
- },
- "cython": {
- "hashes": [
- "sha256:0afa0b121b89de619e71587e25702e2b7068d7da2164c47e6eee80c17823a62f",
- "sha256:1c608ba76f7a20cc9f0c021b7fe5cb04bc1a70327ae93a9298b1bc3e0edddebe",
- "sha256:26229570d6787ff3caa932fe9d802960f51a89239b990d275ae845405ce43857",
- "sha256:2a9deafa437b6154cac2f25bb88e0bfd075a897c8dc847669d6f478d7e3ee6b1",
- "sha256:2f28396fbce6d9d68a40edbf49a6729cf9d92a4d39ff0f501947a89188e9099f",
- "sha256:3983dd7b67297db299b403b29b328d9e03e14c4c590ea90aa1ad1d7b35fb178b",
- "sha256:4100a3f8e8bbe47d499cdac00e56d5fe750f739701ea52dc049b6c56f5421d97",
- "sha256:51abfaa7b6c66f3f18028876713c8804e73d4c2b6ceddbcbcfa8ec62429377f0",
- "sha256:61c24f4554efdb8fb1ac6c8e75dab301bcdf2b7b739ed0c2b267493bb43163c5",
- "sha256:700ccf921b2fdc9b23910e95b5caae4b35767685e0812343fa7172409f1b5830",
- "sha256:7b41eb2e792822a790cb2a171df49d1a9e0baaa8e81f58077b7380a273b93d5f",
- "sha256:803987d3b16d55faa997bfc12e8b97f1091f145930dee229b020487aed8a1f44",
- "sha256:99af5cfcd208c81998dcf44b3ca466dee7e17453cfb50e98b87947c3a86f8753",
- "sha256:9faea1cca34501c7e139bc7ef8e504d532b77865c58592493e2c154a003b450f",
- "sha256:a7ba4c9a174db841cfee9a0b92563862a0301d7ca543334666c7266b541f141a",
- "sha256:b26071c2313d1880599c69fd831a07b32a8c961ba69d7ccbe5db1cd8d319a4ca",
- "sha256:b49dc8e1116abde13a3e6a9eb8da6ab292c5a3325155fb872e39011b110b37e6",
- "sha256:bd40def0fd013569887008baa6da9ca428e3d7247adeeaeada153006227bb2e7",
- "sha256:bfd0db770e8bd4e044e20298dcae6dfc42561f85d17ee546dcd978c8b23066ae",
- "sha256:c2fad1efae5889925c8fd7867fdd61f59480e4e0b510f9db096c912e884704f1",
- "sha256:c81aea93d526ccf6bc0b842c91216ee9867cd8792f6725a00f19c8b5837e1715",
- "sha256:da786e039b4ad2bce3d53d4799438cf1f5e01a0108f1b8d78ac08e6627281b1a",
- "sha256:deab85a069397540987082d251e9c89e0e5b2e3e044014344ff81f60e211fc4b",
- "sha256:e3f1e6224c3407beb1849bdc5ae3150929e593e4cffff6ca41c6ec2b10942c80",
- "sha256:e74eb224e53aae3943d66e2d29fe42322d5753fd4c0641329bccb7efb3a46552",
- "sha256:ee697c7ea65cb14915a64f36874da8ffc2123df43cf8bc952172e04a26656cd6",
- "sha256:f37792b16d11606c28e428460bd6a3d14b8917b109e77cdbe4ca78b0b9a52c87",
- "sha256:fd2906b54cbf879c09d875ad4e4687c58d87f5ed03496063fec1c9065569fd5d"
- ],
- "index": "pypi",
- "version": "==0.29.10"
- },
- "enum34": {
- "hashes": [
- "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850",
- "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a",
- "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79",
- "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"
- ],
- "markers": "python_version < '3'",
- "version": "==1.1.6"
- },
- "flask": {
- "hashes": [
- "sha256:ad7c6d841e64296b962296c2c2dabc6543752985727af86a975072dea984b6f3",
- "sha256:e7d32475d1de5facaa55e3958bc4ec66d3762076b074296aa50ef8fdc5b9df61"
- ],
- "index": "pypi",
- "version": "==1.0.3"
- },
- "futures": {
- "hashes": [
- "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265",
- "sha256:ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1"
- ],
- "markers": "python_version < '3.2'",
- "version": "==3.2.0"
- },
- "gunicorn": {
- "hashes": [
- "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471",
- "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3"
- ],
- "index": "pypi",
- "version": "==19.9.0"
- },
- "hexdump": {
- "hashes": [
- "sha256:d781a43b0c16ace3f9366aade73e8ad3a7bd5137d58f0b45ab2d3f54876f20db"
- ],
- "index": "pypi",
- "version": "==3.3"
- },
- "idna": {
- "hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
- ],
- "index": "pypi",
- "version": "==2.8"
- },
- "ipaddress": {
- "hashes": [
- "sha256:64b28eec5e78e7510698f6d4da08800a5c575caa4a286c93d651c5d3ff7b6794",
- "sha256:b146c751ea45cad6188dd6cf2d9b757f6f4f8d6ffb96a023e6f2e26eea02a72c"
- ],
- "markers": "python_version < '3'",
- "version": "==1.0.22"
- },
- "isort": {
- "hashes": [
- "sha256:c40744b6bc5162bbb39c1257fe298b7a393861d50978b565f3ccd9cb9de0182a",
- "sha256:f57abacd059dc3bd666258d1efb0377510a89777fda3e3274e3c01f7c03ae22d"
- ],
- "version": "==4.3.20"
- },
- "itsdangerous": {
- "hashes": [
- "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
- "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
- ],
- "version": "==1.1.0"
- },
- "jinja2": {
- "hashes": [
- "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013",
- "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"
- ],
- "index": "pypi",
- "version": "==2.10.1"
- },
- "json-rpc": {
- "hashes": [
- "sha256:bc84451268b48a576d3138744322a8ce673eccadf7424edf4d446b1ddb59e58c",
- "sha256:d6ed3dae670a12e4caa738d309807357d22e2f6e222bb34e8ef019e8b5b1228b"
- ],
- "index": "pypi",
- "version": "==1.12.1"
- },
- "lazy-object-proxy": {
- "hashes": [
- "sha256:159a745e61422217881c4de71f9eafd9d703b93af95618635849fe469a283661",
- "sha256:23f63c0821cc96a23332e45dfaa83266feff8adc72b9bcaef86c202af765244f",
- "sha256:3b11be575475db2e8a6e11215f5aa95b9ec14de658628776e10d96fa0b4dac13",
- "sha256:3f447aff8bc61ca8b42b73304f6a44fa0d915487de144652816f950a3f1ab821",
- "sha256:4ba73f6089cd9b9478bc0a4fa807b47dbdb8fad1d8f31a0f0a5dbf26a4527a71",
- "sha256:4f53eadd9932055eac465bd3ca1bd610e4d7141e1278012bd1f28646aebc1d0e",
- "sha256:64483bd7154580158ea90de5b8e5e6fc29a16a9b4db24f10193f0c1ae3f9d1ea",
- "sha256:6f72d42b0d04bfee2397aa1862262654b56922c20a9bb66bb76b6f0e5e4f9229",
- "sha256:7c7f1ec07b227bdc561299fa2328e85000f90179a2f44ea30579d38e037cb3d4",
- "sha256:7c8b1ba1e15c10b13cad4171cfa77f5bb5ec2580abc5a353907780805ebe158e",
- "sha256:8559b94b823f85342e10d3d9ca4ba5478168e1ac5658a8a2f18c991ba9c52c20",
- "sha256:a262c7dfb046f00e12a2bdd1bafaed2408114a89ac414b0af8755c696eb3fc16",
- "sha256:acce4e3267610c4fdb6632b3886fe3f2f7dd641158a843cf6b6a68e4ce81477b",
- "sha256:be089bb6b83fac7f29d357b2dc4cf2b8eb8d98fe9d9ff89f9ea6012970a853c7",
- "sha256:bfab710d859c779f273cc48fb86af38d6e9210f38287df0069a63e40b45a2f5c",
- "sha256:c10d29019927301d524a22ced72706380de7cfc50f767217485a912b4c8bd82a",
- "sha256:dd6e2b598849b3d7aee2295ac765a578879830fb8966f70be8cd472e6069932e",
- "sha256:e408f1eacc0a68fed0c08da45f31d0ebb38079f043328dce69ff133b95c29dc1"
- ],
- "version": "==1.4.1"
- },
- "libusb1": {
- "hashes": [
- "sha256:adf64a4f3f5c94643a1286f8153bcf4bc787c348b38934aacd7fe17fbeebc571"
- ],
- "index": "pypi",
- "version": "==1.7.1"
- },
- "logentries": {
- "git": "https://github.com/commaai/le_python.git",
- "ref": "5eef8f5be5929d33973e1b10e686fa0cdcd6792f"
- },
- "markupsafe": {
- "hashes": [
- "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
- "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
- "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
- "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
- "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
- "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
- "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
- "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
- "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
- "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
- "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
- "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
- "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
- "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
- "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
- "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
- "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
- "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
- "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
- "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
- "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
- "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
- "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
- "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
- "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
- "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
- "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
- "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
- ],
- "version": "==1.1.1"
- },
- "mccabe": {
- "hashes": [
- "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
- "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
- ],
- "version": "==0.6.1"
- },
- "mpmath": {
- "hashes": [
- "sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6"
- ],
- "version": "==1.1.0"
- },
- "nose": {
- "hashes": [
- "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac",
- "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a",
- "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"
- ],
- "index": "pypi",
- "version": "==1.3.7"
- },
- "numpy": {
- "hashes": [
- "sha256:0778076e764e146d3078b17c24c4d89e0ecd4ac5401beff8e1c87879043a0633",
- "sha256:141c7102f20abe6cf0d54c4ced8d565b86df4d3077ba2343b61a6db996cefec7",
- "sha256:14270a1ee8917d11e7753fb54fc7ffd1934f4d529235beec0b275e2ccf00333b",
- "sha256:27e11c7a8ec9d5838bc59f809bfa86efc8a4fd02e58960fa9c49d998e14332d5",
- "sha256:2a04dda79606f3d2f760384c38ccd3d5b9bb79d4c8126b67aff5eb09a253763e",
- "sha256:3c26010c1b51e1224a3ca6b8df807de6e95128b0908c7e34f190e7775455b0ca",
- "sha256:52c40f1a4262c896420c6ea1c6fda62cf67070e3947e3307f5562bd783a90336",
- "sha256:6e4f8d9e8aa79321657079b9ac03f3cf3fd067bf31c1cca4f56d49543f4356a5",
- "sha256:7242be12a58fec245ee9734e625964b97cf7e3f2f7d016603f9e56660ce479c7",
- "sha256:7dc253b542bfd4b4eb88d9dbae4ca079e7bf2e2afd819ee18891a43db66c60c7",
- "sha256:94f5bd885f67bbb25c82d80184abbf7ce4f6c3c3a41fbaa4182f034bba803e69",
- "sha256:a89e188daa119ffa0d03ce5123dee3f8ffd5115c896c2a9d4f0dbb3d8b95bfa3",
- "sha256:ad3399da9b0ca36e2f24de72f67ab2854a62e623274607e37e0ce5f5d5fa9166",
- "sha256:b0348be89275fd1d4c44ffa39530c41a21062f52299b1e3ee7d1c61f060044b8",
- "sha256:b5554368e4ede1856121b0dfa35ce71768102e4aa55e526cb8de7f374ff78722",
- "sha256:cbddc56b2502d3f87fda4f98d948eb5b11f36ff3902e17cb6cc44727f2200525",
- "sha256:d79f18f41751725c56eceab2a886f021d70fd70a6188fd386e29a045945ffc10",
- "sha256:dc2ca26a19ab32dc475dbad9dfe723d3a64c835f4c23f625c2b6566ca32b9f29",
- "sha256:dd9bcd4f294eb0633bb33d1a74febdd2b9018b8b8ed325f861fffcd2c7660bb8",
- "sha256:e8baab1bc7c9152715844f1faca6744f2416929de10d7639ed49555a85549f52",
- "sha256:ec31fe12668af687b99acf1567399632a7c47b0e17cfb9ae47c098644ef36797",
- "sha256:f12b4f7e2d8f9da3141564e6737d79016fe5336cc92de6814eba579744f65b0a",
- "sha256:f58ac38d5ca045a377b3b377c84df8175ab992c970a53332fa8ac2373df44ff7"
- ],
- "index": "pypi",
- "version": "==1.16.4"
- },
- "overpy": {
- "git": "https://github.com/commaai/python-overpy.git",
- "ref": "f86529af402d4642e1faeb146671c40284007323"
- },
- "psutil": {
- "hashes": [
- "sha256:028a1ec3c6197eadd11e7b46e8cc2f0720dc18ac6d7aabdb8e8c0d6c9704f000",
- "sha256:503e4b20fa9d3342bcf58191bbc20a4a5ef79ca7df8972e6197cc14c5513e73d",
- "sha256:863a85c1c0a5103a12c05a35e59d336e1d665747e531256e061213e2e90f63f3",
- "sha256:954f782608bfef9ae9f78e660e065bd8ffcfaea780f9f2c8a133bb7cb9e826d7",
- "sha256:b6e08f965a305cd84c2d07409bc16fbef4417d67b70c53b299116c5b895e3f45",
- "sha256:bc96d437dfbb8865fc8828cf363450001cb04056bbdcdd6fc152c436c8a74c61",
- "sha256:cf49178021075d47c61c03c0229ac0c60d5e2830f8cab19e2d88e579b18cdb76",
- "sha256:d5350cb66690915d60f8b233180f1e49938756fb2d501c93c44f8fb5b970cc63",
- "sha256:eba238cf1989dfff7d483c029acb0ac4fcbfc15de295d682901f0e2497e6781a"
- ],
- "index": "pypi",
- "version": "==5.6.3"
- },
- "pycapnp": {
- "hashes": [
- "sha256:44e14a5ace399cf1753acb8bbce558b8c895c48fd2102d266c34eaff286824cf"
- ],
- "index": "pypi",
- "version": "==0.6.4"
- },
- "pycparser": {
- "hashes": [
- "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
- ],
- "version": "==2.19"
- },
- "pycryptodome": {
- "hashes": [
- "sha256:0281dc6a65a4d0d9e439f54e0ad5faf27bfdc2ebe9ead36912bac74a0920fa2e",
- "sha256:02af9b284f5c9a55f06f5e4532c16c9b7bd958e293e93969934d864ef7bd87ee",
- "sha256:09da99372fb69762e4b9690291176a166cc351793e2e1c9405d29ca291503aa8",
- "sha256:0c2400ccfc049c3f24e65d4f02bb4208d86e408011019e455fab7f50d2b226c9",
- "sha256:2081dd6dce6b21bf3596427edaedd4f2561dce616893b162ed2c674f3a3ca70a",
- "sha256:28b86ec9fdb005a2a18e4862a3a7277046738825ee8dc89cda5657e75a396089",
- "sha256:2d790c0d4c0d5edcf5fbab4e2af7b03757e40c5ae8d217f0dfe9ddea37fe130f",
- "sha256:2f24906153dca16528cf5515b1afa9ef635423d5a654904e861765f88ca667b6",
- "sha256:30d283939896fa4bacbdb9fa86e6fd51e9a5b953a511e210b38481f697f289f5",
- "sha256:31f78b67f97830d137f74813c0502a181a03b43a32ed124049bb20428176c307",
- "sha256:33c1f3a380fd38ab4dd4372bef17e98002b360b52814bb1b077693b1bd06ec87",
- "sha256:34091e9a6650c44e25339f22fc821396f19f152f65be2546edd823a093fb5a04",
- "sha256:567fb73951ab6865a2eb1a0060b54be1e27302574f6c65879525bdf53fab49e1",
- "sha256:5bc40f8aa7ba8ca7f833ad2477b9d84e1bfd2630b22a46d9bbd221982f8c3ac0",
- "sha256:6b0a0ccf33c7a6100c569667c888335a4aaf0d22218cb97b4963a65d70f6c343",
- "sha256:71b93157f1ce93fc7cfff9359b76def2b4826a7ef7a7f95e070161368e7f584a",
- "sha256:7d939d511b7dac29b2d936706786771ecb8256e43fade5cdb0e8bc58f02b86cf",
- "sha256:7fbc5a93d52e4c51487f4648b00dc41700adb144d10fc567b05f852e76c243ad",
- "sha256:9cb94b8f9c915a5d2b273d612a25a8e5d67b49543f8eb6bcec0275ac46cda421",
- "sha256:a585ea1722f9731e75881d5ffcc51d11c794d244ac57e7c2a9cbb8d5ac729302",
- "sha256:a6458dd7a10ae51f6fce56bdfc79bf6d3b54556237045d09e77fbda9d6d37864",
- "sha256:a9fb92e948128bce0239b87c6efcf2cb1c5a703d0b41dd6835211e6fafd1c5df",
- "sha256:b0b6b4ca1c53e7d6ca9f2720919f63837f05e7a5f92912a2bc29bfd03ed3b54f",
- "sha256:b7d22c8d648aaa3a7ec785eda544402141eb78ac5ffbba4cbe2c3a1f52276870",
- "sha256:bc9560574a868cfa2ba781b7bb0b4685b08ea251697abfc49070ffc05e1cbee6",
- "sha256:c0c5a576f3f7b7de3f86889cb47eb51b59dc11db9cf1e2a0f51eb4d988010ea4",
- "sha256:e1c91c2fa942a71c98a7a1f462de6dbbe82f34b9267eb8131314d97bd13bf0d4",
- "sha256:ec936361ad78aa95382c313df95777795b8185aac5dd3ec5463363ea94b556fc"
- ],
- "index": "pypi",
- "version": "==3.8.2"
- },
- "pyflakes": {
- "hashes": [
- "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0",
- "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"
- ],
- "index": "pypi",
- "version": "==2.1.1"
- },
- "pyjwt": {
- "hashes": [
- "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e",
- "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"
- ],
- "index": "pypi",
- "version": "==1.7.1"
- },
- "pylint": {
- "hashes": [
- "sha256:02c2b6d268695a8b64ad61847f92e611e6afcff33fd26c3a2125370c4662905d",
- "sha256:ee1e85575587c5b58ddafa25e1c1b01691ef172e139fc25585e5d3f02451da93"
- ],
- "index": "pypi",
- "version": "==1.9.4"
- },
- "pyserial": {
- "hashes": [
- "sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627",
- "sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8"
- ],
- "index": "pypi",
- "version": "==3.4"
- },
- "python-dateutil": {
- "hashes": [
- "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
- "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
- ],
- "index": "pypi",
- "version": "==2.8.0"
- },
- "pyyaml": {
- "hashes": [
- "sha256:57acc1d8533cbe51f6662a55434f0dbecfa2b9eaf115bede8f6fd00115a0c0d3",
- "sha256:588c94b3d16b76cfed8e0be54932e5729cc185caffaa5a451e7ad2f7ed8b4043",
- "sha256:68c8dd247f29f9a0d09375c9c6b8fdc64b60810ebf07ba4cdd64ceee3a58c7b7",
- "sha256:70d9818f1c9cd5c48bb87804f2efc8692f1023dac7f1a1a5c61d454043c1d265",
- "sha256:86a93cccd50f8c125286e637328ff4eef108400dd7089b46a7be3445eecfa391",
- "sha256:a0f329125a926876f647c9fa0ef32801587a12328b4a3c741270464e3e4fa778",
- "sha256:a3c252ab0fa1bb0d5a3f6449a4826732f3eb6c0270925548cac342bc9b22c225",
- "sha256:b4bb4d3f5e232425e25dda21c070ce05168a786ac9eda43768ab7f3ac2770955",
- "sha256:cd0618c5ba5bda5f4039b9398bb7fb6a317bb8298218c3de25c47c4740e4b95e",
- "sha256:ceacb9e5f8474dcf45b940578591c7f3d960e82f926c707788a570b51ba59190",
- "sha256:fe6a88094b64132c4bb3b631412e90032e8cfe9745a58370462240b8cb7553cd"
- ],
- "index": "pypi",
- "version": "==5.1.1"
- },
- "pyzmq": {
- "hashes": [
- "sha256:1651e52ed91f0736afd6d94ef9f3259b5534ce8beddb054f3d5ca989c4ef7c4f",
- "sha256:5ccb9b3d4cd20c000a9b75689d5add8cd3bce67fcbd0f8ae1b59345247d803af",
- "sha256:5e120c4cd3872e332fb35d255ad5998ebcee32ace4387b1b337416b6b90436c7",
- "sha256:5e2a3707c69a7281a9957f83718815fd74698cba31f6d69f9ed359921f662221",
- "sha256:63d51add9af8d0442dc90f916baf98fdc04e3b0a32afec4bfc83f8d85e72959f",
- "sha256:65c5a0bdc49e20f7d6b03a661f71e2fda7a99c51270cafe71598146d09810d0d",
- "sha256:66828fabe911aa545d919028441a585edb7c9c77969a5fea6722ef6e6ece38ab",
- "sha256:7d79427e82d9dad6e9b47c0b3e7ae5f9d489b1601e3a36ea629bb49501a4daf3",
- "sha256:824ee5d3078c4eae737ffc500fbf32f2b14e6ec89b26b435b7834febd70120cf",
- "sha256:89dc0a83cccec19ff3c62c091e43e66e0183d1e6b4658c16ee4e659518131494",
- "sha256:8b319805f6f7c907b101c864c3ca6cefc9db8ce0791356f180b1b644c7347e4c",
- "sha256:90facfb379ab47f94b19519c1ecc8ec8d10813b69d9c163117944948bdec5d15",
- "sha256:a0a178c7420021fc0730180a914a4b4b3092ce9696ceb8e72d0f60f8ce1655dd",
- "sha256:a7a89591ae315baccb8072f216614b3e59aed7385aef4393a6c741783d6ee9cf",
- "sha256:ba2578f0ae582452c02ed9fac2dc477b08e80ce05d2c0885becf5fff6651ccb0",
- "sha256:c69b0055c55702f5b0b6b354133e8325b9a56dbc80e1be2d240bead253fb9825",
- "sha256:ca434e1858fe222380221ddeb81e86f45522773344c9da63c311d17161df5e06",
- "sha256:d4b8ecfc3d92f114f04d5c40f60a65e5196198b827503341521dda12d8b14939",
- "sha256:d706025c47b09a54f005953ebe206f6d07a22516776faa4f509aaff681cc5468",
- "sha256:d8f27e958f8a2c0c8ffd4d8855c3ce8ac3fa1e105f0491ce31729aa2b3229740",
- "sha256:dbd264298f76b9060ce537008eb989317ca787c857e23cbd1b3ddf89f190a9b1",
- "sha256:e926d66f0df8fdbf03ba20583af0f215e475c667fb033d45fd031c66c63e34c9",
- "sha256:efc3bd48237f973a749f7312f68062f1b4ca5c2032a0673ca3ea8e46aa77187b",
- "sha256:f59bc782228777cbfe04555707a9c56d269c787ed25d6d28ed9d0fbb41cb1ad2",
- "sha256:f8da5322f4ff5f667a0d5a27e871b560c6637153c81e318b35cb012b2a98835c"
- ],
- "index": "pypi",
- "version": "==18.0.1"
- },
- "raven": {
- "hashes": [
- "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54",
- "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4"
- ],
- "index": "pypi",
- "version": "==6.10.0"
- },
- "requests": {
- "hashes": [
- "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4",
- "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"
- ],
- "index": "pypi",
- "version": "==2.22.0"
- },
- "setproctitle": {
- "hashes": [
- "sha256:6283b7a58477dd8478fbb9e76defb37968ee4ba47b05ec1c053cb39638bd7398",
- "sha256:6a035eddac62898786aed2c2eee7334c28cfc8106e8eb29fdd117cac56c6cdf0"
- ],
- "index": "pypi",
- "version": "==1.1.10"
- },
- "singledispatch": {
- "hashes": [
- "sha256:5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c",
- "sha256:833b46966687b3de7f438c761ac475213e53b306740f1abfaa86e1d1aae56aa8"
- ],
- "markers": "python_version < '3.4'",
- "version": "==3.4.0.3"
- },
- "six": {
- "hashes": [
- "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
- "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
- ],
- "index": "pypi",
- "version": "==1.12.0"
- },
- "smbus2": {
- "hashes": [
- "sha256:4d5aae2f65d39056bb44e8906d5c503f8ee7e02fadb0a6433f1091a9ce528dde"
- ],
- "index": "pypi",
- "version": "==0.2.3"
- },
- "sympy": {
- "hashes": [
- "sha256:71a11e5686ae7ab6cb8feb5bd2651ef4482f8fd43a7c27e645a165e4353b23e1",
- "sha256:f9b00ec76151c98470e84f1da2d7d03633180b71fb318428ddccce1c867d3eaa"
- ],
- "index": "pypi",
- "version": "==1.4"
- },
- "tqdm": {
- "hashes": [
- "sha256:0a860bf2683fdbb4812fe539a6c22ea3f1777843ea985cb8c3807db448a0f7ab",
- "sha256:e288416eecd4df19d12407d0c913cbf77aa8009d7fddb18f632aded3bdbdda6b"
- ],
- "index": "pypi",
- "version": "==4.32.1"
- },
- "urllib3": {
- "hashes": [
- "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1",
- "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232"
- ],
- "index": "pypi",
- "version": "==1.25.3"
- },
- "utm": {
- "hashes": [
- "sha256:a6608a67df84418fd959a79b228b90ab55b2ae877827f9c210947104c5a75d0e"
- ],
- "index": "pypi",
- "version": "==0.4.2"
- },
- "websocket-client": {
- "hashes": [
- "sha256:1151d5fb3a62dc129164292e1227655e4bbc5dd5340a5165dfae61128ec50aa9",
- "sha256:1fd5520878b68b84b5748bb30e592b10d0a91529d5383f74f4964e72b297fd3a"
- ],
- "index": "pypi",
- "version": "==0.56.0"
- },
- "werkzeug": {
- "hashes": [
- "sha256:865856ebb55c4dcd0630cdd8f3331a1847a819dda7e8c750d3db6f2aa6c0209c",
- "sha256:a0b915f0815982fb2a09161cb8f31708052d0951c3ba433ccc5e1aa276507ca6"
- ],
- "version": "==0.15.4"
- },
- "wrapt": {
- "hashes": [
- "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533"
- ],
- "version": "==1.11.1"
- }
- },
- "develop": {
- "absl-py": {
- "hashes": [
- "sha256:b943d1c567743ed0455878fcd60bc28ac9fae38d129d1ccfad58079da00b8951"
- ],
- "version": "==0.7.1"
- },
- "adal": {
- "hashes": [
- "sha256:82e84fa0b442caf8131f1e87a7ebee2546f57ab16a8917a599a02b6e455cb1b0",
- "sha256:b6edd095be66561382bdaa59d40b04490e93149fb3b7fa44c1fa5504eed5b8b9"
- ],
- "version": "==1.2.1"
- },
- "aenum": {
- "hashes": [
- "sha256:3df9b84cce5dc9ed77c337079f97b66c44c0053eb87d6f4d46b888dc45801e38",
- "sha256:7a77c205c4bc9d7fe9bd73b3193002d724aebf5909fa0d297534208953891ec8",
- "sha256:a3208e4b28db3a7b232ff69b934aef2ea1bf27286d9978e1e597d46f490e4687"
- ],
- "index": "pypi",
- "version": "==2.1.2"
- },
- "amqp": {
- "hashes": [
- "sha256:aa4409446139676943a2eaa27d5f58caf750f4ca5a89f888c452afd86be6a67d",
- "sha256:cbb6f87d53cac612a594f982b717cc1c54c6a1e17943a0a0d32dc6cc9e2120c8"
- ],
- "version": "==2.5.0"
- },
- "asn1crypto": {
- "hashes": [
- "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87",
- "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49"
- ],
- "version": "==0.24.0"
- },
- "astor": {
- "hashes": [
- "sha256:0e41295809baf43ae8303350e031aff81ae52189b6f881f36d623fa8b2f1960e",
- "sha256:37a6eed8b371f1228db08234ed7f6cfdc7817a3ed3824797e20cbb11dc2a7862"
- ],
- "version": "==0.8.0"
- },
- "astroid": {
- "hashes": [
- "sha256:87de48a92e29cedf7210ffa853d11441e7ad94cb47bacd91b023499b51cbc756",
- "sha256:d25869fc7f44f1d9fb7d24fd7ea0639656f5355fc3089cd1f3d18c6ec6b124c7"
- ],
- "version": "==1.6.6"
- },
- "attrs": {
- "hashes": [
- "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79",
- "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399"
- ],
- "version": "==19.1.0"
- },
- "azure-batch": {
- "hashes": [
- "sha256:017be21a9e6db92473d2e33170d5dd445596fc70d706f73552ac9c6b57a6ef1c",
- "sha256:cd71c7ebb5beab174b6225bbf79ae18d6db0c8d63227a7e514da0a75f138364c"
- ],
- "index": "pypi",
- "version": "==4.1.3"
- },
- "azure-common": {
- "hashes": [
- "sha256:2606ae77ff81c0036965b92ec2efe03eaec02a66714140ca0f7aa401b8b9bbb0",
- "sha256:c908621a71eb4ee9fab0962e35d3c27a18f09a854d8359c2f32c15b3f4fc576e"
- ],
- "index": "pypi",
- "version": "==1.1.16"
- },
- "azure-nspkg": {
- "hashes": [
- "sha256:a908f96a695b12e31b6c56cda0bb8e6d2a054283c350881667f300b8563ece33",
- "sha256:af81fd4512be5ad0834b8e82c43bbe80b016bd295a8794fac28d69bf243357e0",
- "sha256:ce4173e06f2f423775c4ca8a635e9a89b5fe8e4ba9fefbbe2a1e0d525072392c"
- ],
- "index": "pypi",
- "version": "==3.0.1"
- },
- "azure-storage-blob": {
- "hashes": [
- "sha256:308058abfd789f5830d91f6407eb00a7b04925b2b9af267aecfb46c335802cdc",
- "sha256:8cab5420ba6646ead09fdb497646f735b12645cba8efed96a86f7b370e175ade"
- ],
- "index": "pypi",
- "version": "==1.3.1"
- },
- "azure-storage-common": {
- "hashes": [
- "sha256:585658ebc784e843a285732a69aa69ef922e17c3063460c2c7b27c89f377004c",
- "sha256:a412a78618e82bf99030ce56f1f2d5fc6c2c2eec7ee1beda86ce6ea5f2c9196b"
- ],
- "index": "pypi",
- "version": "==1.3.0"
- },
- "azure-storage-nspkg": {
- "hashes": [
- "sha256:4fc4685aef941eab2f7fb53824254cca2e38f2a1bf33cda0c8ae654fe15827d6",
- "sha256:855315c038c0e695868025127e1b3057a1f984af9ccfbaeac4fbfd6c5dd3b466"
- ],
- "index": "pypi",
- "version": "==3.0.0"
- },
- "backports-abc": {
- "hashes": [
- "sha256:033be54514a03e255df75c5aee8f9e672f663f93abb723444caec8fe43437bde",
- "sha256:52089f97fe7a9aa0d3277b220c1d730a85aefd64e1b2664696fe35317c5470a7"
- ],
- "index": "pypi",
- "version": "==0.5"
- },
- "backports.functools-lru-cache": {
- "hashes": [
- "sha256:9d98697f088eb1b0fa451391f91afb5e3ebde16bbdb272819fd091151fda4f1a",
- "sha256:f0b0e4eba956de51238e17573b7087e852dfe9854afd2e9c873f73fc0ca0a6dd"
- ],
- "markers": "python_version < '3.2'",
- "version": "==1.5"
- },
- "backports.lzma": {
- "hashes": [
- "sha256:50829db66f0445442f6c796bba0ca62d1f87f54760c4682b6d1489e729a43744"
- ],
- "index": "pypi",
- "version": "==0.0.13"
- },
- "backports.shutil-get-terminal-size": {
- "hashes": [
- "sha256:0975ba55054c15e346944b38956a4c9cbee9009391e41b86c68990effb8c1f64",
- "sha256:713e7a8228ae80341c70586d1cc0a8caa5207346927e23d09dcbcaf18eadec80"
- ],
- "markers": "python_version == '2.7'",
- "version": "==1.0.0"
- },
- "backports.weakref": {
- "hashes": [
- "sha256:81bc9b51c0abc58edc76aefbbc68c62a787918ffe943a37947e162c3f8e19e82",
- "sha256:bc4170a29915f8b22c9e7c4939701859650f2eb84184aee80da329ac0b9825c2"
- ],
- "version": "==1.0.post1"
- },
- "billiard": {
- "hashes": [
- "sha256:756bf323f250db8bf88462cd042c992ba60d8f5e07fc5636c24ba7d6f4261d84"
- ],
- "version": "==3.6.0.0"
- },
- "bincopy": {
- "hashes": [
- "sha256:61d02c09910635599127056d2707c22bfa310cb31f935fbfdda406639017717e",
- "sha256:a0e31dc5de70bffaf717bb76b136857eb78ea138fb49dc5a1bf06303f103dff8"
- ],
- "index": "pypi",
- "version": "==16.0.0"
- },
- "bleach": {
- "hashes": [
- "sha256:978e758599b54cd3caa2e160d74102879b230ea8dc93871d0783721eef58bc65",
- "sha256:e67f46adcec78dbc3c04462f3aba3213a673d5652eba2609ed1ef15492a44b8d"
- ],
- "index": "pypi",
- "version": "==1.5.0"
- },
- "boto": {
- "hashes": [
- "sha256:147758d41ae7240dc989f0039f27da8ca0d53734be0eb869ef16e3adcfa462e8",
- "sha256:ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a"
- ],
- "index": "pypi",
- "version": "==2.49.0"
- },
- "boto3": {
- "hashes": [
- "sha256:794a9a4b6a9e40c1ac57a377de609872d28d62afe4295c48cdc1b1c92f96ab8e",
- "sha256:962b078568cc520869ea2842f307864c9abc30ad5ed160e12b2a89debf220161"
- ],
- "index": "pypi",
- "version": "==1.9.168"
- },
- "botocore": {
- "hashes": [
- "sha256:675f2b66af486dd02f5825601bb0c8378773999f8705c6f75450849ca41fed80",
- "sha256:c3fc314c0e0aa13aa024d272d991e23d37550050abf96b3c7dea889ed1743723"
- ],
- "version": "==1.12.168"
- },
- "celery": {
- "hashes": [
- "sha256:4c4532aa683f170f40bd76f928b70bc06ff171a959e06e71bf35f2f9d6031ef9",
- "sha256:528e56767ae7e43a16cfef24ee1062491f5754368d38fcfffa861cdb9ef219be"
- ],
- "index": "pypi",
- "version": "==4.3.0"
- },
- "certifi": {
- "hashes": [
- "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5",
- "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"
- ],
- "version": "==2019.3.9"
- },
- "cffi": {
- "hashes": [
- "sha256:041c81822e9f84b1d9c401182e174996f0bae9991f33725d059b771744290774",
- "sha256:046ef9a22f5d3eed06334d01b1e836977eeef500d9b78e9ef693f9380ad0b83d",
- "sha256:066bc4c7895c91812eff46f4b1c285220947d4aa46fa0a2651ff85f2afae9c90",
- "sha256:066c7ff148ae33040c01058662d6752fd73fbc8e64787229ea8498c7d7f4041b",
- "sha256:2444d0c61f03dcd26dbf7600cf64354376ee579acad77aef459e34efcb438c63",
- "sha256:300832850b8f7967e278870c5d51e3819b9aad8f0a2c8dbe39ab11f119237f45",
- "sha256:34c77afe85b6b9e967bd8154e3855e847b70ca42043db6ad17f26899a3df1b25",
- "sha256:46de5fa00f7ac09f020729148ff632819649b3e05a007d286242c4882f7b1dc3",
- "sha256:4aa8ee7ba27c472d429b980c51e714a24f47ca296d53f4d7868075b175866f4b",
- "sha256:4d0004eb4351e35ed950c14c11e734182591465a33e960a4ab5e8d4f04d72647",
- "sha256:4e3d3f31a1e202b0f5a35ba3bc4eb41e2fc2b11c1eff38b362de710bcffb5016",
- "sha256:50bec6d35e6b1aaeb17f7c4e2b9374ebf95a8975d57863546fa83e8d31bdb8c4",
- "sha256:55cad9a6df1e2a1d62063f79d0881a414a906a6962bc160ac968cc03ed3efcfb",
- "sha256:5662ad4e4e84f1eaa8efce5da695c5d2e229c563f9d5ce5b0113f71321bcf753",
- "sha256:59b4dc008f98fc6ee2bb4fd7fc786a8d70000d058c2bbe2698275bc53a8d3fa7",
- "sha256:73e1ffefe05e4ccd7bcea61af76f36077b914f92b76f95ccf00b0c1b9186f3f9",
- "sha256:a1f0fd46eba2d71ce1589f7e50a9e2ffaeb739fb2c11e8192aa2b45d5f6cc41f",
- "sha256:a2e85dc204556657661051ff4bab75a84e968669765c8a2cd425918699c3d0e8",
- "sha256:a5457d47dfff24882a21492e5815f891c0ca35fefae8aa742c6c263dac16ef1f",
- "sha256:a8dccd61d52a8dae4a825cdbb7735da530179fea472903eb871a5513b5abbfdc",
- "sha256:ae61af521ed676cf16ae94f30fe202781a38d7178b6b4ab622e4eec8cefaff42",
- "sha256:b012a5edb48288f77a63dba0840c92d0504aa215612da4541b7b42d849bc83a3",
- "sha256:d2c5cfa536227f57f97c92ac30c8109688ace8fa4ac086d19d0af47d134e2909",
- "sha256:d42b5796e20aacc9d15e66befb7a345454eef794fdb0737d1af593447c6c8f45",
- "sha256:dee54f5d30d775f525894d67b1495625dd9322945e7fee00731952e0368ff42d",
- "sha256:e070535507bd6aa07124258171be2ee8dfc19119c28ca94c9dfb7efd23564512",
- "sha256:e1ff2748c84d97b065cc95429814cdba39bcbd77c9c85c89344b317dc0d9cbff",
- "sha256:ed851c75d1e0e043cbf5ca9a8e1b13c4c90f3fbd863dacb01c0808e2b5204201"
- ],
- "index": "pypi",
- "version": "==1.12.3"
- },
- "chardet": {
- "hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
- ],
- "index": "pypi",
- "version": "==3.0.4"
- },
- "click": {
- "hashes": [
- "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
- "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
- ],
- "version": "==7.0"
- },
- "cloudpickle": {
- "hashes": [
- "sha256:603244e0f552b72a267d47a7d9b347b27a3430f58a0536037a290e7e0e212ecf",
- "sha256:b8ba7e322f2394b9bbbdc1c976e6442c2c02acc784cb9e553cee9186166a6890"
- ],
- "version": "==1.2.1"
- },
- "configparser": {
- "hashes": [
- "sha256:8be81d89d6e7b4c0d4e44bcc525845f6da25821de80cb5e06e7e0238a2899e32",
- "sha256:da60d0014fd8c55eb48c1c5354352e363e2d30bbf7057e5e171a468390184c75"
- ],
- "markers": "python_version == '2.7'",
- "version": "==3.7.4"
- },
- "control": {
- "hashes": [
- "sha256:726e8c36a253a54c8886df31f860d740d70de4f8b041421d5df078c3bff3aadb"
- ],
- "index": "pypi",
- "version": "==0.8.2"
- },
- "cryptography": {
- "hashes": [
- "sha256:24b61e5fcb506424d3ec4e18bca995833839bf13c59fc43e530e488f28d46b8c",
- "sha256:25dd1581a183e9e7a806fe0543f485103232f940fcfc301db65e630512cce643",
- "sha256:3452bba7c21c69f2df772762be0066c7ed5dc65df494a1d53a58b683a83e1216",
- "sha256:41a0be220dd1ed9e998f5891948306eb8c812b512dc398e5a01846d855050799",
- "sha256:5751d8a11b956fbfa314f6553d186b94aa70fdb03d8a4d4f1c82dcacf0cbe28a",
- "sha256:5f61c7d749048fa6e3322258b4263463bfccefecb0dd731b6561cb617a1d9bb9",
- "sha256:72e24c521fa2106f19623a3851e9f89ddfdeb9ac63871c7643790f872a305dfc",
- "sha256:7b97ae6ef5cba2e3bb14256625423413d5ce8d1abb91d4f29b6d1a081da765f8",
- "sha256:961e886d8a3590fd2c723cf07be14e2a91cf53c25f02435c04d39e90780e3b53",
- "sha256:96d8473848e984184b6728e2c9d391482008646276c3ff084a1bd89e15ff53a1",
- "sha256:ae536da50c7ad1e002c3eee101871d93abdc90d9c5f651818450a0d3af718609",
- "sha256:b0db0cecf396033abb4a93c95d1602f268b3a68bb0a9cc06a7cff587bb9a7292",
- "sha256:cfee9164954c186b191b91d4193989ca994703b2fff406f71cf454a2d3c7327e",
- "sha256:e6347742ac8f35ded4a46ff835c60e68c22a536a8ae5c4422966d06946b6d4c6",
- "sha256:f27d93f0139a3c056172ebb5d4f9056e770fdf0206c2f422ff2ebbad142e09ed",
- "sha256:f57b76e46a58b63d1c6375017f4564a28f19a5ca912691fd2e4261b3414b618d"
- ],
- "index": "pypi",
- "version": "==2.7"
- },
- "cycler": {
- "hashes": [
- "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d",
- "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"
- ],
- "version": "==0.10.0"
- },
- "cython": {
- "hashes": [
- "sha256:0afa0b121b89de619e71587e25702e2b7068d7da2164c47e6eee80c17823a62f",
- "sha256:1c608ba76f7a20cc9f0c021b7fe5cb04bc1a70327ae93a9298b1bc3e0edddebe",
- "sha256:26229570d6787ff3caa932fe9d802960f51a89239b990d275ae845405ce43857",
- "sha256:2a9deafa437b6154cac2f25bb88e0bfd075a897c8dc847669d6f478d7e3ee6b1",
- "sha256:2f28396fbce6d9d68a40edbf49a6729cf9d92a4d39ff0f501947a89188e9099f",
- "sha256:3983dd7b67297db299b403b29b328d9e03e14c4c590ea90aa1ad1d7b35fb178b",
- "sha256:4100a3f8e8bbe47d499cdac00e56d5fe750f739701ea52dc049b6c56f5421d97",
- "sha256:51abfaa7b6c66f3f18028876713c8804e73d4c2b6ceddbcbcfa8ec62429377f0",
- "sha256:61c24f4554efdb8fb1ac6c8e75dab301bcdf2b7b739ed0c2b267493bb43163c5",
- "sha256:700ccf921b2fdc9b23910e95b5caae4b35767685e0812343fa7172409f1b5830",
- "sha256:7b41eb2e792822a790cb2a171df49d1a9e0baaa8e81f58077b7380a273b93d5f",
- "sha256:803987d3b16d55faa997bfc12e8b97f1091f145930dee229b020487aed8a1f44",
- "sha256:99af5cfcd208c81998dcf44b3ca466dee7e17453cfb50e98b87947c3a86f8753",
- "sha256:9faea1cca34501c7e139bc7ef8e504d532b77865c58592493e2c154a003b450f",
- "sha256:a7ba4c9a174db841cfee9a0b92563862a0301d7ca543334666c7266b541f141a",
- "sha256:b26071c2313d1880599c69fd831a07b32a8c961ba69d7ccbe5db1cd8d319a4ca",
- "sha256:b49dc8e1116abde13a3e6a9eb8da6ab292c5a3325155fb872e39011b110b37e6",
- "sha256:bd40def0fd013569887008baa6da9ca428e3d7247adeeaeada153006227bb2e7",
- "sha256:bfd0db770e8bd4e044e20298dcae6dfc42561f85d17ee546dcd978c8b23066ae",
- "sha256:c2fad1efae5889925c8fd7867fdd61f59480e4e0b510f9db096c912e884704f1",
- "sha256:c81aea93d526ccf6bc0b842c91216ee9867cd8792f6725a00f19c8b5837e1715",
- "sha256:da786e039b4ad2bce3d53d4799438cf1f5e01a0108f1b8d78ac08e6627281b1a",
- "sha256:deab85a069397540987082d251e9c89e0e5b2e3e044014344ff81f60e211fc4b",
- "sha256:e3f1e6224c3407beb1849bdc5ae3150929e593e4cffff6ca41c6ec2b10942c80",
- "sha256:e74eb224e53aae3943d66e2d29fe42322d5753fd4c0641329bccb7efb3a46552",
- "sha256:ee697c7ea65cb14915a64f36874da8ffc2123df43cf8bc952172e04a26656cd6",
- "sha256:f37792b16d11606c28e428460bd6a3d14b8917b109e77cdbe4ca78b0b9a52c87",
- "sha256:fd2906b54cbf879c09d875ad4e4687c58d87f5ed03496063fec1c9065569fd5d"
- ],
- "index": "pypi",
- "version": "==0.29.10"
- },
- "datadog": {
- "hashes": [
- "sha256:0e33727bd9ef0b8201359accdf12f61fb58ab541bf4062693aca16653f8e7a0a",
- "sha256:995e51d142ae3624c86c78369b268f23386bb207df5345d718c241718387875c"
- ],
- "index": "pypi",
- "version": "==0.29.3"
- },
- "decorator": {
- "hashes": [
- "sha256:86156361c50488b84a3f148056ea716ca587df2f0de1d34750d35c21312725de",
- "sha256:f069f3a01830ca754ba5258fde2278454a0b5b79e0d7f5c13b3b97e57d4acff6"
- ],
- "index": "pypi",
- "version": "==4.4.0"
- },
- "defusedxml": {
- "hashes": [
- "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93",
- "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"
- ],
- "version": "==0.6.0"
- },
- "dlib": {
- "hashes": [
- "sha256:92587c81b0165e933593f505fdf099dface0d0f8ec874b1d8655fc774598911f"
- ],
- "index": "pypi",
- "version": "==19.17.0"
- },
- "docutils": {
- "hashes": [
- "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
- "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
- "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
- ],
- "version": "==0.14"
- },
- "dominate": {
- "hashes": [
- "sha256:4076735c0745fe771e57b2313dbb4bfeec42731816ee23cee509f66e8912aa51",
- "sha256:4b9fd42d2824b79761799590697db45bf93daad511b130c50513af38da33df9b"
- ],
- "index": "pypi",
- "version": "==2.3.5"
- },
- "elasticsearch": {
- "hashes": [
- "sha256:cbc73831c63fa2824538df76fcb2c4be007b43dbd9e7788ae70ea6d24109925b",
- "sha256:d1b176b87a7fb75dca82978c82a4023e8b21cbc98f4018cb51190fb0b8b43764"
- ],
- "index": "pypi",
- "version": "==7.0.2"
- },
- "entium": {
- "hashes": [
- "sha256:233f39c6b5477e0c6fffd8d5cb7fc9df9deab80c79c7fb77e91f6d046782b0ce",
- "sha256:4b14b4810a97ab041b629a0b59d21a98f5e197ee623d7b14925755ec4fd6888a"
- ],
- "index": "pypi",
- "version": "==0.1.4"
- },
- "entrypoints": {
- "hashes": [
- "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19",
- "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"
- ],
- "version": "==0.3"
- },
- "enum34": {
- "hashes": [
- "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850",
- "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a",
- "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79",
- "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"
- ],
- "markers": "python_version < '3'",
- "version": "==1.1.6"
- },
- "fastcluster": {
- "hashes": [
- "sha256:0024b1304d4618a32900473b809265694bc6d0a10bfbc272407443318644d405",
- "sha256:0b33b076ea98939742e0734e944c903c8c67af3eecd5a9f8b4349407c1affdd3",
- "sha256:244d400a81d23b48f2b825e50e99e1ff3c7d2be2acc40942e3359b4deef68483",
- "sha256:2bb3bf8e1c7af42e47ef24bc2386a1d3e6ec8dc5e6be4123a491a36b89227b49",
- "sha256:539d84d43fbe541a38d94c84bf0469c430cb7cda488364941ce57f680a07b091",
- "sha256:5e7d81385bbc2148c554c4aaa32e26a00fbadc1190d5bad9c8719f6432629307",
- "sha256:642e4d92220c1deede1e89409c5ad366e4a3f3ed55fff0a4e325d4eb2574d65a",
- "sha256:66c868fdfc161e5c45cdf399f1274216602ea82c9fc46c632c9602dbaa149840",
- "sha256:6952c9d25b3ea60d6a53ee92205e7f16cc6baf7caa4776fb1e55dc6e8e2965f2",
- "sha256:8606da6f6f51f81c3b4e000edeb8668711a1769a6ebf3c99ab98f9c6d2fb7534",
- "sha256:8d552d29ed054ce20f5bb0445b51bd7b6b8088fdae334625b4a9950189dcc2bf",
- "sha256:922735fde2848a6f0478c6968048a16a5d3d6ba6e1d1a9596d578b59dce719d7",
- "sha256:9f3cd227a9ebeec090e4186a63e46cd87d121968bd1d45ea8a7c2d483bc082fb",
- "sha256:a382cb411610ca06a69e7b131239f0bb02961fec762d5b6804e653a32cd5ab52",
- "sha256:a986b3afe823bcaea3dad9de1485b176c6dd5b0e2f154ede71aaf6635e82e159",
- "sha256:b1902ab52418c6f4c2f3f7439aea711c6b5aa9bbb4c97b6d4b0c6f5e5c894342",
- "sha256:bb56f6c7343bbb68beb1ffd13abdb87ce7a84ab391b3a4e63ed5c02b2d1ce46f",
- "sha256:c2e5d11f5f96e6861fd632246f18bc6592ac439f236caffd4d2a75697a6f8969",
- "sha256:c61973bb16117ee16b7642ff9da8e0899fb4d5eb5d0cc9c56d3269551ccd6307",
- "sha256:d2deec11a6625c5578325f4dd10980e2981d1f1d1e658c7c79f2497377f92bdf",
- "sha256:e0f2feb03f67b12f25538aa05b1150c7a2c1cd1c21ad7d0bde94e8169ef46627",
- "sha256:e32e7287c47291eca2c83cd5cc6a5007eff2da00c12ac21fd721a16d0c428059",
- "sha256:e889ea36c4e469ff3fb2a6a868c8e557fc988a81cd1cf3d09876107e59ee9cbd",
- "sha256:e96f3b65e3748f2be06aa0977a00872ddeca4f8959703126f2b103978243bbdd"
- ],
- "index": "pypi",
- "version": "==1.1.25"
- },
- "fasteners": {
- "hashes": [
- "sha256:007e4d2b2d4a10093f67e932e5166722d2eab83b77724156e92ad013c6226574",
- "sha256:3a176da6b70df9bb88498e1a18a9e4a8579ed5b9141207762368a1017bf8f5ef"
- ],
- "index": "pypi",
- "version": "==0.15"
- },
- "flask": {
- "hashes": [
- "sha256:ad7c6d841e64296b962296c2c2dabc6543752985727af86a975072dea984b6f3",
- "sha256:e7d32475d1de5facaa55e3958bc4ec66d3762076b074296aa50ef8fdc5b9df61"
- ],
- "index": "pypi",
- "version": "==1.0.3"
- },
- "flask-cors": {
- "hashes": [
- "sha256:72170423eb4612f0847318afff8c247b38bd516b7737adfc10d1c2cdbb382d16",
- "sha256:f4d97201660e6bbcff2d89d082b5b6d31abee04b1b3003ee073a6fd25ad1d69a"
- ],
- "index": "pypi",
- "version": "==3.0.8"
- },
- "flask-socketio": {
- "hashes": [
- "sha256:aced332903522a52822fb1e21744549510ce8b26e074422d4cd9aff68e43be5b",
- "sha256:f6f7e0205f0dd92d98a87e3f6d26d94ade29ca380ba383b505070674c804ae2e"
- ],
- "index": "pypi",
- "version": "==4.1.0"
- },
- "funcsigs": {
- "hashes": [
- "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca",
- "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"
- ],
- "markers": "python_version < '3.3'",
- "version": "==1.0.2"
- },
- "functools32": {
- "hashes": [
- "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0",
- "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"
- ],
- "markers": "python_version < '3'",
- "version": "==3.2.3.post2"
- },
- "future": {
- "hashes": [
- "sha256:67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8"
- ],
- "index": "pypi",
- "version": "==0.17.1"
- },
- "futures": {
- "hashes": [
- "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265",
- "sha256:ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1"
- ],
- "markers": "python_version < '3.2'",
- "version": "==3.2.0"
- },
- "gast": {
- "hashes": [
- "sha256:fe939df4583692f0512161ec1c880e0a10e71e6a232da045ab8edd3756fbadf0"
- ],
- "version": "==0.2.2"
- },
- "geoalchemy2": {
- "hashes": [
- "sha256:0d1c9ea3ec13f6a522ccc3ffd2569ac524a6c6e80bab883e8805b28c48e77143",
- "sha256:4dc4c6c2bda0fc82cccab4aaff185a6570e13a5351d85e29e12984a55d4138ee"
- ],
- "index": "pypi",
- "version": "==0.6.3"
- },
- "gevent": {
- "hashes": [
- "sha256:0774babec518a24d9a7231d4e689931f31b332c4517a771e532002614e270a64",
- "sha256:0e1e5b73a445fe82d40907322e1e0eec6a6745ca3cea19291c6f9f50117bb7ea",
- "sha256:0ff2b70e8e338cf13bedf146b8c29d475e2a544b5d1fe14045aee827c073842c",
- "sha256:107f4232db2172f7e8429ed7779c10f2ed16616d75ffbe77e0e0c3fcdeb51a51",
- "sha256:14b4d06d19d39a440e72253f77067d27209c67e7611e352f79fe69e0f618f76e",
- "sha256:1b7d3a285978b27b469c0ff5fb5a72bcd69f4306dbbf22d7997d83209a8ba917",
- "sha256:1eb7fa3b9bd9174dfe9c3b59b7a09b768ecd496debfc4976a9530a3e15c990d1",
- "sha256:2711e69788ddb34c059a30186e05c55a6b611cb9e34ac343e69cf3264d42fe1c",
- "sha256:28a0c5417b464562ab9842dd1fb0cc1524e60494641d973206ec24d6ec5f6909",
- "sha256:3249011d13d0c63bea72d91cec23a9cf18c25f91d1f115121e5c9113d753fa12",
- "sha256:44089ed06a962a3a70e96353c981d628b2d4a2f2a75ea5d90f916a62d22af2e8",
- "sha256:4bfa291e3c931ff3c99a349d8857605dca029de61d74c6bb82bd46373959c942",
- "sha256:50024a1ee2cf04645535c5ebaeaa0a60c5ef32e262da981f4be0546b26791950",
- "sha256:53b72385857e04e7faca13c613c07cab411480822ac658d97fd8a4ddbaf715c8",
- "sha256:74b7528f901f39c39cdbb50cdf08f1a2351725d9aebaef212a29abfbb06895ee",
- "sha256:7d0809e2991c9784eceeadef01c27ee6a33ca09ebba6154317a257353e3af922",
- "sha256:896b2b80931d6b13b5d9feba3d4eebc67d5e6ec54f0cf3339d08487d55d93b0e",
- "sha256:8d9ec51cc06580f8c21b41fd3f2b3465197ba5b23c00eb7d422b7ae0380510b0",
- "sha256:9f7a1e96fec45f70ad364e46de32ccacab4d80de238bd3c2edd036867ccd48ad",
- "sha256:ab4dc33ef0e26dc627559786a4fba0c2227f125db85d970abbf85b77506b3f51",
- "sha256:d1e6d1f156e999edab069d79d890859806b555ce4e4da5b6418616322f0a3df1",
- "sha256:d752bcf1b98174780e2317ada12013d612f05116456133a6acf3e17d43b71f05",
- "sha256:e5bcc4270671936349249d26140c267397b7b4b1381f5ec8b13c53c5b53ab6e1"
- ],
- "index": "pypi",
- "version": "==1.4.0"
- },
- "git-pylint-commit-hook": {
- "hashes": [
- "sha256:e1d39e7856b3ef0a0269121ca210dc3f5a97da158b322411e8e1185918a91b3c"
- ],
- "index": "pypi",
- "version": "==2.5.1"
- },
- "greenlet": {
- "hashes": [
- "sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0",
- "sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28",
- "sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8",
- "sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304",
- "sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0",
- "sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214",
- "sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043",
- "sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6",
- "sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625",
- "sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc",
- "sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638",
- "sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163",
- "sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4",
- "sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490",
- "sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248",
- "sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939",
- "sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87",
- "sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720",
- "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656"
- ],
- "markers": "platform_python_implementation == 'CPython'",
- "version": "==0.4.15"
- },
- "grpcio": {
- "hashes": [
- "sha256:0232add03144dd3cf9b660e2718244cb8e175370dca4d3855cb4e489a7811b53",
- "sha256:0f20e6dcb1b8662cdca033bb97c0a8116a5343e3ebc7f71c5fe7f89039978350",
- "sha256:10b07a623d33d4966f45c85d410bc6a79c5ac6341f06c3beda6c22be12cbfe07",
- "sha256:10c0476d5a52d21f402fc073745dc43b87cc8e080a1f49bbff4e1059019310fb",
- "sha256:289dae0b35c59d191c524e976dd0a6f8c995d2062e72621eb866ad0f4472a635",
- "sha256:2be726f16142d358a0df1e81d583d6820ee561a7856a79cca2fbe49989308be7",
- "sha256:4338d2a81f5b4ca022e085040b3cfce19419a5ce44aa7e6810ac1df05365bed7",
- "sha256:4c535b46f20e66bee3097583231977e721acdfcb1671d1490c99b7be8902ce18",
- "sha256:557154aef70a0e979700cc9528bc8b606b668084a29a0d57dbc4b06b078a2f1c",
- "sha256:5bfdd7e6647498f979dc46583723c852d97b25afe995d55aa1c76a5f9816bc1f",
- "sha256:87d8943ae7aa6ca5bbad732867d7f17d2550e4966a0c15b52088e8b579422e47",
- "sha256:89d8719d8de4d137678f7caa979e1b0a6fd4026f8096ceef8c2d164bbabefaf2",
- "sha256:9c3f4af989ce860710ac1864dc2e867dd87e6cee51a2368df1b253596868e52f",
- "sha256:9da52c3c728883aee429bb7c315049f50b2139f680cd86bb1165418e4f93a982",
- "sha256:9e9736659987beab42d18525ed10d21f80a1ba8389eac03425fbfd5684e6bbf0",
- "sha256:9ebcbb1a054cab362d29d3be571d43d6b9b23302d9fc4b43e5327000da1680a9",
- "sha256:a93e08636623e24c939851e2e0c0140b14f524b2980c9cdc4ea52b70a871c7e0",
- "sha256:ac322d86d1a079e0a118d544443ee16f320af0062c191b4754c0c6ec2fc79310",
- "sha256:b1fb101459868f52df6b61e7bb13375e50badf17a160e39fe1d51ae19e53f461",
- "sha256:b39aac96cceac624a23d540473835086a3ffa77c91030189988c073488434493",
- "sha256:b65507bc273c6dbf539175a786a344cc0ac78d50e5584f72c6599733f8a3301f",
- "sha256:be5bb6e47417e537c884a2e2ff2e1a8b2c064a998fcfdfcc67528d4e63e7ebaf",
- "sha256:c92de6a28a909c4f460dc1bbbcb50d676cf0b1f40224b222761f73fdd851b522",
- "sha256:c9f5962eb7fa7607b20eb0e4f59ed35829bd600fc0eacb626a6db83229a3e445",
- "sha256:d00bdf9c546ed6e649f785c55b05288e8b2dbb6bf2eb74b6c579fa0d591d35bd",
- "sha256:da804b1dd8293bd9d61b1e6ea989c887ba042a808a4fbdd80001cfa059aafed2",
- "sha256:ead6c5aa3e807345913649c3be395aaca2bbb2d225f18b8f31f37eab225508f6",
- "sha256:eb4d81550ce6f826af4ec6e8d98be347fe96291d718bf115c3f254621ae8d98d",
- "sha256:ef6a18ec8fd32ec81748fe720544ea2fb2d2dc50fd6d06739d5e2eb8f0626a1c",
- "sha256:fad42835656e0b6d3b7ffc900598e776722e30f43b7234a48f2576ca30f31a47",
- "sha256:fb98dbfee0d963b49ae5754554028cf62e6bd695f22de16d242ba9d2f0b7339b",
- "sha256:fb9cd9bb8d26dc17c2dd715a46bca3a879ec8283879b164e85863110dc6e3b2a"
- ],
- "version": "==1.21.1"
- },
- "gunicorn": {
- "hashes": [
- "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471",
- "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3"
- ],
- "index": "pypi",
- "version": "==19.9.0"
- },
- "h5py": {
- "hashes": [
- "sha256:05750b91640273c69989c657eaac34b091abdd75efc8c4824c82aaf898a2da0a",
- "sha256:082a27208aa3a2286e7272e998e7e225b2a7d4b7821bd840aebf96d50977abbb",
- "sha256:08e2e8297195f9e813e894b6c63f79372582787795bba2014a2db6a2de95f713",
- "sha256:0dd2adeb2e9de5081eb8dcec88874e7fd35dae9a21557be3a55a3c7d491842a4",
- "sha256:0f94de7a10562b991967a66bbe6dda9808e18088676834c0a4dcec3fdd3bcc6f",
- "sha256:106e42e2e01e486a3d32eeb9ba0e3a7f65c12fa8998d63625fa41fb8bdc44cdb",
- "sha256:1606c66015f04719c41a9863c156fc0e6b992150de21c067444bcb82e7d75579",
- "sha256:1854c4beff9961e477e133143c5e5e355dac0b3ebf19c52cf7cc1b1ef757703c",
- "sha256:1e9fb6f1746500ea91a00193ce2361803c70c6b13f10aae9a33ad7b5bd28e800",
- "sha256:2cca17e80ddb151894333377675db90cd0279fa454776e0a4f74308376afd050",
- "sha256:30e365e8408759db3778c361f1e4e0fe8e98a875185ae46c795a85e9bafb9cdf",
- "sha256:3206bac900e16eda81687d787086f4ffd4f3854980d798e191a9868a6510c3ae",
- "sha256:3c23d72058647cee19b30452acc7895621e2de0a0bd5b8a1e34204b9ea9ed43c",
- "sha256:407b5f911a83daa285bbf1ef78a9909ee5957f257d3524b8606be37e8643c5f0",
- "sha256:4162953714a9212d373ac953c10e3329f1e830d3c7473f2a2e4f25dd6241eef0",
- "sha256:5fc7aba72a51b2c80605eba1c50dbf84224dcd206279d30a75c154e5652e1fe4",
- "sha256:713ac19307e11de4d9833af0c4bd6778bde0a3d967cafd2f0f347223711c1e31",
- "sha256:71b946d80ef3c3f12db157d7778b1fe74a517ca85e94809358b15580983c2ce2",
- "sha256:8cc4aed71e20d87e0a6f02094d718a95252f11f8ed143bc112d22167f08d4040",
- "sha256:9d41ca62daf36d6b6515ab8765e4c8c4388ee18e2a665701fef2b41563821002",
- "sha256:a744e13b000f234cd5a5b2a1f95816b819027c57f385da54ad2b7da1adace2f3",
- "sha256:b087ee01396c4b34e9dc41e3a6a0442158206d383c19c7d0396d52067b17c1cb",
- "sha256:b0f03af381d33306ce67d18275b61acb4ca111ced645381387a02c8a5ee1b796",
- "sha256:b9e4b8dfd587365bdd719ae178fa1b6c1231f81280b1375eef8626dfd8761bf3",
- "sha256:c5dd4ec75985b99166c045909e10f0534704d102848b1d9f0992720e908928e7",
- "sha256:d2b82f23cd862a9d05108fe99967e9edfa95c136f532a71cb3d28dc252771f50",
- "sha256:e58a25764472af07b7e1c4b10b0179c8ea726446c7141076286e41891bf3a563",
- "sha256:f3b49107fbfc77333fc2b1ef4d5de2abcd57e7ea3a1482455229494cf2da56ce"
- ],
- "index": "pypi",
- "version": "==2.9.0"
- },
- "hexdump": {
- "hashes": [
- "sha256:d781a43b0c16ace3f9366aade73e8ad3a7bd5137d58f0b45ab2d3f54876f20db"
- ],
- "index": "pypi",
- "version": "==3.3"
- },
- "html5lib": {
- "hashes": [
- "sha256:2612a191a8d5842bfa057e41ba50bbb9dcb722419d2408c78cff4758d0754868"
- ],
- "index": "pypi",
- "version": "==0.9999999"
- },
- "humanfriendly": {
- "hashes": [
- "sha256:23057b10ad6f782e7bc3a20e3cb6768ab919f619bbdc0dd75691121bbde5591d",
- "sha256:33ee8ceb63f1db61cce8b5c800c531e1a61023ac5488ccde2ba574a85be00a85"
- ],
- "version": "==4.18"
- },
- "idna": {
- "hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
- ],
- "index": "pypi",
- "version": "==2.8"
- },
- "imageio": {
- "hashes": [
- "sha256:1a2bbbb7cd38161340fa3b14d806dfbf914abf3ee6fd4592af2afb87d049f209",
- "sha256:42e65aadfc3d57a1043615c92bdf6319b67589e49a0aae2b985b82144aceacad"
- ],
- "index": "pypi",
- "version": "==2.5.0"
- },
- "intervaltree": {
- "hashes": [
- "sha256:cb4f61c81dcb4fea6c09903f3599015a83c9bdad1f0bbd232495e6681e19e273"
- ],
- "index": "pypi",
- "version": "==3.0.2"
- },
- "ipaddress": {
- "hashes": [
- "sha256:64b28eec5e78e7510698f6d4da08800a5c575caa4a286c93d651c5d3ff7b6794",
- "sha256:b146c751ea45cad6188dd6cf2d9b757f6f4f8d6ffb96a023e6f2e26eea02a72c"
- ],
- "markers": "python_version < '3'",
- "version": "==1.0.22"
- },
- "ipykernel": {
- "hashes": [
- "sha256:56d82987472f4b14ab0214e4aef55def006671885d285cd8821f2600861215a6",
- "sha256:59b0855082d021f533cff477e1bb619e663b6aab11309a05bf88eaec9f53faed",
- "sha256:699103c8e64886e3ec7053f2a6aa83bb90426063526f63a818732ff385202bad"
- ],
- "index": "pypi",
- "version": "==4.10.0"
- },
- "ipython": {
- "hashes": [
- "sha256:0371b7e4bd74954a35086eac949beeac5b1c9f5ce231e2e77df2286a293765e3",
- "sha256:37101b8cbe072fe17bff100bc03d096404e4a9a0357097aeb5b61677c042cab1",
- "sha256:4bac649857611baaaf76bc82c173aa542f7486446c335fe1a6c05d0d491c8906"
- ],
- "index": "pypi",
- "version": "==5.8.0"
- },
- "ipython-genutils": {
- "hashes": [
- "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
- "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
- ],
- "version": "==0.2.0"
- },
- "ipywidgets": {
- "hashes": [
- "sha256:0f2b5cde9f272cb49d52f3f0889fdd1a7ae1e74f37b48dac35a83152780d2b7b",
- "sha256:a3e224f430163f767047ab9a042fc55adbcab0c24bbe6cf9f306c4f89fdf0ba3"
- ],
- "version": "==7.4.2"
- },
- "isodate": {
- "hashes": [
- "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8",
- "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81"
- ],
- "version": "==0.6.0"
- },
- "isort": {
- "hashes": [
- "sha256:c40744b6bc5162bbb39c1257fe298b7a393861d50978b565f3ccd9cb9de0182a",
- "sha256:f57abacd059dc3bd666258d1efb0377510a89777fda3e3274e3c01f7c03ae22d"
- ],
- "version": "==4.3.20"
- },
- "itsdangerous": {
- "hashes": [
- "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
- "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
- ],
- "version": "==1.1.0"
- },
- "jinja2": {
- "hashes": [
- "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013",
- "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"
- ],
- "index": "pypi",
- "version": "==2.10.1"
- },
- "jmespath": {
- "hashes": [
- "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6",
- "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c"
- ],
- "version": "==0.9.4"
- },
- "joblib": {
- "hashes": [
- "sha256:21e0c34a69ad7fde4f2b1f3402290e9ec46f545f15f1541c582edfe05d87b63a",
- "sha256:315d6b19643ec4afd4c41c671f9f2d65ea9d787da093487a81ead7b0bac94524"
- ],
- "index": "pypi",
- "version": "==0.13.2"
- },
- "json-logging-py": {
- "hashes": [
- "sha256:118b1fe1f4eacaea6370e5b9710d0f6d0c0a4599aef9d5b9875a6a579974fc9a"
- ],
- "index": "pypi",
- "version": "==0.2"
- },
- "jsonschema": {
- "hashes": [
- "sha256:0c0a81564f181de3212efa2d17de1910f8732fa1b71c42266d983cd74304e20d",
- "sha256:a5f6559964a3851f59040d3b961de5e68e70971afb88ba519d27e6a039efff1a"
- ],
- "version": "==3.0.1"
- },
- "jupyter": {
- "hashes": [
- "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7",
- "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78",
- "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"
- ],
- "index": "pypi",
- "version": "==1.0.0"
- },
- "jupyter-client": {
- "hashes": [
- "sha256:b5f9cb06105c1d2d30719db5ffb3ea67da60919fb68deaefa583deccd8813551",
- "sha256:c44411eb1463ed77548bc2d5ec0d744c9b81c4a542d9637c7a52824e2121b987"
- ],
- "version": "==5.2.4"
- },
- "jupyter-console": {
- "hashes": [
- "sha256:3f928b817fc82cda95e431eb4c2b5eb21be5c483c2b43f424761a966bb808094",
- "sha256:545dedd3aaaa355148093c5609f0229aeb121b4852995c2accfa64fe3e0e55cd"
- ],
- "version": "==5.2.0"
- },
- "jupyter-core": {
- "hashes": [
- "sha256:927d713ffa616ea11972534411544589976b2493fc7e09ad946e010aa7eb9970",
- "sha256:ba70754aa680300306c699790128f6fbd8c306ee5927976cbe48adacf240c0b7"
- ],
- "version": "==4.4.0"
- },
- "keras": {
- "hashes": [
- "sha256:794d0c92c6c4122f1f0fcf3a7bc2f49054c6a54ddbef8d8ffafca62795d760b6",
- "sha256:90b610a3dbbf6d257b20a079eba3fdf2eed2158f64066a7c6f7227023fd60bc9"
- ],
- "index": "pypi",
- "version": "==2.2.4"
- },
- "keras-applications": {
- "hashes": [
- "sha256:5579f9a12bcde9748f4a12233925a59b93b73ae6947409ff34aa2ba258189fe5",
- "sha256:df4323692b8c1174af821bf906f1e442e63fa7589bf0f1230a0b6bdc5a810c95"
- ],
- "version": "==1.0.8"
- },
- "keras-maskrcnn": {
- "hashes": [
- "sha256:7cbadcf5d8a41e64ebd19157253f0357f2c46f289584c6f58fd38a19f7cc3509"
- ],
- "index": "pypi",
- "version": "==0.2.1"
- },
- "keras-preprocessing": {
- "hashes": [
- "sha256:44aee5f2c4d80c3b29f208359fcb336df80f293a0bb6b1c738da43ca206656fb",
- "sha256:5a8debe01d840de93d49e05ccf1c9b81ae30e210d34dacbcc47aeb3049b528e5"
- ],
- "version": "==1.1.0"
- },
- "keras-resnet": {
- "hashes": [
- "sha256:8ce27ba782d1b45b127af51208aefdceb2de8d2c54646bac5fc786506ce558c0"
- ],
- "version": "==0.2.0"
- },
- "keras-retinanet": {
- "hashes": [
- "sha256:257b77ca46c6846d8e9260e4eb1c77ab9b564c512bb5ebe23e72fc46b5c41899"
- ],
- "index": "pypi",
- "version": "==0.5.0"
- },
- "kiwisolver": {
- "hashes": [
- "sha256:05b5b061e09f60f56244adc885c4a7867da25ca387376b02c1efc29cc16bcd0f",
- "sha256:26f4fbd6f5e1dabff70a9ba0d2c4bd30761086454aa30dddc5b52764ee4852b7",
- "sha256:3b2378ad387f49cbb328205bda569b9f87288d6bc1bf4cd683c34523a2341efe",
- "sha256:400599c0fe58d21522cae0e8b22318e09d9729451b17ee61ba8e1e7c0346565c",
- "sha256:47b8cb81a7d18dbaf4fed6a61c3cecdb5adec7b4ac292bddb0d016d57e8507d5",
- "sha256:53eaed412477c836e1b9522c19858a8557d6e595077830146182225613b11a75",
- "sha256:58e626e1f7dfbb620d08d457325a4cdac65d1809680009f46bf41eaf74ad0187",
- "sha256:5a52e1b006bfa5be04fe4debbcdd2688432a9af4b207a3f429c74ad625022641",
- "sha256:5c7ca4e449ac9f99b3b9d4693debb1d6d237d1542dd6a56b3305fe8a9620f883",
- "sha256:682e54f0ce8f45981878756d7203fd01e188cc6c8b2c5e2cf03675390b4534d5",
- "sha256:79bfb2f0bd7cbf9ea256612c9523367e5ec51d7cd616ae20ca2c90f575d839a2",
- "sha256:7f4dd50874177d2bb060d74769210f3bce1af87a8c7cf5b37d032ebf94f0aca3",
- "sha256:8944a16020c07b682df861207b7e0efcd2f46c7488619cb55f65882279119389",
- "sha256:8aa7009437640beb2768bfd06da049bad0df85f47ff18426261acecd1cf00897",
- "sha256:939f36f21a8c571686eb491acfffa9c7f1ac345087281b412d63ea39ca14ec4a",
- "sha256:9733b7f64bd9f807832d673355f79703f81f0b3e52bfce420fc00d8cb28c6a6c",
- "sha256:a02f6c3e229d0b7220bd74600e9351e18bc0c361b05f29adae0d10599ae0e326",
- "sha256:a0c0a9f06872330d0dd31b45607197caab3c22777600e88031bfe66799e70bb0",
- "sha256:acc4df99308111585121db217681f1ce0eecb48d3a828a2f9bbf9773f4937e9e",
- "sha256:b64916959e4ae0ac78af7c3e8cef4becee0c0e9694ad477b4c6b3a536de6a544",
- "sha256:d3fcf0819dc3fea58be1fd1ca390851bdb719a549850e708ed858503ff25d995",
- "sha256:d52e3b1868a4e8fd18b5cb15055c76820df514e26aa84cc02f593d99fef6707f",
- "sha256:db1a5d3cc4ae943d674718d6c47d2d82488ddd94b93b9e12d24aabdbfe48caee",
- "sha256:e3a21a720791712ed721c7b95d433e036134de6f18c77dbe96119eaf7aa08004",
- "sha256:e8bf074363ce2babeb4764d94f8e65efd22e6a7c74860a4f05a6947afc020ff2",
- "sha256:f16814a4a96dc04bf1da7d53ee8d5b1d6decfc1a92a63349bb15d37b6a263dd9",
- "sha256:f2b22153870ca5cf2ab9c940d7bc38e8e9089fa0f7e5856ea195e1cf4ff43d5a",
- "sha256:f790f8b3dff3d53453de6a7b7ddd173d2e020fb160baff578d578065b108a05f"
- ],
- "version": "==1.1.0"
- },
- "kombu": {
- "hashes": [
- "sha256:056a31cc95b10ca4eb0d4ebcba714007b1db1c6c45c8e2d139fe91933481b00b",
- "sha256:af5b0f892b081f49d95c772a241fb7687f4cc3e42c94328f118dffb1f4e161e5"
- ],
- "version": "==4.6.1"
- },
- "lazy-object-proxy": {
- "hashes": [
- "sha256:159a745e61422217881c4de71f9eafd9d703b93af95618635849fe469a283661",
- "sha256:23f63c0821cc96a23332e45dfaa83266feff8adc72b9bcaef86c202af765244f",
- "sha256:3b11be575475db2e8a6e11215f5aa95b9ec14de658628776e10d96fa0b4dac13",
- "sha256:3f447aff8bc61ca8b42b73304f6a44fa0d915487de144652816f950a3f1ab821",
- "sha256:4ba73f6089cd9b9478bc0a4fa807b47dbdb8fad1d8f31a0f0a5dbf26a4527a71",
- "sha256:4f53eadd9932055eac465bd3ca1bd610e4d7141e1278012bd1f28646aebc1d0e",
- "sha256:64483bd7154580158ea90de5b8e5e6fc29a16a9b4db24f10193f0c1ae3f9d1ea",
- "sha256:6f72d42b0d04bfee2397aa1862262654b56922c20a9bb66bb76b6f0e5e4f9229",
- "sha256:7c7f1ec07b227bdc561299fa2328e85000f90179a2f44ea30579d38e037cb3d4",
- "sha256:7c8b1ba1e15c10b13cad4171cfa77f5bb5ec2580abc5a353907780805ebe158e",
- "sha256:8559b94b823f85342e10d3d9ca4ba5478168e1ac5658a8a2f18c991ba9c52c20",
- "sha256:a262c7dfb046f00e12a2bdd1bafaed2408114a89ac414b0af8755c696eb3fc16",
- "sha256:acce4e3267610c4fdb6632b3886fe3f2f7dd641158a843cf6b6a68e4ce81477b",
- "sha256:be089bb6b83fac7f29d357b2dc4cf2b8eb8d98fe9d9ff89f9ea6012970a853c7",
- "sha256:bfab710d859c779f273cc48fb86af38d6e9210f38287df0069a63e40b45a2f5c",
- "sha256:c10d29019927301d524a22ced72706380de7cfc50f767217485a912b4c8bd82a",
- "sha256:dd6e2b598849b3d7aee2295ac765a578879830fb8966f70be8cd472e6069932e",
- "sha256:e408f1eacc0a68fed0c08da45f31d0ebb38079f043328dce69ff133b95c29dc1"
- ],
- "version": "==1.4.1"
- },
- "libarchive": {
- "hashes": [
- "sha256:37e8cca1eb85d30583cdcffc58116d83abc09be7549d5d6c9ead563c0a8d7b04"
- ],
- "index": "pypi",
- "version": "==0.4.6"
- },
- "lru-dict": {
- "hashes": [
- "sha256:365457660e3d05b76f1aba3e0f7fedbfcd6528e97c5115a351ddd0db488354cc"
- ],
- "index": "pypi",
- "version": "==1.1.6"
- },
- "lxml": {
- "hashes": [
- "sha256:06c7616601430aa140a69f97e3116308fffe0848f543b639a5ec2e8920ae72fd",
- "sha256:177202792f9842374a8077735c69c41a4282183f7851443d2beb8ee310720819",
- "sha256:19317ad721ceb9e39847d11131903931e2794e447d4751ebb0d9236f1b349ff2",
- "sha256:36d206e62f3e5dbaafd4ec692b67157e271f5da7fd925fda8515da675eace50d",
- "sha256:387115b066c797c85f9861a9613abf50046a15aac16759bc92d04f94acfad082",
- "sha256:3ce1c49d4b4a7bc75fb12acb3a6247bb7a91fe420542e6d671ba9187d12a12c2",
- "sha256:4d2a5a7d6b0dbb8c37dab66a8ce09a8761409c044017721c21718659fa3365a1",
- "sha256:58d0a1b33364d1253a88d18df6c0b2676a1746d27c969dc9e32d143a3701dda5",
- "sha256:62a651c618b846b88fdcae0533ec23f185bb322d6c1845733f3123e8980c1d1b",
- "sha256:69ff21064e7debc9b1b1e2eee8c2d686d042d4257186d70b338206a80c5bc5ea",
- "sha256:7060453eba9ba59d821625c6af6a266bd68277dce6577f754d1eb9116c094266",
- "sha256:7d26b36a9c4bce53b9cfe42e67849ae3c5c23558bc08363e53ffd6d94f4ff4d2",
- "sha256:83b427ad2bfa0b9705e02a83d8d607d2c2f01889eb138168e462a3a052c42368",
- "sha256:923d03c84534078386cf50193057aae98fa94cace8ea7580b74754493fda73ad",
- "sha256:b773715609649a1a180025213f67ffdeb5a4878c784293ada300ee95a1f3257b",
- "sha256:baff149c174e9108d4a2fee192c496711be85534eab63adb122f93e70aa35431",
- "sha256:bca9d118b1014b4c2d19319b10a3ebed508ff649396ce1855e1c96528d9b2fa9",
- "sha256:ce580c28845581535dc6000fc7c35fdadf8bea7ccb57d6321b044508e9ba0685",
- "sha256:d34923a569e70224d88e6682490e24c842907ba2c948c5fd26185413cbe0cd96",
- "sha256:dd9f0e531a049d8b35ec5e6c68a37f1ba6ec3a591415e6804cbdf652793d15d7",
- "sha256:ecb805cbfe9102f3fd3d2ef16dfe5ae9e2d7a7dfbba92f4ff1e16ac9784dbfb0",
- "sha256:ede9aad2197a0202caff35d417b671f5f91a3631477441076082a17c94edd846",
- "sha256:ef2d1fc370400e0aa755aab0b20cf4f1d0e934e7fd5244f3dd4869078e4942b9",
- "sha256:f2fec194a49bfaef42a548ee657362af5c7a640da757f6f452a35da7dd9f923c"
- ],
- "index": "pypi",
- "version": "==4.3.4"
- },
- "markdown": {
- "hashes": [
- "sha256:2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a",
- "sha256:56a46ac655704b91e5b7e6326ce43d5ef72411376588afa1dd90e881b83c7e8c"
- ],
- "version": "==3.1.1"
- },
- "markupsafe": {
- "hashes": [
- "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
- "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
- "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
- "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
- "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
- "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
- "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
- "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
- "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
- "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
- "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
- "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
- "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
- "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
- "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
- "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
- "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
- "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
- "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
- "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
- "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
- "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
- "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
- "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
- "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
- "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
- "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
- "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
- ],
- "version": "==1.1.1"
- },
- "matplotlib": {
- "hashes": [
- "sha256:0ba8e3ec1b0feddc6b068fe70dc38dcf2917e301ad8d2b3f848c14ad463a4157",
- "sha256:10a48e33e64dbd95f0776ba162f379c5cc55301c2d155506e79ce0c26b52f2ce",
- "sha256:1376535fe731adbba55ab9e48896de226b7e89dbb55390c5fbd8f7161b7ae3be",
- "sha256:16f0f8ba22df1e2c9f06c87088de45742322fde282a93b5c744c0f969cf7932e",
- "sha256:1c6c999f2212858021329537f8e0f98f3f29086ec3683511dd1ecec84409f51d",
- "sha256:2316dc177fc7b3d8848b49365498de0c385b4c9bba511edddd24c34fbe3d37a4",
- "sha256:3398bfb533482bf21974cecf28224dd23784ad4e4848be582903f7a2436ec12e",
- "sha256:3477cb1e1061b34210acc43d20050be8444478ff50b8adfac5fe2b45fc97df01",
- "sha256:3cc06333b8264428d02231804e2e726b902e9161dc16f573183dee6cb7ef621f",
- "sha256:4259ea7cb2c238355ee13275eddd261d869cefbdeb18a65f35459589d6d17def",
- "sha256:4addcf93234b6122f530f90f485fd3d00d158911fbc1ed24db3fa66cd49fe565",
- "sha256:50c0e24bcbce9c54346f4a2f4e97b0ed111f0413ac3fe9954061ae1c8aa7021f",
- "sha256:62ed7597d9e54db6e133420d779c642503c25eba390e1178d85dfb2ba0d05948",
- "sha256:69f6d51e41a17f6a5f70c56bb10b8ded9f299609204495a7fa2782a3a755ffc5",
- "sha256:6d232e49b74e3d2db22c63c25a9a0166d965e87e2b057f795487f1f244b61d9d",
- "sha256:7355bf757ecacd5f0ac9dd9523c8e1a1103faadf8d33c22664178e17533f8ce5",
- "sha256:886b1045c5105631f10c1cbc999f910e44d33af3e9c7efd68c2123efc06ab636",
- "sha256:9e1f353edd7fc7e5e9101abd5bc0201946f77a1b59e0da49095086c03db856ed",
- "sha256:b3a343dfcbe296dbe0f26c731beee72a792ff948407e6979524298ae7bc3234e",
- "sha256:d93675af09ca497a25f4f8d62f3313cf0f21e45427a87487049fe84898b99909",
- "sha256:e2409ef9d37804dfb566f39c962e6ed70f281ff516b8131b3e6b4e6442711ff1",
- "sha256:f8b653b0f89938ba72e92ab080c2f3aa24c1b72e2f61add22880cd1b9a6e3cdd"
- ],
- "index": "pypi",
- "version": "==2.2.3"
- },
- "mccabe": {
- "hashes": [
- "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
- "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
- ],
- "version": "==0.6.1"
- },
- "meld3": {
- "hashes": [
- "sha256:b28a9bfac342aadb4557aa144bea9f8e6208bfb0596190570d10a892d35ff7dc",
- "sha256:f7b754a0fde7a4429b2ebe49409db240b5699385a572501bb0d5627d299f9558"
- ],
- "version": "==1.0.2"
- },
- "mistune": {
- "hashes": [
- "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e",
- "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"
- ],
- "version": "==0.8.4"
- },
- "mock": {
- "hashes": [
- "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3",
- "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"
- ],
- "version": "==3.0.5"
- },
- "monotonic": {
- "hashes": [
- "sha256:23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0",
- "sha256:552a91f381532e33cbd07c6a2655a21908088962bb8fa7239ecbcc6ad1140cc7"
- ],
- "markers": "python_version == '2.7'",
- "version": "==1.5"
- },
- "mpld3": {
- "hashes": [
- "sha256:4d455884a211bf99b37ecc760759435c7bb6a5955de47d8daf4967e301878ab7"
- ],
- "index": "pypi",
- "version": "==0.3"
- },
- "msgpack-python": {
- "hashes": [
- "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b"
- ],
- "index": "pypi",
- "version": "==0.5.6"
- },
- "msrest": {
- "hashes": [
- "sha256:05538c68251eb0c81bd2010524d8ff36d4266ec0669338fbdcecfd23c733231c",
- "sha256:8143093308975f815f968b0d2a1ac8e26ba217eb6d03f3f27aac616aa3a25bd0"
- ],
- "version": "==0.6.7"
- },
- "msrestazure": {
- "hashes": [
- "sha256:070220fa9c86b55026360435b655d1d67ff4306fd1412687c400dc549e9647b7",
- "sha256:e9d525b11d88f1073744e128ae19a4e023e4085893cfcfd02483fdd4cee25091"
- ],
- "version": "==0.6.1"
- },
- "nbconvert": {
- "hashes": [
- "sha256:138381baa41d83584459b5cfecfc38c800ccf1f37d9ddd0bd440783346a4c39c",
- "sha256:4a978548d8383f6b2cfca4a3b0543afb77bc7cb5a96e8b424337ab58c12da9bc"
- ],
- "version": "==5.5.0"
- },
- "nbformat": {
- "hashes": [
- "sha256:b9a0dbdbd45bb034f4f8893cafd6f652ea08c8c1674ba83f2dc55d3955743b0b",
- "sha256:f7494ef0df60766b7cabe0a3651556345a963b74dbc16bc7c18479041170d402"
- ],
- "version": "==4.4.0"
- },
- "nbstripout": {
- "hashes": [
- "sha256:814efbe00988445b2c3f3d1944c9f296a556e2b14a060f7b25372881c2e497d4",
- "sha256:8f085e26e60e9d9c0710748510d1c763c8f63905cb16df7658b35a2936e8ca2b"
- ],
- "index": "pypi",
- "version": "==0.3.5"
- },
- "networkx": {
- "hashes": [
- "sha256:45e56f7ab6fe81652fb4bc9f44faddb0e9025f469f602df14e3b2551c2ea5c8b"
- ],
- "version": "==2.2"
- },
- "nose": {
- "hashes": [
- "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac",
- "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a",
- "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"
- ],
- "index": "pypi",
- "version": "==1.3.7"
- },
- "nose-parameterized": {
- "hashes": [
- "sha256:8f519b9739ac67e3d95f69c15cc80416eea4d63559530d01a37b9565eb629277",
- "sha256:d35e677aba2f15135b6b7ea7feb88f792b899492ba5365ec0e269015df5214ce"
- ],
- "index": "pypi",
- "version": "==0.6.0"
- },
- "notebook": {
- "hashes": [
- "sha256:573e0ae650c5d76b18b6e564ba6d21bf321d00847de1d215b418acb64f056eb8",
- "sha256:f64fa6624d2323fbef6210a621817d6505a45d0d4a9367f1843b20a38a4666ee"
- ],
- "version": "==5.7.8"
- },
- "numpy": {
- "hashes": [
- "sha256:0778076e764e146d3078b17c24c4d89e0ecd4ac5401beff8e1c87879043a0633",
- "sha256:141c7102f20abe6cf0d54c4ced8d565b86df4d3077ba2343b61a6db996cefec7",
- "sha256:14270a1ee8917d11e7753fb54fc7ffd1934f4d529235beec0b275e2ccf00333b",
- "sha256:27e11c7a8ec9d5838bc59f809bfa86efc8a4fd02e58960fa9c49d998e14332d5",
- "sha256:2a04dda79606f3d2f760384c38ccd3d5b9bb79d4c8126b67aff5eb09a253763e",
- "sha256:3c26010c1b51e1224a3ca6b8df807de6e95128b0908c7e34f190e7775455b0ca",
- "sha256:52c40f1a4262c896420c6ea1c6fda62cf67070e3947e3307f5562bd783a90336",
- "sha256:6e4f8d9e8aa79321657079b9ac03f3cf3fd067bf31c1cca4f56d49543f4356a5",
- "sha256:7242be12a58fec245ee9734e625964b97cf7e3f2f7d016603f9e56660ce479c7",
- "sha256:7dc253b542bfd4b4eb88d9dbae4ca079e7bf2e2afd819ee18891a43db66c60c7",
- "sha256:94f5bd885f67bbb25c82d80184abbf7ce4f6c3c3a41fbaa4182f034bba803e69",
- "sha256:a89e188daa119ffa0d03ce5123dee3f8ffd5115c896c2a9d4f0dbb3d8b95bfa3",
- "sha256:ad3399da9b0ca36e2f24de72f67ab2854a62e623274607e37e0ce5f5d5fa9166",
- "sha256:b0348be89275fd1d4c44ffa39530c41a21062f52299b1e3ee7d1c61f060044b8",
- "sha256:b5554368e4ede1856121b0dfa35ce71768102e4aa55e526cb8de7f374ff78722",
- "sha256:cbddc56b2502d3f87fda4f98d948eb5b11f36ff3902e17cb6cc44727f2200525",
- "sha256:d79f18f41751725c56eceab2a886f021d70fd70a6188fd386e29a045945ffc10",
- "sha256:dc2ca26a19ab32dc475dbad9dfe723d3a64c835f4c23f625c2b6566ca32b9f29",
- "sha256:dd9bcd4f294eb0633bb33d1a74febdd2b9018b8b8ed325f861fffcd2c7660bb8",
- "sha256:e8baab1bc7c9152715844f1faca6744f2416929de10d7639ed49555a85549f52",
- "sha256:ec31fe12668af687b99acf1567399632a7c47b0e17cfb9ae47c098644ef36797",
- "sha256:f12b4f7e2d8f9da3141564e6737d79016fe5336cc92de6814eba579744f65b0a",
- "sha256:f58ac38d5ca045a377b3b377c84df8175ab992c970a53332fa8ac2373df44ff7"
- ],
- "index": "pypi",
- "version": "==1.16.4"
- },
- "oauthlib": {
- "hashes": [
- "sha256:0ce32c5d989a1827e3f1148f98b9085ed2370fc939bf524c9c851d8714797298",
- "sha256:3e1e14f6cde7e5475128d30e97edc3bfb4dc857cb884d8714ec161fdbb3b358e"
- ],
- "version": "==3.0.1"
- },
- "opencv-python": {
- "hashes": [
- "sha256:1703a296a96d3d46615e5053f224867977accb4240bcaa0fcabcb0768bf5ac13",
- "sha256:1777ce7535ee7a1995cae168a107a1320e9df13648b930e72a1a2c2eccd64cda",
- "sha256:1e5520482fb18fbd64d079e7f17ac0018f195fd75f6360a53bb82d7903106b50",
- "sha256:25522dcf2529614750a71112a6659759080b4bdc2323f19d47f4d895960fd796",
- "sha256:2af5f2842ad44c65ae2647377e0ff198719e1a1cfc9c6a19bc0c525c035d4bd8",
- "sha256:31ec48d7eca13fc25c287dea7cecab453976e372cad8f50d55c054a247efda21",
- "sha256:47cf48ff5dbd554e9f58cc9e98cf0b5de3f6a971172612bffa06bc5fb79ce872",
- "sha256:494f98366bb5d6c2ac7e50e6617139f353704fd97a6d12ec9d392e72817d5cb0",
- "sha256:4a9845870739e640e3350a8d98d511c92c087fe3d66090e83be7bf94e0ac64f7",
- "sha256:4ac29cc0847d948a6636899014e84e165c30cc8779d6218394d44363462a01ce",
- "sha256:5857ace03b7854221abf8072462d306c2c2ce4e366190b21d90ee8ee8aaf5bb4",
- "sha256:5b4a23d99d5a2874767034466f5a8fd37b9f93ac14955a01b1a208983c76b9ad",
- "sha256:734d87a5021c037064beb62133e135e66c7128e401a63b8b842b809ae2093749",
- "sha256:78005c1c5d15ef4e32e0f485557bd15b5b6d87f49c19db7fe3e9246a61ebe7e4",
- "sha256:81ae2283225c5c52fc3d72debd4241c30ccff2bb922578bf7867f9851cce3acb",
- "sha256:88dbf900f297fdae0f62b899d6a784d8868ec2135854c5f8a9abbad00a6f0c5b",
- "sha256:8c98ea7b8d327a31cd6028782a06147d0e0329ae8e829e881fb5d02f7ed8aec9",
- "sha256:937d4686fef6967921145290f5b50c01c00c5b5d3542a6519e8a85cd88448723",
- "sha256:a057958c0e362b3c4f03b9af1cbdb6d5af035fd22ecd7fd794eba8fdeb049eb8",
- "sha256:c41eab31fa2c641226c6187caa391a688d064c99f078d604574f1912296b771f",
- "sha256:cf4f7e62d1f80d1fa85a1693a3500def5cde54b2b75212b3609e552e4c25acfb",
- "sha256:d90d60143e18334330c149f293071c9f2f3c79c896f33dc4ec65099e58baaaa7",
- "sha256:db3106b7ca86999a7bd1f2fcc93e49314e5e6e451356774e421a69428df5020b",
- "sha256:dbaf264db56f4771dfac6624f438bc4dc670aa94f61a6138848fcab7e9e77380",
- "sha256:e65206c4cf651dc9cf0829962fae8bec986767c9f123d6a1ad17f9356bf7257e",
- "sha256:eac94ddc78c58e891cff7180274317dad2938a4ddfc6ced1c04846c7f50e77e9",
- "sha256:f2e828711f044a965509c862b3a59b3181e9c56c145a950cb53d43fec54e66d2"
- ],
- "version": "==4.1.0.25"
- },
- "osmium": {
- "hashes": [
- "sha256:008f89720d833a28ff875893bc90ca6314ed27f23dedbff6b8e7e0224c058076",
- "sha256:0811d5453e9828f14dc14f7380570a71b2ac2e9fbfc849fb1485a198e1bc0825",
- "sha256:08a427a7c3fe3dceb84e19bcef6edada0dde9a675f75189d89dd7f4b0cab3539",
- "sha256:0a1e4200e678e18db9b291a6498385b4c8f66dc3898be8fc6d0c232fe7600360",
- "sha256:2183610dfbd7831b819e5990ec47a9c25dec76084dbae1d55bdc092bfba9177c",
- "sha256:227ab38197d45fced6e18a5000e27b7bc7ef2970f7adcb856370661340a03b8e",
- "sha256:2928713aaadaeab38fa8d546d274c9545b20440f2019425b3a6bab9444bd935a",
- "sha256:2a3a42252afcf7fd3558c582e6a38df63df038a027b6d5fe1eaf8dac66969d37",
- "sha256:4617fc74d13e2373b239597c6a875b90f95f40ec0d0977f68ca4beb3383a6f63",
- "sha256:4ea02b36332585b66fb52b49468fac7426a257d0ffeaf0e0aa7ef7205f0fc442",
- "sha256:56f269587578fcdd406af43dc276f3a59c4763821f9e41ce7b777f6f97cdede4",
- "sha256:62688a1a662bc2ef7f0b05908c9e68ba11926fc79f3d1df13cd62cee74a6ca66",
- "sha256:72d1d43834610c3d802316b526c204ecf428d5bbd5dab189b0e469bc67858db1",
- "sha256:8a316b6bba0f33250c232c8a10f550d8578b639857e286159e1e0767d5ac7107",
- "sha256:8b4802472d974b4f05ee960c40ccd0c14881b73cd68a669f23ce9b35fe313157",
- "sha256:8c6b5c489d78d398786547480f87a7d51ad51cf0044479f13ecb0c74fb5616c7",
- "sha256:91baacc2b7ad28574ec8c204ba812c5bdd9b0fae79f8b6787bea450441cba52f",
- "sha256:b0b2f925c45fdd1af4a79d3051359c3bc70e7e83939c6096ab91f80b3e2e8cf8",
- "sha256:b96ab16db2537edf7fd36f5b819f4575b7be0dce6ac857a813822b85c790c8c3",
- "sha256:ce9f170aa8cf03a497e3a42fff785e4ddd6937a0a074e480d03b2ae90b60f80d",
- "sha256:d5ebe6bf0e2afc943125ab01980cd0762b3cae8bb47c50aa14ee1a934caf0c85"
- ],
- "index": "pypi",
- "version": "==2.15.0"
- },
- "pandocfilters": {
- "hashes": [
- "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"
- ],
- "version": "==1.4.2"
- },
- "pathlib2": {
- "hashes": [
- "sha256:25199318e8cc3c25dcb45cbe084cc061051336d5a9ea2a12448d3d8cb748f742",
- "sha256:5887121d7f7df3603bca2f710e7219f3eca0eb69e0b7cc6e0a022e155ac931a7"
- ],
- "markers": "python_version in '2.6 2.7 3.2 3.3'",
- "version": "==2.3.3"
- },
- "pbr": {
- "hashes": [
- "sha256:8257baf496c8522437e8a6cfe0f15e00aedc6c0e0e7c9d55eeeeab31e0853843",
- "sha256:8c361cc353d988e4f5b998555c88098b9d5964c2e11acf7b0d21925a66bb5824"
- ],
- "index": "pypi",
- "version": "==5.1.3"
- },
- "percache": {
- "hashes": [
- "sha256:b60043937aece6d154ccd1fd7380fc01ea482335716c2bd41efb85b097bc88df"
- ],
- "index": "pypi",
- "version": "==0.3.0"
- },
- "pexpect": {
- "hashes": [
- "sha256:2094eefdfcf37a1fdbfb9aa090862c1a4878e5c7e0e7e7088bdb511c558e5cd1",
- "sha256:9e2c1fd0e6ee3a49b28f95d4b33bc389c89b20af6a1255906e90ff1262ce62eb"
- ],
- "markers": "sys_platform != 'win32'",
- "version": "==4.7.0"
- },
- "pickleshare": {
- "hashes": [
- "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
- "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
- ],
- "version": "==0.7.5"
- },
- "pillow": {
- "hashes": [
- "sha256:15c056bfa284c30a7f265a41ac4cbbc93bdbfc0dfe0613b9cb8a8581b51a9e55",
- "sha256:1a4e06ba4f74494ea0c58c24de2bb752818e9d504474ec95b0aa94f6b0a7e479",
- "sha256:1c3c707c76be43c9e99cb7e3d5f1bee1c8e5be8b8a2a5eeee665efbf8ddde91a",
- "sha256:1fd0b290203e3b0882d9605d807b03c0f47e3440f97824586c173eca0aadd99d",
- "sha256:24114e4a6e1870c5a24b1da8f60d0ba77a0b4027907860188ea82bd3508c80eb",
- "sha256:258d886a49b6b058cd7abb0ab4b2b85ce78669a857398e83e8b8e28b317b5abb",
- "sha256:33c79b6dd6bc7f65079ab9ca5bebffb5f5d1141c689c9c6a7855776d1b09b7e8",
- "sha256:367385fc797b2c31564c427430c7a8630db1a00bd040555dfc1d5c52e39fcd72",
- "sha256:3c1884ff078fb8bf5f63d7d86921838b82ed4a7d0c027add773c2f38b3168754",
- "sha256:44e5240e8f4f8861d748f2a58b3f04daadab5e22bfec896bf5434745f788f33f",
- "sha256:46aa988e15f3ea72dddd81afe3839437b755fffddb5e173886f11460be909dce",
- "sha256:74d90d499c9c736d52dd6d9b7221af5665b9c04f1767e35f5dd8694324bd4601",
- "sha256:809c0a2ce9032cbcd7b5313f71af4bdc5c8c771cb86eb7559afd954cab82ebb5",
- "sha256:85d1ef2cdafd5507c4221d201aaf62fc9276f8b0f71bd3933363e62a33abc734",
- "sha256:8c3889c7681af77ecfa4431cd42a2885d093ecb811e81fbe5e203abc07e0995b",
- "sha256:9218d81b9fca98d2c47d35d688a0cea0c42fd473159dfd5612dcb0483c63e40b",
- "sha256:9aa4f3827992288edd37c9df345783a69ef58bd20cc02e64b36e44bcd157bbf1",
- "sha256:9d80f44137a70b6f84c750d11019a3419f409c944526a95219bea0ac31f4dd91",
- "sha256:b7ebd36128a2fe93991293f997e44be9286503c7530ace6a55b938b20be288d8",
- "sha256:c4c78e2c71c257c136cdd43869fd3d5e34fc2162dc22e4a5406b0ebe86958239",
- "sha256:c6a842537f887be1fe115d8abb5daa9bc8cc124e455ff995830cc785624a97af",
- "sha256:cf0a2e040fdf5a6d95f4c286c6ef1df6b36c218b528c8a9158ec2452a804b9b8",
- "sha256:cfd28aad6fc61f7a5d4ee556a997dc6e5555d9381d1390c00ecaf984d57e4232",
- "sha256:dca5660e25932771460d4688ccbb515677caaf8595f3f3240ec16c117deff89a",
- "sha256:de7aedc85918c2f887886442e50f52c1b93545606317956d65f342bd81cb4fc3",
- "sha256:e6c0bbf8e277b74196e3140c35f9a1ae3eafd818f7f2d3a15819c49135d6c062"
- ],
- "version": "==6.0.0"
- },
- "pprofile": {
- "hashes": [
- "sha256:3469102f462f9fc2d889970afcf73d89c0d89a36c49a4c262c3edc302b4a22da"
- ],
- "index": "pypi",
- "version": "==2.0.2"
- },
- "progressbar2": {
- "hashes": [
- "sha256:9ecb2d35edaa30ed86eb92fb0135eb19a6ef9b3657be4350cc3d0d3563e6af65",
- "sha256:c086fc1f718839c0ec95caaeb7bd5a1d0268a8775960b8f9dee06f2a04c84628"
- ],
- "version": "==3.42.0"
- },
- "prometheus-client": {
- "hashes": [
- "sha256:ee0c90350595e4a9f36591f291e6f9933246ea67d7cd7d1d6139a9781b14eaae"
- ],
- "version": "==0.7.0"
- },
- "prompt-toolkit": {
- "hashes": [
- "sha256:1e71341526efa4b11bb44d323e687a5d9cef204aabe2907e3f0dc1534cda0ecc",
- "sha256:955d81315bb7a049f19cd17d1a73f1a40861483260f7dffd825e98303a8bd6b6",
- "sha256:c1cedd626e08b8ee830ee65897de754113ff3f3035880030c08b01674d85c5b4"
- ],
- "version": "==1.0.16"
- },
- "protobuf": {
- "hashes": [
- "sha256:03f43eac9d5b651f976e91cf46a25b75e5779d98f0f4114b0abfed83376d75f8",
- "sha256:0c94b21e6de01362f91a86b372555d22a60b59708599ca9d5032ae9fdf8e3538",
- "sha256:2d2a9f30f61f4063fadd7fb68a2510a6939b43c0d6ceeec5c4704f22225da28e",
- "sha256:34a0b05fca061e4abb77dd180209f68d8637115ff319f51e28a6a9382d69853a",
- "sha256:358710fd0db25372edcf1150fa691f48376a134a6c69ce29f38f185eea7699e6",
- "sha256:41e47198b94c27ba05a08b4a95160656105745c462af574e4bcb0807164065c0",
- "sha256:8c61cc8a76e9d381c665aecc5105fa0f1878cf7db8b5cd17202603bcb386d0fc",
- "sha256:a6eebc4db759e58fdac02efcd3028b811effac881d8a5bad1996e4e8ee6acb47",
- "sha256:a9c12f7c98093da0a46ba76ec40ace725daa1ac4038c41e4b1466afb5c45bb01",
- "sha256:cb95068492ba0859b8c9e61fa8ba206a83c64e5d0916fb4543700b2e2b214115",
- "sha256:cd98476ce7bb4dcd6a7b101f5eecdc073dafea19f311e36eb8fba1a349346277",
- "sha256:ce64cfbea18c535176bdaa10ba740c0fc4c6d998a3f511c17bedb0ae4b3b167c",
- "sha256:dcbb59eac73fd454e8f2c5fba9e3d3320fd4707ed6a9d3ea3717924a6f0903ea",
- "sha256:dd67f34458ae716029e2a71ede998e9092493b62a519236ca52e3c5202096c87",
- "sha256:e3c96056eb5b7284a20e256cb0bf783c8f36ad82a4ae5434a7b7cd02384144a7",
- "sha256:f612d584d7a27e2f39e7b17878430a959c1bc09a74ba09db096b468558e5e126",
- "sha256:f6de8a7d6122297b81566e5bd4df37fd5d62bec14f8f90ebff8ede1c9726cd0a",
- "sha256:fa529d9261682b24c2aaa683667253175c9acebe0a31105394b221090da75832"
- ],
- "version": "==3.8.0"
- },
- "psutil": {
- "hashes": [
- "sha256:028a1ec3c6197eadd11e7b46e8cc2f0720dc18ac6d7aabdb8e8c0d6c9704f000",
- "sha256:503e4b20fa9d3342bcf58191bbc20a4a5ef79ca7df8972e6197cc14c5513e73d",
- "sha256:863a85c1c0a5103a12c05a35e59d336e1d665747e531256e061213e2e90f63f3",
- "sha256:954f782608bfef9ae9f78e660e065bd8ffcfaea780f9f2c8a133bb7cb9e826d7",
- "sha256:b6e08f965a305cd84c2d07409bc16fbef4417d67b70c53b299116c5b895e3f45",
- "sha256:bc96d437dfbb8865fc8828cf363450001cb04056bbdcdd6fc152c436c8a74c61",
- "sha256:cf49178021075d47c61c03c0229ac0c60d5e2830f8cab19e2d88e579b18cdb76",
- "sha256:d5350cb66690915d60f8b233180f1e49938756fb2d501c93c44f8fb5b970cc63",
- "sha256:eba238cf1989dfff7d483c029acb0ac4fcbfc15de295d682901f0e2497e6781a"
- ],
- "index": "pypi",
- "version": "==5.6.3"
- },
- "ptyprocess": {
- "hashes": [
- "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0",
- "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"
- ],
- "markers": "os_name != 'nt'",
- "version": "==0.6.0"
- },
- "pycocotools": {
- "git": "https://github.com/cocodataset/cocoapi.git",
- "ref": "aca78bcd6b4345d25405a64fdba1120dfa5da1ab",
- "subdirectory": "PythonAPI"
- },
- "pycparser": {
- "hashes": [
- "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
- ],
- "version": "==2.19"
- },
- "pycurl": {
- "hashes": [
- "sha256:0f0cdfc7a92d4f2a5c44226162434e34f7d6967d3af416a6f1448649c09a25a4",
- "sha256:10510a0016c862af467c6e069e051409f15f5831552bed03f5104b395a5d7dd1",
- "sha256:208dd2c89e80d32a69397ba8a5cdb3bc0dc60f961a4f2a9662e5e1624dc799d1",
- "sha256:6dc6ee5e7628400083471cba8044010860fe8b22e4dee05e42150a68047d7d9d",
- "sha256:794bda39ea6fe434b6e1f58ab3bea9f0e6123fb43702fecd760eed6f1547b20a",
- "sha256:dae7277e7c06da00947f3cd32c095b1e65eae09f07478ada4ea9dfa57020b646",
- "sha256:eccea049aef47decc380746b3ff242d95636d578c907d0eab3b00918292d6c48"
- ],
- "index": "pypi",
- "version": "==7.43.0.2"
- },
- "pygame": {
- "hashes": [
- "sha256:0480fe82cd41a43e3eea497fa2c059c72ac54cb5d003d5aa2ed06a04541c384e",
- "sha256:136a3b5711d9ec369a0407e4e08ffced3ba61aa41059e9280ffffa79c8614f65",
- "sha256:2622b9dd95f445c887a36a57eade42c672598589f69a8052ccdb8eeeffa4dbb1",
- "sha256:301c6428c0880ecd4a9e3951b80e539c33863b6ff356a443db1758de4f297957",
- "sha256:398c42b605ecc514e62f68f1944a2d21e247938309f598de6cb0ad3c207324a8",
- "sha256:4aaff572a273a32e70ec3593d213e59ab11c183a9916616562247930f17a5447",
- "sha256:4e1065577f1b29111113be5deb2ea88553551a5e1cf33e0c08fa32768f285809",
- "sha256:5f052dc2975a399aa1830c1f04c5f72856aa416bf3cd4b31375a058015a5c620",
- "sha256:68ea43e51150316b9fb08e251209d4e2b4e76a340b5b6fc8cdf1a898c78f7e5b",
- "sha256:698433a9fcefca0527244dc44dff9503eb26157494730b1cc80e6e4dbb246e92",
- "sha256:6f714986f7987f10cb94f1be0753318e341a7ea6b12d66f37a4d5d6dd4695023",
- "sha256:73cd9df328c7e72638dbcc1d18e7155225faed880a53db6bad90d1d7c0a71dfd",
- "sha256:7876d1f29f66d3d7cac46479503891ee1ef409b0fbce54b0d74f3a6b33a46dba",
- "sha256:854e87b8b2b76e3ed11d64985fcfdd7af919659503de99fc2b0a717b314c3cf0",
- "sha256:8da13704ad45b7d5de8a8cca135a7f44c7fc6aa9f691abe7b0392468a34a8013",
- "sha256:9ce22fb72298ea33dbb3a1c6c60a4a4e19d9698df6f3f5782eba4dada7b7736d",
- "sha256:a37b6c59e7b8feadc51db5197052b86ceb6443f9fb2a6f7d6527620e707c558c",
- "sha256:a6e8d2f99dbe1dfe72d0c019693c14d93c410f702d0b04ec9a81b36dacd55a23",
- "sha256:a9ac862dd7159861f2c6443b0029089e1c0c4ec762a8074022914ec52fe4dfac",
- "sha256:ae1bc3e78ed28f20878e7ca2c98663a6634e9c00d7746d39413fc18e907dc162",
- "sha256:be7e70f91bd4eb35ae081062f16bf434619b3292358d9b061f8159ddc570c7f0",
- "sha256:c895cf9c1b6d1cbba8cb8cc3f5427febcf8aa41a9333697741abeea1c537a350",
- "sha256:f1f5714d2c23f6a64ef2ac4fcd36a2dd2689da85978d951a99a6ae5dfdf9bdbc",
- "sha256:fa788f775680fc5d268ab00a2da29c9a22830032cfab732730298a2952cd87f3"
- ],
- "index": "pypi",
- "version": "==1.9.6"
- },
- "pygments": {
- "hashes": [
- "sha256:71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127",
- "sha256:881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297"
- ],
- "index": "pypi",
- "version": "==2.4.2"
- },
- "pyjwt": {
- "hashes": [
- "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e",
- "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"
- ],
- "index": "pypi",
- "version": "==1.7.1"
- },
- "pylint": {
- "hashes": [
- "sha256:02c2b6d268695a8b64ad61847f92e611e6afcff33fd26c3a2125370c4662905d",
- "sha256:ee1e85575587c5b58ddafa25e1c1b01691ef172e139fc25585e5d3f02451da93"
- ],
- "index": "pypi",
- "version": "==1.9.4"
- },
- "pymongo": {
- "hashes": [
- "sha256:32421df60d06f479d71b6b539642e410ece3006e8910688e68df962c8eb40a21",
- "sha256:324b22a8443e11faca44c96b20e7ec8a9e59a1e664457edeeb4f796080b31cde",
- "sha256:4505ff8b7923dd7a8bed1bf25c9c4d0df5ab0b8b2821f2296533f2149a55f401",
- "sha256:460b224681ea711e48e3638d15be2249024031b7dcb9622ba19c2e85bd5a26cc",
- "sha256:47473b70c5f3cd5ddd2c49ab3b9ceafdafbbed5bc963f147df22a9343d7978f5",
- "sha256:49375839af76834e9c5c3cc78c78386873fd0b2ad9a0860a7dc4ec9fe73af9dd",
- "sha256:4a65f0f71ece86c860d30a1436b646db8ea32aec518845ef2903ca569faec32e",
- "sha256:530621906c5dd6d27305b39c4e017701e5f4299aa68b93cde70eb985f94ca26f",
- "sha256:54f4770b5810e8dc3cbeed675874195f02bb2bc4e95a9d665068edfb3baff4f7",
- "sha256:5ed9382410e938b0ff76041c34018210504729a83bcf4f6a70c7092c28169f6f",
- "sha256:61cad83637ae12c1c825130d7f9325cd6c162e3a64e8747a8144866020be3ff4",
- "sha256:61e8e1c58b4fdf47ab79b7c7db8bb022c1e40b3b5fcbbaeea5fc94dc5c75638d",
- "sha256:6e04e496af7d156b66cce70460011c621ecbadf5dcdce325c7acbb3cd6ea245d",
- "sha256:7ef89ec435e89da902451dde6845066fe2770befaf0301fe2a1ac426b51fced3",
- "sha256:854e8425e5eb775ccfffad04ecd094c99923d60a2c2d49babb5c435e836a91fa",
- "sha256:9569796d48498e4db4e1d56284b626a8ed15f641ce3a8b2085f06bb03f4c2c88",
- "sha256:9d50c99c6388863cbfdc5db9bad62e3a7c2e5fc151554a07c7f3c2530334a34f",
- "sha256:9ea016c2c011df21f77c1f806ce45129a344ba2d414bd50f9e065b13a4a134be",
- "sha256:a8421f0823174888fb12a5fa675322e756499d71e77ff712b4412d4b8f3c6503",
- "sha256:aef7d88384ada699976350a285c7a333f96ebc959e98e7d2c98589f47bbf3b7f",
- "sha256:b4d7ff9957ee770cf03bd7156a68a2f2e838e60712d9608eadc8741c15d01e72",
- "sha256:c1db85c39e6a60588f855dbc7bd68fb0dab796096148ab5aa4abecaff19e1c6e",
- "sha256:cee2fc0b94e66e7230da12fc4b3d34793c49957e16ee04f6468a94e264a1e41d",
- "sha256:cf1dea28379a16b23e47db312883f07b3ba8d9d6abc1c59e51d4c8ae1820ab43",
- "sha256:d1cd175df7c8b5fc976bade78bf4d9fb5aa7ab465c0f59931e380bbe188ef8fc",
- "sha256:d48a94edf3cdd34524936a72ea01b352682b337f33a42db10ba29a96c37147d3",
- "sha256:d9cc103a4e97f78bc77a1d72759ab3722f6cdf0374ad4fb4b0c53bd3238bdf98",
- "sha256:fcb9ae8aa9158106c5d98a4349ec0d90b68f052d620b2d24622ba03b91e4d81d"
- ],
- "index": "pypi",
- "version": "==3.8.0"
- },
- "pymysql": {
- "hashes": [
- "sha256:95f057328357e0e13a30e67857a8c694878b0175797a9a203ee7adbfb9b1ec5f",
- "sha256:9ec760cbb251c158c19d6c88c17ca00a8632bac713890e465b2be01fdc30713f"
- ],
- "index": "pypi",
- "version": "==0.9.2"
- },
- "pynacl": {
- "hashes": [
- "sha256:05c26f93964373fc0abe332676cb6735f0ecad27711035b9472751faa8521255",
- "sha256:0c6100edd16fefd1557da078c7a31e7b7d7a52ce39fdca2bec29d4f7b6e7600c",
- "sha256:0d0a8171a68edf51add1e73d2159c4bc19fc0718e79dec51166e940856c2f28e",
- "sha256:1c780712b206317a746ace34c209b8c29dbfd841dfbc02aa27f2084dd3db77ae",
- "sha256:2424c8b9f41aa65bbdbd7a64e73a7450ebb4aa9ddedc6a081e7afcc4c97f7621",
- "sha256:2d23c04e8d709444220557ae48ed01f3f1086439f12dbf11976e849a4926db56",
- "sha256:30f36a9c70450c7878053fa1344aca0145fd47d845270b43a7ee9192a051bf39",
- "sha256:37aa336a317209f1bb099ad177fef0da45be36a2aa664507c5d72015f956c310",
- "sha256:4943decfc5b905748f0756fdd99d4f9498d7064815c4cf3643820c9028b711d1",
- "sha256:57ef38a65056e7800859e5ba9e6091053cd06e1038983016effaffe0efcd594a",
- "sha256:5bd61e9b44c543016ce1f6aef48606280e45f892a928ca7068fba30021e9b786",
- "sha256:6482d3017a0c0327a49dddc8bd1074cc730d45db2ccb09c3bac1f8f32d1eb61b",
- "sha256:7d3ce02c0784b7cbcc771a2da6ea51f87e8716004512493a2b69016326301c3b",
- "sha256:a14e499c0f5955dcc3991f785f3f8e2130ed504fa3a7f44009ff458ad6bdd17f",
- "sha256:a39f54ccbcd2757d1d63b0ec00a00980c0b382c62865b61a505163943624ab20",
- "sha256:aabb0c5232910a20eec8563503c153a8e78bbf5459490c49ab31f6adf3f3a415",
- "sha256:bd4ecb473a96ad0f90c20acba4f0bf0df91a4e03a1f4dd6a4bdc9ca75aa3a715",
- "sha256:e2da3c13307eac601f3de04887624939aca8ee3c9488a0bb0eca4fb9401fc6b1",
- "sha256:f67814c38162f4deb31f68d590771a29d5ae3b1bd64b75cf232308e5c74777e0"
- ],
- "index": "pypi",
- "version": "==1.3.0"
- },
- "pynmea2": {
- "hashes": [
- "sha256:8b83fa7e3e668af5e182ef1c2fd4a535433ecadf60d7b627280172d695a1646b",
- "sha256:fe786594299588d1bfbd346ece2c2c1e5b24e160dcb740813c34bfa70d0a141d"
- ],
- "index": "pypi",
- "version": "==1.15.0"
- },
- "pyparsing": {
- "hashes": [
- "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a",
- "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03"
- ],
- "version": "==2.4.0"
- },
- "pypolyline": {
- "hashes": [
- "sha256:09cc2192bc12063c7afa2d2718b739cd4bf3f8ec29eacde0cb728c9f5f7f7858",
- "sha256:21acee0e31d867bde04583907ccb7afe4b21d33a63c23adc7cf0d82b6f2feab3",
- "sha256:5e0643454b4471f4f23d38530467ee7093d3b375898d5e1b054876e5a50a6b89",
- "sha256:6b0a1b573fe84c9ed0aa3a4eb9903d44864f37e405cdcc7396b61e6d00a937d6",
- "sha256:6bdbc9210f29d4fd44c3e4d510ffcc1276e46a50d63365831e2e422dc0b3cb43",
- "sha256:8efb93097c92c5894dcaf9e784b888f9426d170ae51d62164341bbb2b832c09a",
- "sha256:9c843a35b2d02b04c1226db851834b55f0de30eef47ba057fd6f8623cdef6f2d",
- "sha256:ad01fedf427536f391776b329c95e5f80f2b1a5d25c54ea7713c8cdb56947106",
- "sha256:e4e4c857790f6a3067dab3ae661edda99d5cee55d107b3b4d0186159431165ef",
- "sha256:f8c84f0d2aa6bd9ed14bdb671fab80f79b4ba93b4347b530ae4d3b56a3fb269a"
- ],
- "index": "pypi",
- "version": "==0.1.17"
- },
- "pyrsistent": {
- "hashes": [
- "sha256:16692ee739d42cf5e39cef8d27649a8c1fdb7aa99887098f1460057c5eb75c3a"
- ],
- "version": "==0.15.2"
- },
- "pysdl2": {
- "hashes": [
- "sha256:b52acab5493a77b08c2afee1f385769fc2005f17cfeaf1886eff22dc78da2123"
- ],
- "index": "pypi",
- "version": "==0.9.6"
- },
- "pysendfile": {
- "hashes": [
- "sha256:510a414b270986fba3c79cb76d90a4c910c701bfb43ff983a5d4e92846050e17"
- ],
- "index": "pypi",
- "version": "==2.0.1"
- },
- "python-dateutil": {
- "hashes": [
- "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
- "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
- ],
- "index": "pypi",
- "version": "==2.8.0"
- },
- "python-engineio": {
- "hashes": [
- "sha256:9e4e7109d05d80ce5414f13b16f66725c2b5d574099fd43d37b024e7ea1c4354",
- "sha256:d3315d3f972bd9bd32e0738d45801a912f522177ff75094762f31a8c341d1f41"
- ],
- "version": "==3.8.1"
- },
- "python-logstash": {
- "hashes": [
- "sha256:10943e5df83f592b4d61b63ad1afff855ccc8c9467f78718f0a59809ba1fe68c"
- ],
- "index": "pypi",
- "version": "==0.4.6"
- },
- "python-socketio": {
- "hashes": [
- "sha256:89a48591a8850c1f30d735f8e5a0294846da245a9b8940c39e1106e460c7a14e",
- "sha256:c7ffeac3d81f2d8d63b3ec7ed1e2d4478cc84aa1da666c1934c19432f4b8c0f8"
- ],
- "version": "==4.1.0"
- },
- "python-utils": {
- "hashes": [
- "sha256:34aaf26b39b0b86628008f2ae0ac001b30e7986a8d303b61e1357dfcdad4f6d3",
- "sha256:e25f840564554eaded56eaa395bca507b0b9e9f0ae5ecb13a8cb785305c56d25"
- ],
- "version": "==2.3.0"
- },
- "pytz": {
- "hashes": [
- "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda",
- "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141"
- ],
- "version": "==2019.1"
- },
- "pyvcd": {
- "hashes": [
- "sha256:791fd7608fb8113c9658f699cb6292d66d7fb90bcab9ebc00b05adc40da7a5ce",
- "sha256:bdcb848b79cea2196ebf317178eff2c9c7d6354b85f9eb4991e9175f98e26937"
- ],
- "index": "pypi",
- "version": "==0.1.4"
- },
- "pywavelets": {
- "hashes": [
- "sha256:18b193b67937e805a8e79c036bd2aa4ea3a357737256efeefdabd19c95083c3b",
- "sha256:1d7ba03baa81938b17d4819db36f018e680d929af329062af4d4b6d6236d02ba",
- "sha256:21f39d86cc35e003576fc1400b15534e2999570418fcdb17ea62d1ff8773b076",
- "sha256:250412f482d5cb358b7ec323b2a783d91e5cfc337fdf8fde3c59bf2c35d6366f",
- "sha256:25c0c592bf43eaffb4d3c6b6444b14c7407db750b6f2d344d809d4af934319d9",
- "sha256:2f2cdd96e4882b0c18e75cc90c4710de429ac226ce53b58a90c7420e3e307631",
- "sha256:3abed8dcd3e94ead72ee8010b494df5a9bdbdd5e39129d52fbf8066efa323a51",
- "sha256:3e99ab8feeb47755738fb8deb8154c9604c4a7996b1b7db6b090475105ca7c92",
- "sha256:64926c4c78dd690ec0d61be20f7c27cfbde6de9fa66ab8205eb079d9db6927fc",
- "sha256:687ec8877c10e3a03595ad167d1ea2662bc1ab13ef43d63a6e207a53b2ee4c26",
- "sha256:6af0077c7a4c9935aa64301f6942468b494656b8812e801d4a635cf42088f96c",
- "sha256:7215856a5d2e1a2dccca1f71d912ee6a7387086f3b3adcb55d7c41314c6abb0c",
- "sha256:9e47b241533add77961093b1e40cfff031597d429e91ad7c675838be0f7cc0df",
- "sha256:9e782f49dca57bc0fd2a40c0917949d77be2ecc999ccd44fff57fb10aa214135",
- "sha256:a12c7a6258c0015d2c75d88b87393ee015494551f049009e8b63eafed2d78efc",
- "sha256:a5027d47484498e70391b311a2688c4f74294de629b982ed17be57be4c77ade7",
- "sha256:ab02363467ee3cb222c5b425bc53453270ddae72bce313e72fd14616692d725a",
- "sha256:adc79308c65a2007bdbd5846fda70088e7ead0ef0a5a6f44d08829e9478a907f",
- "sha256:afaaee392450785a346d9e5e5f6e5307b13958d8b0633818632cb38972a7752a",
- "sha256:b26b836c7f71df7b2779e62d1338367cfe37b98324e9b0d54b428ac030e3d1f0",
- "sha256:b9adbc27d70a2626c235a18b41315de2832c384651d03383db7a58c2a2bccc6f",
- "sha256:bd6e62efb7839fd6bf894b7b9aec6d58be0c44a38ea0c9f3c5bea834d84d05eb",
- "sha256:de083a3a71576a9c3d8ba73b6f0425e4690d6ac6e480562f30bec5cb20667324",
- "sha256:e89551257233a3da717a9e6e2e303243df75faffe0b6781d21c15eb9d682ec6d",
- "sha256:eafb7d609c41a04028144f4b6697792f448554960ef353244aaf0a5883263543",
- "sha256:fb3ee9f65d25ee5c89104e533d5f341c253cdb9543ef6fcd6dfa599b12e84f1c"
- ],
- "version": "==1.0.3"
- },
- "pyyaml": {
- "hashes": [
- "sha256:57acc1d8533cbe51f6662a55434f0dbecfa2b9eaf115bede8f6fd00115a0c0d3",
- "sha256:588c94b3d16b76cfed8e0be54932e5729cc185caffaa5a451e7ad2f7ed8b4043",
- "sha256:68c8dd247f29f9a0d09375c9c6b8fdc64b60810ebf07ba4cdd64ceee3a58c7b7",
- "sha256:70d9818f1c9cd5c48bb87804f2efc8692f1023dac7f1a1a5c61d454043c1d265",
- "sha256:86a93cccd50f8c125286e637328ff4eef108400dd7089b46a7be3445eecfa391",
- "sha256:a0f329125a926876f647c9fa0ef32801587a12328b4a3c741270464e3e4fa778",
- "sha256:a3c252ab0fa1bb0d5a3f6449a4826732f3eb6c0270925548cac342bc9b22c225",
- "sha256:b4bb4d3f5e232425e25dda21c070ce05168a786ac9eda43768ab7f3ac2770955",
- "sha256:cd0618c5ba5bda5f4039b9398bb7fb6a317bb8298218c3de25c47c4740e4b95e",
- "sha256:ceacb9e5f8474dcf45b940578591c7f3d960e82f926c707788a570b51ba59190",
- "sha256:fe6a88094b64132c4bb3b631412e90032e8cfe9745a58370462240b8cb7553cd"
- ],
- "index": "pypi",
- "version": "==5.1.1"
- },
- "pyzmq": {
- "hashes": [
- "sha256:1651e52ed91f0736afd6d94ef9f3259b5534ce8beddb054f3d5ca989c4ef7c4f",
- "sha256:5ccb9b3d4cd20c000a9b75689d5add8cd3bce67fcbd0f8ae1b59345247d803af",
- "sha256:5e120c4cd3872e332fb35d255ad5998ebcee32ace4387b1b337416b6b90436c7",
- "sha256:5e2a3707c69a7281a9957f83718815fd74698cba31f6d69f9ed359921f662221",
- "sha256:63d51add9af8d0442dc90f916baf98fdc04e3b0a32afec4bfc83f8d85e72959f",
- "sha256:65c5a0bdc49e20f7d6b03a661f71e2fda7a99c51270cafe71598146d09810d0d",
- "sha256:66828fabe911aa545d919028441a585edb7c9c77969a5fea6722ef6e6ece38ab",
- "sha256:7d79427e82d9dad6e9b47c0b3e7ae5f9d489b1601e3a36ea629bb49501a4daf3",
- "sha256:824ee5d3078c4eae737ffc500fbf32f2b14e6ec89b26b435b7834febd70120cf",
- "sha256:89dc0a83cccec19ff3c62c091e43e66e0183d1e6b4658c16ee4e659518131494",
- "sha256:8b319805f6f7c907b101c864c3ca6cefc9db8ce0791356f180b1b644c7347e4c",
- "sha256:90facfb379ab47f94b19519c1ecc8ec8d10813b69d9c163117944948bdec5d15",
- "sha256:a0a178c7420021fc0730180a914a4b4b3092ce9696ceb8e72d0f60f8ce1655dd",
- "sha256:a7a89591ae315baccb8072f216614b3e59aed7385aef4393a6c741783d6ee9cf",
- "sha256:ba2578f0ae582452c02ed9fac2dc477b08e80ce05d2c0885becf5fff6651ccb0",
- "sha256:c69b0055c55702f5b0b6b354133e8325b9a56dbc80e1be2d240bead253fb9825",
- "sha256:ca434e1858fe222380221ddeb81e86f45522773344c9da63c311d17161df5e06",
- "sha256:d4b8ecfc3d92f114f04d5c40f60a65e5196198b827503341521dda12d8b14939",
- "sha256:d706025c47b09a54f005953ebe206f6d07a22516776faa4f509aaff681cc5468",
- "sha256:d8f27e958f8a2c0c8ffd4d8855c3ce8ac3fa1e105f0491ce31729aa2b3229740",
- "sha256:dbd264298f76b9060ce537008eb989317ca787c857e23cbd1b3ddf89f190a9b1",
- "sha256:e926d66f0df8fdbf03ba20583af0f215e475c667fb033d45fd031c66c63e34c9",
- "sha256:efc3bd48237f973a749f7312f68062f1b4ca5c2032a0673ca3ea8e46aa77187b",
- "sha256:f59bc782228777cbfe04555707a9c56d269c787ed25d6d28ed9d0fbb41cb1ad2",
- "sha256:f8da5322f4ff5f667a0d5a27e871b560c6637153c81e318b35cb012b2a98835c"
- ],
- "index": "pypi",
- "version": "==18.0.1"
- },
- "qtconsole": {
- "hashes": [
- "sha256:4af84facdd6f00a6b9b2927255f717bb23ae4b7a20ba1d9ef0a5a5a8dbe01ae2",
- "sha256:60d61d93f7d67ba2b265c6d599d413ffec21202fec999a952f658ff3a73d252b"
- ],
- "version": "==4.5.1"
- },
- "redis": {
- "hashes": [
- "sha256:6946b5dca72e86103edc8033019cc3814c031232d339d5f4533b02ea85685175",
- "sha256:8ca418d2ddca1b1a850afa1680a7d2fd1f3322739271de4b704e0d4668449273"
- ],
- "index": "pypi",
- "version": "==3.2.1"
- },
- "redlock": {
- "hashes": [
- "sha256:b718646239d300745475a76e81d350ec523e7146cf84d696b3c4a7dfdd5dd4d4",
- "sha256:ce7e6ab404882b64a9c5017c7a78b1a3714f2c712635bcb22cbb74d20719bbd1"
- ],
- "index": "pypi",
- "version": "==1.2.0"
- },
- "requests": {
- "hashes": [
- "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4",
- "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"
- ],
- "index": "pypi",
- "version": "==2.22.0"
- },
- "requests-oauthlib": {
- "hashes": [
- "sha256:bd6533330e8748e94bf0b214775fed487d309b8b8fe823dc45641ebcd9a32f57",
- "sha256:d3ed0c8f2e3bbc6b344fa63d6f933745ab394469da38db16bdddb461c7e25140"
- ],
- "version": "==1.2.0"
- },
- "reverse-geocoder": {
- "hashes": [
- "sha256:2a2e781b5f69376d922b78fe8978f1350c84fce0ddb07e02c834ecf98b57c75c"
- ],
- "index": "pypi",
- "version": "==1.5.1"
- },
- "s2sphere": {
- "hashes": [
- "sha256:c2478c1ff7c601a59a7151a57b605435897514578fa6bdb8730721c182adbbaf",
- "sha256:d2340c9cf458ddc9a89afd1d8048a4195ce6fa6b0095ab900d4be5271e537401"
- ],
- "index": "pypi",
- "version": "==0.2.5"
- },
- "s3transfer": {
- "hashes": [
- "sha256:6efc926738a3cd576c2a79725fed9afde92378aa5c6a957e3af010cb019fac9d",
- "sha256:b780f2411b824cb541dbcd2c713d0cb61c7d1bcadae204cdddda2b35cef493ba"
- ],
- "version": "==0.2.1"
- },
- "scandir": {
- "hashes": [
- "sha256:2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e",
- "sha256:2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022",
- "sha256:2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f",
- "sha256:2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f",
- "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae",
- "sha256:67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173",
- "sha256:7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4",
- "sha256:8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32",
- "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188",
- "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d",
- "sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac"
- ],
- "markers": "python_version < '3.5'",
- "version": "==1.10.0"
- },
- "scikit-image": {
- "hashes": [
- "sha256:056632aa964528c484758829d295f11c86a405aa0294f2578eac4acd945d4300",
- "sha256:1600628c96b76f265dede2393115f77d93a427c617202622dfd6ba27e075efcc",
- "sha256:1e85573ed37e0205ea918475c1fbd12e6c118c6f1e166dd159af04bcd9d4fa30",
- "sha256:1fc4a596d6b7295bd05dce3df1105d1c7c7abe9c65f5d3ced2eace1cd746c15e",
- "sha256:24ebe2a9cf40f2196393bc575345bc514bc845366545361785696a76e3aeb89b",
- "sha256:331ee6db27e434e467831e21c8489bec23038ede790c53e0b6040e1e638fff45",
- "sha256:4c17f2919029bd68907e2bf80dfecfb8b601bee4f392ef01f835ba4aa8c616e9",
- "sha256:4e59c25be3e9760ba181832b9b33e27ff3cea9c362842260ac06644ae08b23c8",
- "sha256:4f12cdf72155f77b736902e87c6b4544e311241070e9548c03ac0fcf9aa0bbed",
- "sha256:62718e67f1f058501055c7e6b7206eea96f792039ea4c87af8e6b706a22ae11e",
- "sha256:6b88c64f8351f1755ccc7feec26a7e55359acba2375498409fa1380bd3789b6f",
- "sha256:755ee87e4b0332fd1645c67fd1e5780908937f35d28a6bd3377af304fd54a8d9",
- "sha256:8508b9a2fccaa52a30785316ae4b29aaf339ef8fc3dab1bb35d36468397e0b0d",
- "sha256:8541cefddad87b08105583e946132e822b196fff437f407afa92742e1e763387",
- "sha256:8d76474ad59e5339584a9c4317868e51c0fbf2c2d11a936e836279fc281633d6",
- "sha256:b26462abeee13ee249c814723a3038ccd74af2144349422d1b344e1378f9f702",
- "sha256:b7b5605c7737073c1bdffbfea1f6a257dd6e96ab109fc37f43a7bd3d1d581e2a",
- "sha256:c7afc4231e9bb9d0d2b44958e6e403117e6823bb16bca61ab95540e737f2941f",
- "sha256:cc97cfc239f1f7ee8cc5129e3cb29fe553237fa62380b62d6f7c0909974d1400",
- "sha256:ce114f536941348998665360ea6fbbf1577a3c49a5c2b4d416c71d3edde05ab7",
- "sha256:db9f4fb00db5ce5855737c22abbdc22d9663d44643cbdad674e2c9fc32ba9c16",
- "sha256:e312e914d6f97e525460268cd0d215cd9c9c4fe131457316bd32c6c760171660",
- "sha256:e50d053133c292efe0e70eefc6a6481002b32d7b4b72ef38bd7caae6b24fb7d6",
- "sha256:ef3fb33404fbf1717e3d268e1cc0983264fc3154036b29950fbc9c3fbed98ee3",
- "sha256:f05eab2df885fb6fde3df0e4d24c9c620d6474ea0eb949fd45f6f634925dd514",
- "sha256:fb1de3dabbc7a429b38a016d01502920226b59d277578291fb18a28888ed5792"
- ],
- "index": "pypi",
- "version": "==0.14.3"
- },
- "scipy": {
- "hashes": [
- "sha256:0bcababa06ff83138a7f30a68f334dee034ce1cc7604f9278b96f62265fe7fd7",
- "sha256:162b803984ebb76927990d7233cab825d146be8e2a3f6a0efb1b3a61ebacae73",
- "sha256:271c6e56c8f9a3d6c3f0bc857d7a6e7cf7a8415c879a3915701cd011e82a83a3",
- "sha256:2eb255b30dac7516c6f3c5237f2e0ad1f1213b5364de409d932249c9a8c5bffb",
- "sha256:447c40d33ec5e0020750fadbb8599220b9eb9fd8798030efe9b308247800f364",
- "sha256:4686d699f76068757a81269f1a111c0db689bf048a56b131a339803121534fa8",
- "sha256:47d4623efa71948dc4a92f978fbf6b9fb69dac5b0f0fae4c1a1f3d955ac8aea9",
- "sha256:49dcebc6f57bce0bd23cb55dbc6144f4990e5cbce9aab3128af03d6b1b4eab6a",
- "sha256:5fa84b467b5f77c243c5701628ed7a4238e53bc4120db87be7dafa416e842fb9",
- "sha256:67d2210c7f6f585e1055bee3dc9f15610b5ebb04e80bfaa757868937ee744fec",
- "sha256:682b210ff7a65f6f5245fdf73d26a348b57e42d2059bc5fcf7ed25d063f35c45",
- "sha256:7f58faa422aa493d7b70dd56d6e8783223e84dd6e7f4b4161bd776b39ecbac92",
- "sha256:7fb4efff9895116428ad65564d2232fb1cac4b9d84398512a858b09dd4a7fd59",
- "sha256:922e2370674c82dd1367fc13a08c8765f4e5281a584d871e7cb454828d84600f",
- "sha256:97f26b4b5d4456f44849fd35cad8801f7cae4e64b75fc4e522d26a54aef17391",
- "sha256:9a21d64d002cb3a9239a55c0aa100b48d58b5e38382c0fdfcdfc68cf417d8142",
- "sha256:a4331e0b8dab1ff75d2c67b5158a8bb9a83c799d7140094dda936d876c7cfbb1",
- "sha256:a9fc1fcaa560edf771d4545d7e6dd865a213fc5b485bb127de5dfd32f40094e1",
- "sha256:b074a83299a82eae617dc46a830cfa7aaa588d07523990507848ee1ded3c52ce",
- "sha256:bcd0d4b2de5cb3fab69007214a39737e917267f56f887ce9c7732ba3278fc33d",
- "sha256:c390f1721757ec983616149f00e1bd0432aa32d2c1d9398930d7e7cc9542c922",
- "sha256:c5b9db9e3f6537bf7b308de12c185b27f22fb9a66fd12efc7aefbcfa0adb4d82",
- "sha256:d0d41a9ee3264f95820138170b447f5d3e453e5ebd10b411bca37c99237aac69",
- "sha256:d18d1575d4a54f128c0f34422bd73ce0f177e462d6124f074388e211d8dc2616",
- "sha256:e99cd49daffe7384fd35046c3b14bee98ce87d97c95865469227001905534e13",
- "sha256:f4e355afa8fdda11010de308c2376edda29e064cec699974097364115f71e16f",
- "sha256:f64e29a8b32d672fb6078f456bfff3cae8f36b6c8b64c337ad0942f29404b03f",
- "sha256:fbdff021643c2dfa35efd29218e0318c4b4987f48ea432be7e8c02bdb1b0c314"
- ],
- "index": "pypi",
- "version": "==1.2.2"
- },
- "send2trash": {
- "hashes": [
- "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2",
- "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"
- ],
- "version": "==1.5.0"
- },
- "shapely": {
- "hashes": [
- "sha256:0378964902f89b8dbc332e5bdfa08e0bc2f7ab39fecaeb17fbb2a7699a44fe71",
- "sha256:34e7c6f41fb27906ccdf2514ee44a5774b90b39a256b6511a6a57d11ffe64999",
- "sha256:3ca69d4b12e2b05b549465822744b6a3a1095d8488cc27b2728a06d3c07d0eee",
- "sha256:3e9388f29bd81fcd4fa5c35125e1fbd4975ee36971a87a90c093f032d0e9de24",
- "sha256:3ef28e3f20a1c37f5b99ea8cf8dcb58e2f1a8762d65ed2d21fd92bf1d4811182",
- "sha256:523c94403047eb6cacd7fc1863ebef06e26c04d8a4e7f8f182d49cd206fe787e",
- "sha256:5d22a1a705c2f70f61ccadc696e33d922c1a92e00df8e1d58a6ade14dd7e3b4f",
- "sha256:714b6680215554731389a1bbdae4cec61741aa4726921fa2b2b96a6f578a2534",
- "sha256:7dfe1528650c3f0dc82f41a74cf4f72018288db9bfb75dcd08f6f04233ec7e78",
- "sha256:ba58b21b9cf3c33725f7f530febff9ed6a6846f9d0bf8a120fc74683ff919f89",
- "sha256:c4b87bb61fc3de59fc1f85e71a79b0c709dc68364d9584473697aad4aa13240f",
- "sha256:ebb4d2bee7fac3f6c891fcdafaa17f72ab9c6480f6d00de0b2dc9a5137dfe342"
- ],
- "index": "pypi",
- "version": "==1.6.4.post2"
- },
- "simplegeneric": {
- "hashes": [
- "sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"
- ],
- "version": "==0.8.1"
- },
- "simplejson": {
- "hashes": [
- "sha256:067a7177ddfa32e1483ba5169ebea1bc2ea27f224853211ca669325648ca5642",
- "sha256:2fc546e6af49fb45b93bbe878dea4c48edc34083729c0abd09981fe55bdf7f91",
- "sha256:354fa32b02885e6dae925f1b5bbf842c333c1e11ea5453ddd67309dc31fdb40a",
- "sha256:37e685986cf6f8144607f90340cff72d36acf654f3653a6c47b84c5c38d00df7",
- "sha256:3af610ee72efbe644e19d5eaad575c73fb83026192114e5f6719f4901097fce2",
- "sha256:3b919fc9cf508f13b929a9b274c40786036b31ad28657819b3b9ba44ba651f50",
- "sha256:3dd289368bbd064974d9a5961101f080e939cbe051e6689a193c99fb6e9ac89b",
- "sha256:6c3258ffff58712818a233b9737fe4be943d306c40cf63d14ddc82ba563f483a",
- "sha256:75e3f0b12c28945c08f54350d91e624f8dd580ab74fd4f1bbea54bc6b0165610",
- "sha256:b1f329139ba647a9548aa05fb95d046b4a677643070dc2afc05fa2e975d09ca5",
- "sha256:ee9625fc8ee164902dfbb0ff932b26df112da9f871c32f0f9c1bcf20c350fe2a",
- "sha256:fb2530b53c28f0d4d84990e945c2ebb470edb469d63e389bf02ff409012fe7c5"
- ],
- "index": "pypi",
- "version": "==3.16.0"
- },
- "singledispatch": {
- "hashes": [
- "sha256:5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c",
- "sha256:833b46966687b3de7f438c761ac475213e53b306740f1abfaa86e1d1aae56aa8"
- ],
- "markers": "python_version < '3.4'",
- "version": "==3.4.0.3"
- },
- "six": {
- "hashes": [
- "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
- "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
- ],
- "index": "pypi",
- "version": "==1.12.0"
- },
- "sortedcontainers": {
- "hashes": [
- "sha256:974e9a32f56b17c1bac2aebd9dcf197f3eb9cd30553c5852a3187ad162e1a03a",
- "sha256:d9e96492dd51fae31e60837736b38fe42a187b5404c16606ff7ee7cd582d4c60"
- ],
- "version": "==2.1.0"
- },
- "sqlalchemy": {
- "hashes": [
- "sha256:d6cda03b0187d6ed796ff70e87c9a7dce2c2c9650a7bc3c022cd331416853c31"
- ],
- "index": "pypi",
- "version": "==1.2.7"
- },
- "subprocess32": {
- "hashes": [
- "sha256:88e37c1aac5388df41cc8a8456bb49ebffd321a3ad4d70358e3518176de3a56b",
- "sha256:eb2937c80497978d181efa1b839ec2d9622cf9600a039a79d0e108d1f9aec79d"
- ],
- "index": "pypi",
- "version": "==3.5.4"
- },
- "supervisor": {
- "hashes": [
- "sha256:a3289b9124e59aee1621d43b55cd1634468cb3212d09c5b0114a3183cc080cca",
- "sha256:f768abc073e8702892718938b8a0ab98ebcb91c2afcb39bf2cb570d3eb51149e"
- ],
- "index": "pypi",
- "version": "==4.0.3"
- },
- "tenacity": {
- "hashes": [
- "sha256:a0c3c5f7ae0c33f5556c775ca059c12d6fd8ab7121613a713e8b7d649908571b",
- "sha256:b87c1934daa0b2ccc7db153c37b8bf91d12f165936ade8628e7b962b92dc7705"
- ],
- "index": "pypi",
- "version": "==5.0.4"
- },
- "tensorboard": {
- "hashes": [
- "sha256:6f194519f41762bfdf5eb410ccf33226d1c252caf5ad8893288648bfbcf4d135",
- "sha256:81170f66bf8f95c2e9f6b3fefe0ddc5472655a9e3793e73b5b5d4ec0ba395e76"
- ],
- "version": "==1.12.2"
- },
- "tensorflow-estimator": {
- "hashes": [
- "sha256:7cfdaa3e83e3532f31713713feb98be7ea9f3065722be4267e49b6c301271419"
- ],
- "version": "==1.13.0"
- },
- "tensorflow-gpu": {
- "hashes": [
- "sha256:0c2fa74a53009f72eb73da46ef8e78ffc09514349ba3de179c6b419b69a4bf09",
- "sha256:17460b5f3525ddbbb1fb9f639955d3a999f9656cc7bf1be65bc78dea1a0cedea",
- "sha256:2f85fdfee4eb93432bf8ef11428f2b5e17fb3e1b733599612329e165bb74a3fd",
- "sha256:38be54cb1e757f95f24b2e03e71d7bcab359429267ff36c9e32de2ed17943a42",
- "sha256:42c13cf5538125d93177b7901f23a1f6759b64f9f3f2d8680099b1fbfec37b83",
- "sha256:b771297d3b93f93a20af1d2d7dc049bb9617e2c2ab25c36156b011bf1a49bd7c",
- "sha256:ca68f7eb91e6101300ffc59a59c3b5600359a0ab6f2e1e8cde4a8a65ec21bb92"
- ],
- "index": "pypi",
- "version": "==1.13.0rc0"
- },
- "termcolor": {
- "hashes": [
- "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
- ],
- "version": "==1.1.0"
- },
- "terminado": {
- "hashes": [
- "sha256:d9d012de63acb8223ac969c17c3043337c2fcfd28f3aea1ee429b345d01ef460",
- "sha256:de08e141f83c3a0798b050ecb097ab6259c3f0331b2f7b7750c9075ced2c20c2"
- ],
- "version": "==0.8.2"
- },
- "testpath": {
- "hashes": [
- "sha256:46c89ebb683f473ffe2aab0ed9f12581d4d078308a3cb3765d79c6b2317b0109",
- "sha256:b694b3d9288dbd81685c5d2e7140b81365d46c29f5db4bc659de5aa6b98780f8"
- ],
- "version": "==0.4.2"
- },
- "theano": {
- "hashes": [
- "sha256:35c9bbef56b61ffa299265a42a4e8f8cb5a07b2997dabaef0f8830b397086913"
- ],
- "index": "pypi",
- "version": "==1.0.4"
- },
- "torchfile": {
- "hashes": [
- "sha256:a53dfe134b737845a9f2cb24fe0585317874f965932cebdb0439d13c8da4136e"
- ],
- "version": "==0.1.0"
- },
- "tornado": {
- "hashes": [
- "sha256:0662d28b1ca9f67108c7e3b77afabfb9c7e87bde174fbda78186ecedc2499a9d",
- "sha256:4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409",
- "sha256:732e836008c708de2e89a31cb2fa6c0e5a70cb60492bee6f1ea1047500feaf7f",
- "sha256:8154ec22c450df4e06b35f131adc4f2f3a12ec85981a203301d310abf580500f",
- "sha256:8e9d728c4579682e837c92fdd98036bd5cdefa1da2aaf6acf26947e6dd0c01c5",
- "sha256:d4b3e5329f572f055b587efc57d29bd051589fb5a43ec8898c77a47ec2fa2bbb",
- "sha256:e5f2585afccbff22390cddac29849df463b252b711aa2ce7c5f3f342a5b3b444"
- ],
- "version": "==5.1.1"
- },
- "traitlets": {
- "hashes": [
- "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835",
- "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9"
- ],
- "version": "==4.3.2"
- },
- "transforms3d": {
- "hashes": [
- "sha256:404c7797c78aa461cb8043081901fc5517cef342d5ff56becd74a7967ba88d78"
- ],
- "index": "pypi",
- "version": "==0.3.1"
- },
- "typing": {
- "hashes": [
- "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d",
- "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4",
- "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a"
- ],
- "markers": "python_version < '3.5'",
- "version": "==3.6.6"
- },
- "urllib3": {
- "hashes": [
- "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1",
- "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232"
- ],
- "index": "pypi",
- "version": "==1.25.3"
- },
- "utm": {
- "hashes": [
- "sha256:a6608a67df84418fd959a79b228b90ab55b2ae877827f9c210947104c5a75d0e"
- ],
- "index": "pypi",
- "version": "==0.4.2"
- },
- "uwsgi": {
- "hashes": [
- "sha256:4972ac538800fb2d421027f49b4a1869b66048839507ccf0aa2fda792d99f583"
- ],
- "index": "pypi",
- "version": "==2.0.18"
- },
- "v4l2": {
- "hashes": [
- "sha256:0d8f31f9d554ded4d0b50a31a7be5590b861df9e1ba256ee757e1c09175dd4a2"
- ],
- "index": "pypi",
- "version": "==0.2"
- },
- "vine": {
- "hashes": [
- "sha256:133ee6d7a9016f177ddeaf191c1f58421a1dcc6ee9a42c58b34bed40e1d2cd87",
- "sha256:ea4947cc56d1fd6f2095c8d543ee25dad966f78692528e68b4fada11ba3f98af"
- ],
- "version": "==1.3.0"
- },
- "visdom": {
- "hashes": [
- "sha256:77edd6811471282740846672a996348e963b5fa4220780f126c71481ad21d5a5"
- ],
- "index": "pypi",
- "version": "==0.1.8.8"
- },
- "wcwidth": {
- "hashes": [
- "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
- "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
- ],
- "version": "==0.1.7"
- },
- "websocket-client": {
- "hashes": [
- "sha256:1151d5fb3a62dc129164292e1227655e4bbc5dd5340a5165dfae61128ec50aa9",
- "sha256:1fd5520878b68b84b5748bb30e592b10d0a91529d5383f74f4964e72b297fd3a"
- ],
- "index": "pypi",
- "version": "==0.56.0"
- },
- "werkzeug": {
- "hashes": [
- "sha256:865856ebb55c4dcd0630cdd8f3331a1847a819dda7e8c750d3db6f2aa6c0209c",
- "sha256:a0b915f0815982fb2a09161cb8f31708052d0951c3ba433ccc5e1aa276507ca6"
- ],
- "version": "==0.15.4"
- },
- "wheel": {
- "hashes": [
- "sha256:5e79117472686ac0c4aef5bad5172ea73a1c2d1646b808c35926bd26bdfb0c08",
- "sha256:62fcfa03d45b5b722539ccbc07b190e4bfff4bb9e3a4d470dd9f6a0981002565"
- ],
- "markers": "python_version < '3'",
- "version": "==0.33.4"
- },
- "widgetsnbextension": {
- "hashes": [
- "sha256:14b2c65f9940c9a7d3b70adbe713dbd38b5ec69724eebaba034d1036cf3d4740",
- "sha256:fa618be8435447a017fd1bf2c7ae922d0428056cfc7449f7a8641edf76b48265"
- ],
- "version": "==3.4.2"
- },
- "wrapt": {
- "hashes": [
- "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533"
- ],
- "version": "==1.11.1"
- }
- }
-}
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index 7a4825846f7daa..b012883d78428d
--- a/README.md
+++ b/README.md
@@ -1,221 +1,124 @@
-[![](https://i.imgur.com/UetIFyH.jpg)](#)
-
-Welcome to openpilot
-======
-
-[openpilot](http://github.com/commaai/openpilot) is an open source driving agent. Currently, it performs the functions of Adaptive Cruise Control (ACC) and Lane Keeping Assist System (LKAS) for selected Honda, Toyota, Acura, Lexus, Chevrolet, Hyundai, Kia. It's about on par with Tesla Autopilot and GM Super Cruise, and better than [all other manufacturers](http://www.thedrive.com/tech/5707/the-war-for-autonomous-driving-part-iii-us-vs-germany-vs-japan).
-
-The openpilot codebase has been written to be concise and to enable rapid prototyping. We look forward to your contributions - improving real vehicle automation has never been easier.
+![](https://i.imgur.com/b0ZyIx5.jpg)
Table of Contents
=======================
-* [Community](#community)
-* [Hardware](#hardware)
-* [Supported Cars](#supported-cars)
-* [Community Maintained Cars](#community-maintained-cars)
-* [In Progress Cars](#in-progress-cars)
-* [How can I add support for my car?](#how-can-i-add-support-for-my-car)
-* [Directory structure](#directory-structure)
-* [User Data / chffr Account / Crash Reporting](#user-data--chffr-account--crash-reporting)
-* [Testing on PC](#testing-on-pc)
-* [Contributing](#contributing)
+* [What is openpilot?](#what-is-openpilot)
+* [Running in a car](#running-in-a-car)
+* [Running on PC](#running-on-pc)
+* [Community and Contributing](#community-and-contributing)
+* [User Data and comma Account](#user-data-and-comma-account)
+* [Safety and Testing](#safety-and-testing)
+* [Directory Structure](#directory-structure)
* [Licensing](#licensing)
---
-Community
+What is openpilot?
------
-openpilot is developed by [comma.ai](https://comma.ai/) and users like you.
-
-We have a [Twitter you should follow](https://twitter.com/comma_ai).
-
-Also, we have a several thousand people community on [Discord](https://discord.comma.ai).
+[openpilot](http://github.com/commaai/openpilot) is an open source driver assistance system. Currently, openpilot performs the functions of Adaptive Cruise Control (ACC), Automated Lane Centering (ALC), Forward Collision Warning (FCW) and Lane Departure Warning (LDW) for a growing variety of [supported car makes, models and model years](docs/CARS.md). In addition, while openpilot is engaged, a camera based Driver Monitoring (DM) feature alerts distracted and asleep drivers. See more about [the vehicle integration](docs/INTEGRATION.md) and [limitations](docs/LIMITATIONS.md).
- |
- |
- |
- |
+ |
+ |
+ |
+ |
- |
- |
- |
- |
+ |
+ |
+ |
+ |
-Hardware
+
+Running in a car
------
-At the moment openpilot supports the [EON Dashcam DevKit](https://comma.ai/shop/products/eon-dashcam-devkit). A [panda](https://shop.comma.ai/products/panda-obd-ii-dongle) and a [giraffe](https://comma.ai/shop/products/giraffe/) are recommended tools to interface the EON with the car. We'd like to support other platforms as well.
+To use openpilot in a car, you need four things
+* This software. It's free and available right here.
+* One of [the 150+ supported cars](docs/CARS.md). We support Honda, Toyota, Hyundai, Nissan, Kia, Chrysler, Lexus, Acura, Audi, VW, and more. If your car is not supported, but has adaptive cruise control and lane keeping assist, it's likely able to run openpilot.
+* A supported device to run this software. This can be a [comma two](https://comma.ai/shop/products/two), [comma three](https://comma.ai/shop/products/three), or if you like to experiment, a [Ubuntu computer with webcams](https://github.com/commaai/openpilot/tree/master/tools/webcam).
+* A way to connect to your car. With a comma two or three, you need only a [car harness](https://comma.ai/shop/products/car-harness). With an EON Gold or PC, you also need a [black panda](https://comma.ai/shop/products/panda).
-Install openpilot on a neo device by entering ``https://openpilot.comma.ai`` during NEOS setup.
+We have detailed instructions for [how to install the device in a car](https://comma.ai/setup).
-Supported Cars
+Running on PC
------
-| Make | Model | Supported Package | Lateral | Longitudinal | No Accel Below | No Steer Below | Giraffe |
-| ---------------------| -------------------------| ---------------------| --------| ---------------| -----------------| ---------------|-------------------|
-| Acura | ILX 2016-17 | AcuraWatch Plus | Yes | Yes | 25mph1| 25mph | Nidec |
-| Acura | RDX 2018 | AcuraWatch Plus | Yes | Yes | 25mph1| 12mph | Nidec |
-| Buick3 | Regal 2018 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom7|
-| Chevrolet3| Malibu 2017 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom7|
-| Chevrolet3| Volt 2017-18 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom7|
-| Cadillac3 | ATS 2018 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom7|
-| Chrysler | Pacifica 2018 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
-| Chrysler | Pacifica Hybrid 2017-18 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
-| Chrysler | Pacifica Hybrid 2019 | Adaptive Cruise | Yes | Stock | 0mph | 39mph | FCA |
-| GMC3 | Acadia Denali 2018 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom7|
-| Holden3 | Astra 2017 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom7|
-| Honda | Accord 2018 | All | Yes | Stock | 0mph | 3mph | Bosch |
-| Honda | Civic Sedan/Coupe 2016-18| Honda Sensing | Yes | Yes | 0mph | 12mph | Nidec |
-| Honda | Civic Sedan/Coupe 2019 | Honda Sensing | Yes | Stock | 0mph | 2mph | Bosch |
-| Honda | Civic Hatchback 2017-19 | Honda Sensing | Yes | Stock | 0mph | 12mph | Bosch |
-| Honda | CR-V 2015-16 | Touring | Yes | Yes | 25mph1| 12mph | Nidec |
-| Honda | CR-V 2017-19 | Honda Sensing | Yes | Stock | 0mph | 12mph | Bosch |
-| Honda | CR-V Hybrid 2017-2019 | Honda Sensing | Yes | Stock | 0mph | 12mph | Bosch |
-| Honda | Odyssey 2018-19 | Honda Sensing | Yes | Yes | 25mph1| 0mph | Inverted Nidec |
-| Honda | Passport 2019 | All | Yes | Yes | 25mph1| 12mph | Inverted Nidec |
-| Honda | Pilot 2016-18 | Honda Sensing | Yes | Yes | 25mph1| 12mph | Nidec |
-| Honda | Pilot 2019 | All | Yes | Yes | 25mph1| 12mph | Inverted Nidec |
-| Honda | Ridgeline 2017-19 | Honda Sensing | Yes | Yes | 25mph1| 12mph | Nidec |
-| Hyundai | Santa Fe 2019 | All | Yes | Stock | 0mph | 0mph | Custom6|
-| Hyundai | Elantra 2017 | SCC + LKAS | Yes | Stock | 19mph | 34mph | Custom6|
-| Hyundai | Genesis 2018 | All | Yes | Stock | 19mph | 34mph | Custom6|
-| Jeep | Grand Cherokee 2017-18 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
-| Jeep | Grand Cherokee 2019 | Adaptive Cruise | Yes | Stock | 0mph | 39mph | FCA |
-| Kia | Optima 2019 | SCC + LKAS | Yes | Stock | 0mph | 0mph | Custom6|
-| Kia | Sorento 2018 | All | Yes | Stock | 0mph | 0mph | Custom6|
-| Kia | Stinger 2018 | SCC + LKAS | Yes | Stock | 0mph | 0mph | Custom6|
-| Lexus | ES Hybrid 2019 | All | Yes | Yes | 0mph | 0mph | Toyota |
-| Lexus | RX Hybrid 2016-19 | All | Yes | Yes2| 0mph | 0mph | Toyota |
-| Subaru | Crosstrek 2018 | EyeSight | Yes | Stock | 0mph | 0mph | Custom4|
-| Subaru | Impreza 2019 | EyeSight | Yes | Stock | 0mph | 0mph | Custom4|
-| Toyota | Avalon 2016 | TSS-P | Yes | Yes2| 20mph1| 0mph | Toyota |
-| Toyota | Camry 2018 | All | Yes | Stock | 0mph5 | 0mph | Toyota |
-| Toyota | C-HR 2017-18 | All | Yes | Stock | 0mph | 0mph | Toyota |
-| Toyota | Corolla 2017-19 | All | Yes | Yes2| 20mph1| 0mph | Toyota |
-| Toyota | Corolla 2020 | All | Yes | Yes | 0mph | 0mph | Toyota |
-| Toyota | Corolla Hatchback 2019 | All | Yes | Yes | 0mph | 0mph | Toyota |
-| Toyota | Highlander 2017-18 | All | Yes | Yes2| 0mph | 0mph | Toyota |
-| Toyota | Highlander Hybrid 2018 | All | Yes | Yes2| 0mph | 0mph | Toyota |
-| Toyota | Prius 2016 | TSS-P | Yes | Yes2| 0mph | 0mph | Toyota |
-| Toyota | Prius 2017-19 | All | Yes | Yes2| 0mph | 0mph | Toyota |
-| Toyota | Prius Prime 2017-19 | All | Yes | Yes2| 0mph | 0mph | Toyota |
-| Toyota | Rav4 2016 | TSS-P | Yes | Yes2| 20mph1| 0mph | Toyota |
-| Toyota | Rav4 2017-18 | All | Yes | Yes2| 20mph1| 0mph | Toyota |
-| Toyota | Rav4 2019 | All | Yes | Yes | 0mph | 0mph | Toyota |
-| Toyota | Rav4 Hybrid 2017-18 | All | Yes | Yes2| 0mph | 0mph | Toyota |
-
-1[Comma Pedal](https://community.comma.ai/wiki/index.php/Comma_Pedal) is used to provide stop-and-go capability to some of the openpilot-supported cars that don't currently support stop-and-go. Here is how to [build a Comma Pedal](https://medium.com/@jfrux/comma-pedal-building-with-macrofab-6328bea791e8). ***NOTE: The Comma Pedal is not officially supported by [comma.ai](https://comma.ai).***
-2When disconnecting the Driver Support Unit (DSU), otherwise longitudinal control is stock ACC. For DSU locations, see [Toyota Wiki page](https://community.comma.ai/wiki/index.php/Toyota).
-3[GM installation guide](https://zoneos.com/volt/).
-4Subaru Giraffe is DIY.
-528mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control.
-6Open sourced [Hyundai Giraffe](https://github.com/commaai/neo/tree/master/giraffe/hyundai) is designed for the 2019 Sante Fe; pinout may differ for other Hyundais.
-7Community built Giraffe, find more information [here](https://zoneos.com/shop/).
-
-Community Maintained Cars
-------
+All of openpilot's services can run as normal on a PC, even without special hardware or a car. To develop or experiment with openpilot you can run openpilot on recorded or simulated data.
-| Make | Model | Supported Package | Lateral | Longitudinal | No Accel Below | No Steer Below | Giraffe |
-| ---------------------| -------------------------| ---------------------| --------| ---------------| -----------------| ---------------|-------------------|
-| Honda | Fit 2018 | Honda Sensing | Yes | Yes | 25mph1| 12mph | Inverted Nidec |
-| Tesla | Model S 2012-13 | All | Yes | Not yet | Not applicable | 0mph | Custom8|
+With openpilot's tools you can plot logs, replay drives and watch the full-res camera streams. See [the tools README](tools/README.md) for more information.
-[[Honda Fit Pull Request]](https://github.com/commaai/openpilot/pull/266).
-[[Tesla Model S Pull Request]](https://github.com/commaai/openpilot/pull/246)
-8Community built Giraffe, find more information here [Community Tesla Giraffe](https://github.com/jeankalud/neo/tree/tesla_giraffe/giraffe/tesla)
+You can also run openpilot in simulation [with the CARLA simulator](tools/sim/README.md). This allows openpilot to drive around a virtual car on your Ubuntu machine. The whole setup should only take a few minutes, but does require a decent GPU.
-Community Maintained Cars are not confirmed by comma.ai to meet our [safety model](https://github.com/commaai/openpilot/blob/devel/SAFETY.md). Be extra cautious using them.
-In Progress Cars
+Community and Contributing
------
-- All TSS-P Toyota with Steering Assist and LSS-P Lexus with Steering Assist or Lane Keep Assist.
- - Only remaining Toyota cars with no port yet are the Avalon and the Sienna.
-- All Hyundai with SmartSense.
-- All Kia with SCC and LKAS.
-- All Chrysler, Jeep, Fiat with Adaptive Cruise Control and LaneSense.
-How can I add support for my car?
+openpilot is developed by [comma](https://comma.ai/) and by users like you. We welcome both pull requests and issues on [GitHub](http://github.com/commaai/openpilot). Bug fixes and new car ports are encouraged. Check out [the contributing docs](docs/CONTRIBUTING.md).
+
+Documentation related to openpilot development can be found on [docs.comma.ai](https://docs.comma.ai). Information about running openpilot (e.g. FAQ, fingerprinting, troubleshooting, custom forks, community hardware) should go on the [wiki](https://github.com/commaai/openpilot/wiki).
+
+You can add support for your car by following guides we have written for [Brand](https://blog.comma.ai/how-to-write-a-car-port-for-openpilot/) and [Model](https://blog.comma.ai/openpilot-port-guide-for-toyota-models/) ports. Generally, a car with adaptive cruise control and lane keep assist is a good candidate. [Join our Discord](https://discord.comma.ai) to discuss car ports: most car makes have a dedicated channel.
+
+Want to get paid to work on openpilot? [comma is hiring](https://comma.ai/jobs/).
+
+And [follow us on Twitter](https://twitter.com/comma_ai).
+
+User Data and comma Account
------
-If your car has adaptive cruise control and lane keep assist, you are in luck. Using a [panda](https://comma.ai/shop/products/panda-obd-ii-dongle/) and [cabana](https://community.comma.ai/cabana/), you can understand how to make your car drive by wire.
+By default, openpilot uploads the driving data to our servers. You can also access your data through [comma connect](https://connect.comma.ai/). We use your data to train better models and improve openpilot for everyone.
+
+openpilot is open source software: the user is free to disable data collection if they wish to do so.
-We've written guides for [Brand](https://medium.com/@comma_ai/how-to-write-a-car-port-for-openpilot-7ce0785eda84) and [Model](https://medium.com/@comma_ai/openpilot-port-guide-for-toyota-models-e5467f4b5fe6) ports. These guides might help you after you have the basics figured out.
+openpilot logs the road facing cameras, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs.
+The driver facing camera is only logged if you explicitly opt-in in settings. The microphone is not recorded.
-- BMW, Audi, Volvo, and Mercedes all use [FlexRay](https://en.wikipedia.org/wiki/FlexRay) and can be supported after [FlexRay support](https://github.com/commaai/openpilot/pull/463) is merged.
-- We put time into a Ford port, but the steering has a 10 second cutout limitation that makes it unusable.
-- The 2016-2017 Honda Accord uses a custom signaling protocol for steering that's unlikely to ever be upstreamed.
+By using openpilot, you agree to [our Privacy Policy](https://comma.ai/privacy). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data.
-Directory structure
+Safety and Testing
+----
+
+* openpilot observes ISO26262 guidelines, see [SAFETY.md](docs/SAFETY.md) for more details.
+* openpilot has software in the loop [tests](.github/workflows/selfdrive_tests.yaml) that run on every commit.
+* The code enforcing the safety model lives in panda and is written in C, see [code rigor](https://github.com/commaai/panda#code-rigor) for more details.
+* panda has software in the loop [safety tests](https://github.com/commaai/panda/tree/master/tests/safety).
+* Internally, we have a hardware in the loop Jenkins test suite that builds and unit tests the various processes.
+* panda has additional hardware in the loop [tests](https://github.com/commaai/panda/blob/master/Jenkinsfile).
+* We run the latest openpilot in a testing closet containing 10 comma devices continuously replaying routes.
+
+Directory Structure
------
.
- ├── apk # The apk files used for the UI
- ├── cereal # The messaging spec used for all logs on EON
+ ├── cereal # The messaging spec and libs used for all logs
├── common # Library like functionality we've developed here
- ├── installer/updater # Manages auto-updates of openpilot
+ ├── docs # Documentation
├── opendbc # Files showing how to interpret data from cars
- ├── panda # Code used to communicate on CAN and LIN
- ├── phonelibs # Libraries used on EON
- ├── pyextra # Libraries used on EON
+ ├── panda # Code used to communicate on CAN
+ ├── third_party # External libraries
+ ├── pyextra # Extra python packages
└── selfdrive # Code needed to drive the car
- ├── assets # Fonts and images for UI
+ ├── assets # Fonts, images, and sounds for UI
├── athena # Allows communication with the app
├── boardd # Daemon to talk to the board
- ├── can # Helpers for parsing CAN messages
+ ├── camerad # Driver to capture images from the camera sensors
├── car # Car specific code to read states and control actuators
├── common # Shared C/C++ code for the daemons
- ├── controls # Perception, planning and controls
+ ├── controls # Planning and controls
├── debug # Tools to help you debug and do car ports
- ├── locationd # Soon to be home of precise location
+ ├── locationd # Precise localization and vehicle parameter estimation
├── logcatd # Android logcat as a service
├── loggerd # Logger and uploader of car data
+ ├── modeld # Driving and monitoring model runners
├── proclogd # Logs information from proc
- ├── sensord # IMU / GPS interface code
- ├── test # Car simulator running code through virtual maneuvers
- ├── ui # The UI
- └── visiond # Vision pipeline
-
-To understand how the services interact, see `selfdrive/service_list.yaml`
-
-User Data / chffr Account / Crash Reporting
-------
-
-By default, openpilot creates an account and includes a client for chffr, our dashcam app. We use your data to train better models and improve openpilot for everyone.
-
-It's open source software, so you are free to disable it if you wish.
-
-It logs the road facing camera, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs.
-The user facing camera is only logged if you explicitly opt-in in settings.
-It does not log the microphone.
-
-By using it, you agree to [our privacy policy](https://community.comma.ai/privacy.html). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma.ai. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma.ai for the use of this data.
-
-Testing on PC
-------
-
-Check out [openpilot-tools](https://github.com/commaai/openpilot-tools): lots of tools you can use to replay driving data, test and develop openpilot from your pc.
-
-Also, within openpilot there is a rudimentary infrastructure to run a basic simulation and generate a report of openpilot's behavior in different longitudinal control scenarios.
-
-```bash
-# Requires working docker
-./run_docker_tests.sh
-```
-
-Contributing
-------
-
-We welcome both pull requests and issues on [github](http://github.com/commaai/openpilot). Bug fixes and new car ports encouraged.
-
-We also have a [bounty program](https://comma.ai/bounties.html).
-
-Want to get paid to work on openpilot? [comma.ai is hiring](https://comma.ai/jobs/)
+ ├── sensord # IMU interface code
+ ├── test # Unit tests, system tests, and a car simulator
+ └── ui # The UI
Licensing
------
@@ -231,3 +134,9 @@ NO WARRANTY EXPRESSED OR IMPLIED.**
---
+
+[![openpilot tests](https://github.com/commaai/openpilot/workflows/openpilot%20tests/badge.svg?event=push)](https://github.com/commaai/openpilot/actions)
+[![Total alerts](https://img.shields.io/lgtm/alerts/g/commaai/openpilot.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/commaai/openpilot/alerts/)
+[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/commaai/openpilot.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/commaai/openpilot/context:python)
+[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/commaai/openpilot.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/commaai/openpilot/context:cpp)
+[![codecov](https://codecov.io/gh/commaai/openpilot/branch/master/graph/badge.svg)](https://codecov.io/gh/commaai/openpilot)
diff --git a/README_chffrplus.md b/README_chffrplus.md
deleted file mode 100644
index dc13e8c3f264c6..00000000000000
--- a/README_chffrplus.md
+++ /dev/null
@@ -1,36 +0,0 @@
-Welcome to chffrplus
-======
-
-[chffrplus](https://github.com/commaai/chffrplus) is an open source dashcam.
-
-This is the shipping reference software for the comma EON Dashcam DevKit. It keeps many of the niceities of [openpilot](https://github.com/commaai/openpilot), like high quality sensors, great camera, and good autostart and stop. Though unlike openpilot, it cannot control your car. chffrplus can interface with your car through a [panda](https://shop.comma.ai/products/panda-obd-ii-dongle), but just like our dashcam app [chffr](https://getchffr.com/), it is read only.
-
-It integrates with the rest of the comma ecosystem, so you can view your drives on the [chffr](https://getchffr.com/) app for Android or iOS, and reverse engineer your car with [cabana](https://community.comma.ai/cabana/?demo=1).
-
-
-Hardware
-------
-
-Right now chffrplus supports the [EON Dashcam DevKit](https://shop.comma.ai/products/eon-dashcam-devkit) for hardware to run on.
-
-Install chffrplus on a EON device by entering ``https://chffrplus.comma.ai`` during NEOS setup.
-
-
-User Data / chffr Account / Crash Reporting
-------
-
-By default chffrplus creates an account and includes a client for chffr, our dashcam app.
-
-It's open source software, so you are free to disable it if you wish.
-
-It logs the road facing camera, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs.
-It does not log the user facing camera or the microphone.
-
-By using it, you agree to [our privacy policy](https://beta.comma.ai/privacy.html). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma.ai. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma.ai for the use of this data.
-
-
-Licensing
-------
-
-chffrplus is released under the MIT license.
-
diff --git a/RELEASES.md b/RELEASES.md
index f73b8daf83ebb8..5d4f114b84040a 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1,3 +1,366 @@
+Version 0.8.12 (2021-12-15)
+========================
+ * New driving model
+ * Improved behavior around exits
+ * Better pose accuracy at high speeds, allowing max speed of 90mph
+ * Fully incorporated comma three data into all parts of training stack
+ * Improved follow distance
+ * Better longitudinal policy, especially in low speed traffic
+ * New alert sounds
+ * AGNOS 3
+ * Display burn in mitigation
+ * Improved audio amplifier configuration
+ * System reliability improvements
+ * Update Python to 3.8.10
+ * Raw logs upload moved to connect.comma.ai
+ * Fixed HUD alerts on newer Honda Bosch thanks to csouers!
+ * Audi Q3 2020-21 support thanks to jyoung8607!
+ * Lexus RC 2020 support thanks to ErichMoraga!
+
+Version 0.8.11 (2021-11-29)
+========================
+ * Support for CAN FD on the red panda
+ * Support for an external panda on the comma three
+ * Navigation: Show more detailed instructions when approaching maneuver
+ * Fixed occasional steering faults on GM cars thanks to jyoung8607!
+ * Nissan ECU firmware fingerprinting thanks to robin-reckmann, martinl, and razem-io!
+ * Cadillac Escalade ESV 2016 support thanks to Gibby!
+ * Genesis G70 2020 support thanks to tecandrew!
+ * Hyundai Santa Fe Hybrid 2022 support thanks to sunnyhaibin!
+ * Mazda CX-9 2021 support thanks to Jacar!
+ * Volkswagen Polo 2020 support thanks to jyoung8607!
+ * Volkswagen T-Roc 2021 support thanks to jyoung8607!
+
+Version 0.8.10 (2021-11-01)
+========================
+ * New driving model
+ * Trained on one million minutes!!!
+ * Fixed lead training making lead predictions significantly more accurate
+ * Fixed several localizer dataset bugs and loss function bugs, overall improved accuracy
+ * New driver monitoring model
+ * Trained on latest data from both comma two and comma three
+ * Increased model field of view by 40% on comma three
+ * Improved model stability on masked users
+ * Improved pose prediction with reworked ground-truth stack
+ * Lateral and longitudinal planning MPCs now in ACADOS
+ * Combined longitudinal MPCs
+ * All longitudinal planning now happens in a single MPC system
+ * Fixed instability in MPC problem to prevent sporadic CPU usage
+ * AGNOS 2: minor stability improvements and builder repo open sourced
+ * tools: new and improved replay thanks to deanlee!
+ * Moved community-supported cars outside of the Community Features toggle
+ * Improved FW fingerprinting reliability for Hyundai/Kia/Genesis
+ * Added prerequisites for longitudinal control on Hyundai/Kia/Genesis and Honda Bosch
+ * Audi S3 2015 support thanks to jyoung8607!
+ * Honda Freed 2020 support thanks to belm0!
+ * Hyundai Ioniq Hybrid 2020-2022 support thanks to sunnyhaibin!
+ * Hyundai Santa Fe 2022 support thanks to sunnyhaibin!
+ * Kia K5 2021 support thanks to sunnyhaibin!
+ * Å koda Kamiq 2021 support thanks to jyoung8607!
+ * Å koda Karoq 2019 support thanks to jyoung8607!
+ * Volkswagen Arteon 2021 support thanks to jyoung8607!
+ * Volkswagen California 2021 support thanks to jyoung8607!
+ * Volkswagen Taos 2022 support thanks to jyoung8607!
+
+Version 0.8.9 (2021-09-14)
+========================
+ * Improved fan control on comma three
+ * AGNOS 1.5: improved stability
+ * Honda e 2020 support
+
+Version 0.8.8 (2021-08-27)
+========================
+ * New driving model with improved laneless performance
+ * Trained on 5000+ hours of diverse driving data from 3000+ users in 40+ countries
+ * Better anti-cheating methods during simulator training ensure the model hugs less when in laneless mode
+ * All new desire ground-truthing stack makes the model better at lane changes
+ * New driver monitoring model: improved performance on comma three
+ * NEOS 18 for comma two: update packages
+ * AGNOS 1.3 for comma three: fix display init at high temperatures
+ * Improved auto-exposure on comma three
+ * Improved longitudinal control on Honda Nidec cars
+ * Hyundai Kona Hybrid 2020 support thanks to haram-KONA!
+ * Hyundai Sonata Hybrid 2021 support thanks to Matt-Wash-Burn!
+ * Kia Niro Hybrid 2021 support thanks to tetious!
+
+Version 0.8.7 (2021-07-31)
+========================
+ * comma three support!
+ * Navigation alpha for the comma three!
+ * Volkswagen T-Cross 2021 support thanks to jyoung8607!
+
+Version 0.8.6 (2021-07-21)
+========================
+ * Revamp lateral and longitudinal planners
+ * Refactor planner output API to be more readable and verbose
+ * Planners now output desired trajectories for speed, acceleration, curvature, and curvature rate
+ * Use MPC for longitudinal planning when no lead car is present, makes accel and decel smoother
+ * Remove "CHECK DRIVER FACE VISIBILITY" warning
+ * Fixed cruise fault on some TSS2.5 Camrys and international Toyotas
+ * Hyundai Elantra Hybrid 2021 support thanks to tecandrew!
+ * Hyundai Ioniq PHEV 2020 support thanks to YawWashout!
+ * Kia Niro Hybrid 2019 support thanks to jyoung8607!
+ * Å koda Octavia RS 2016 support thanks to jyoung8607!
+ * Toyota Alphard 2020 support thanks to belm0!
+ * Volkswagen Golf SportWagen 2015 support thanks to jona96!
+ * Volkswagen Touran 2017 support thanks to jyoung8607!
+
+Version 0.8.5 (2021-06-11)
+========================
+ * NEOS update: improved reliability and stability with better voltage regulator configuration
+ * Smart model-based Forward Collision Warning
+ * CAN-based fingerprinting moved behind community features toggle
+ * Improved longitudinal control on Toyotas with a comma pedal
+ * Improved auto-brightness using road-facing camera
+ * Added "Software" settings page with updater controls
+ * Audi Q2 2018 support thanks to jyoung8607!
+ * Hyundai Elantra 2021 support thanks to CruiseBrantley!
+ * Lexus UX Hybrid 2019-2020 support thanks to brianhaugen2!
+ * Toyota Avalon Hybrid 2019 support thanks to jbates9011!
+ * SEAT Leon 2017 & 2020 support thanks to jyoung8607!
+ * Å koda Octavia 2015 & 2019 support thanks to jyoung8607!
+
+Version 0.8.4 (2021-05-17)
+========================
+ * Delay controls start until system is ready
+ * Fuzzy car identification, enabled with Community Features toggle
+ * Localizer optimized for increased precision and less CPU usage
+ * Retuned lateral control to be more aggressive when model is confident
+ * Toyota Mirai 2021 support
+ * Lexus NX 300 2020 support thanks to goesreallyfast!
+ * Volkswagen Atlas 2018-19 support thanks to jyoung8607!
+
+Version 0.8.3 (2021-04-01)
+========================
+ * New model
+ * Trained on new diverse dataset from 2000+ users from 30+ countries
+ * Trained with improved segnet from the comma-pencil community project
+ * 🥬 Dramatically improved end-to-end lateral performance 🥬
+ * Toggle added to disable the use of lanelines
+ * NEOS update: update packages and support for new UI
+ * New offroad UI based on Qt
+ * Default SSH key only used for setup
+ * Kia Ceed 2019 support thanks to ZanZaD13!
+ * Kia Seltos 2021 support thanks to speedking456!
+ * Added support for many Volkswagen and Å koda models thanks to jyoung8607!
+
+Version 0.8.2 (2021-02-26)
+========================
+ * Use model points directly in MPC (no more polyfits), making lateral planning more accurate
+ * Use model heading prediction for smoother lateral control
+ * Smarter actuator delay compensation
+ * Improve qcamera resolution for improved video in explorer and connect
+ * Adjust maximum engagement speed to better fit the model's training distribution
+ * New driver monitoring model trained with 3x more diverse data
+ * Improved face detection with masks
+ * More predictable DM alerts when visibility is bad
+ * Rewritten video streaming between openpilot processes
+ * Improved longitudinal tuning on TSS2 Corolla and Rav4 thanks to briskspirit!
+ * Audi A3 2015 and 2017 support thanks to keeleysam!
+ * Nissan Altima 2020 support thanks to avolmensky!
+ * Lexus ES Hybrid 2018 support thanks to TheInventorMan!
+ * Toyota Camry Hybrid 2021 support thanks to alancyau!
+
+Version 0.8.1 (2020-12-21)
+========================
+ * Original EON is deprecated, upgrade to comma two
+ * Better model performance in heavy rain
+ * Better lane positioning in turns
+ * Fixed bug where model would cut turns on empty roads at night
+ * Fixed issue where some Toyotas would not completely stop thanks to briskspirit!
+ * Toyota Camry 2021 with TSS2.5 support
+ * Hyundai Ioniq Electric 2020 support thanks to baldwalker!
+
+Version 0.8.0 (2020-11-30)
+========================
+ * New driving model: fully 3D and improved cut-in detection
+ * UI draws 2 road edges, 4 lanelines and paths in 3D
+ * Major fixes to cut-in detection for openpilot longitudinal
+ * Grey panda is no longer supported, upgrade to comma two or black panda
+ * Lexus NX 2018 support thanks to matt12eagles!
+ * Kia Niro EV 2020 support thanks to nickn17!
+ * Toyota Prius 2021 support thanks to rav4kumar!
+ * Improved lane positioning with uncertain lanelines, wide lanes and exits
+ * Improved lateral control for Prius and Subaru
+
+Version 0.7.10 (2020-10-29)
+========================
+ * Grey panda is deprecated, upgrade to comma two or black panda
+ * NEOS update: update to Python 3.8.2 and lower CPU frequency
+ * Improved thermals due to reduced CPU frequency
+ * Update SNPE to 1.41.0
+ * Reduced offroad power consumption
+ * Various system stability improvements
+ * Acura RDX 2020 support thanks to csouers!
+
+Version 0.7.9 (2020-10-09)
+========================
+ * Improved car battery power management
+ * Improved updater robustness
+ * Improved realtime performance
+ * Reduced UI and modeld lags
+ * Increased torque on 2020 Hyundai Sonata and Palisade
+
+Version 0.7.8 (2020-08-19)
+========================
+ * New driver monitoring model: improved face detection and better compatibility with sunglasses
+ * Download NEOS operating system updates in the background
+ * Improved updater reliability and responsiveness
+ * Hyundai Kona 2020, Veloster 2019, and Genesis G70 2018 support thanks to xps-genesis!
+
+Version 0.7.7 (2020-07-20)
+========================
+ * White panda is no longer supported, upgrade to comma two or black panda
+ * Improved vehicle model estimation using high precision localizer
+ * Improved thermal management on comma two
+ * Improved autofocus for road-facing camera
+ * Improved noise performance for driver-facing camera
+ * Block lane change start using blindspot monitor on select Toyota, Hyundai, and Subaru
+ * Fix GM ignition detection
+ * Code cleanup and smaller release sizes
+ * Hyundai Sonata 2020 promoted to officially supported car
+ * Hyundai Ioniq Electric Limited 2019 and Ioniq SE 2020 support thanks to baldwalker!
+ * Subaru Forester 2019 and Ascent 2019 support thanks to martinl!
+
+Version 0.7.6.1 (2020-06-16)
+========================
+ * Hotfix: update kernel on some comma twos (orders #8570-#8680)
+
+Version 0.7.6 (2020-06-05)
+========================
+ * White panda is deprecated, upgrade to comma two or black panda
+ * 2017 Nissan X-Trail, 2018-19 Leaf and 2019 Rogue support thanks to avolmensky!
+ * 2017 Mazda CX-5 support in dashcam mode thanks to Jafaral!
+ * Huge CPU savings in modeld by using thneed!
+ * Lots of code cleanup and refactors
+
+Version 0.7.5 (2020-05-13)
+========================
+ * Right-Hand Drive support for both driving and driver monitoring!
+ * New driving model: improved at sharp turns and lead speed estimation
+ * New driver monitoring model: overall improvement on comma two
+ * Driver camera preview in settings to improve mounting position
+ * Added support for many Hyundai, Kia, Genesis models thanks to xx979xx!
+ * Improved lateral tuning for 2020 Toyota Rav 4 (hybrid)
+
+Version 0.7.4 (2020-03-20)
+========================
+ * New driving model: improved lane changes and lead car detection
+ * Improved driver monitoring model: improve eye detection
+ * Improved calibration stability
+ * Improved lateral control on some 2019 and 2020 Toyota Prius
+ * Improved lateral control on VW Golf: 20% more steering torque
+ * Fixed bug where some 2017 and 2018 Toyota C-HR would use the wrong steering angle sensor
+ * Support for Honda Insight thanks to theantihero!
+ * Code cleanup in car abstraction layers and ui
+
+Version 0.7.3 (2020-02-21)
+========================
+ * Support for 2020 Highlander thanks to che220!
+ * Support for 2018 Lexus NX 300h thanks to kengggg!
+ * Speed up ECU firmware query
+ * Fix bug where manager would sometimes hang after shutting down the car
+
+Version 0.7.2 (2020-02-07)
+========================
+ * ECU firmware version based fingerprinting for Honda & Toyota
+ * New driving model: improved path prediction during turns and lane changes and better lead speed tracking
+ * Improve driver monitoring under extreme lighting and add low accuracy alert
+ * Support for 2019 Rav4 Hybrid thanks to illumiN8i!
+ * Support for 2016, 2017 and 2020 Lexus RX thanks to illumiN8i!
+ * Support for 2020 Chrysler Pacifica Hybrid thanks to adhintz!
+
+Version 0.7.1 (2020-01-20)
+========================
+ * comma two support!
+ * Lane Change Assist above 45 mph!
+ * Replace zmq with custom messaging library, msgq!
+ * Supercombo model: calibration and driving models are combined for better lead estimate
+ * More robust updater thanks to jyoung8607! Requires NEOS update
+ * Improve low speed ACC tuning
+
+Version 0.7 (2019-12-13)
+========================
+ * Move to SCons build system!
+ * Add Lane Departure Warning (LDW) for all supported vehicles!
+ * NEOS update: increase wifi speed thanks to jyoung8607!
+ * Adaptive driver monitoring based on scene
+ * New driving model trained end-to-end: improve lane lines and lead detection
+ * Smarter torque limit alerts for all cars
+ * Improve GM longitudinal control: proper computations for 15Hz radar
+ * Move GM port, Toyota with DSU removed, comma pedal in community features; toggle switch required
+ * Remove upload over cellular toggle: only upload qlog and qcamera files if not on wifi
+ * Refactor Panda code towards ISO26262 and SIL2 compliancy
+ * Forward stock FCW for Honda Nidec
+ * Volkswagen port now standard: comma Harness intercepts stock camera
+
+Version 0.6.6 (2019-11-05)
+========================
+ * Volkswagen support thanks to jyoung8607!
+ * Toyota Corolla Hybrid with TSS 2.0 support thanks to u8511049!
+ * Lexus ES with TSS 2.0 support thanks to energee!
+ * Fix GM ignition detection and lock safety mode not required anymore
+ * Log panda firmware and dongle ID thanks to martinl!
+ * New driving model: improve path prediction and lead detection
+ * New driver monitoring model, 4x smaller and running on DSP
+ * Display an alert and don't start openpilot if panda has wrong firmware
+ * Fix bug preventing EON from terminating processes after a drive
+ * Remove support for Toyota giraffe without the 120Ohm resistor
+
+Version 0.6.5 (2019-10-07)
+========================
+ * NEOS update: upgrade to Python3 and new installer!
+ * comma Harness support!
+ * New driving model: improve path prediction
+ * New driver monitoring model: more accurate face and eye detection
+ * Redesign offroad screen to display updates and alerts
+ * Increase maximum allowed acceleration
+ * Prevent car 12V battery drain by cutting off EON charge after 3 days of no drive
+ * Lexus CT Hybrid support thanks to thomaspich!
+ * Louder chime for critical alerts
+ * Add toggle to switch to dashcam mode
+ * Fix "invalid vehicle params" error on DSU-less Toyota
+
+Version 0.6.4 (2019-09-08)
+========================
+ * Forward stock AEB for Honda Nidec
+ * Improve lane centering on banked roads
+ * Always-on forward collision warning
+ * Always-on driver monitoring, except for right hand drive countries
+ * Driver monitoring learns the user's normal driving position
+ * Honda Fit support thanks to energee!
+ * Lexus IS support
+
+Version 0.6.3 (2019-08-12)
+========================
+ * Alert sounds from EON: requires NEOS update
+ * Improve driver monitoring: eye tracking and improved awareness logic
+ * Improve path prediction with new driving model
+ * Improve lane positioning with wide lanes and exits
+ * Improve lateral control on RAV4
+ * Slow down for turns using model
+ * Open sourced regression test to verify outputs against reference logs
+ * Open sourced regression test to sanity check all car models
+
+Version 0.6.2 (2019-07-29)
+========================
+ * New driving model!
+ * Improve lane tracking with double lines
+ * Strongly improve stationary vehicle detection
+ * Strongly reduce cases of braking due to false leads
+ * Better lead tracking around turns
+ * Improve cut-in prediction by using neural network
+ * Improve lateral control on Toyota Camry and C-HR thanks to zorrobyte!
+ * Fix unintended openpilot disengagements on Jeep thanks to adhintz!
+ * Fix delayed transition to offroad when car is turned off
+
+Version 0.6.1 (2019-07-21)
+========================
+ * Remote SSH with comma prime and [ssh.comma.ai](https://ssh.comma.ai)
+ * Panda code Misra-c2012 compliance, tested against cppcheck coverage
+ * Lockout openpilot after 3 terminal alerts for driver distracted or unresponsive
+ * Toyota Sienna support thanks to wocsor!
+
Version 0.6 (2019-07-01)
========================
* New model, with double the pixels and ten times the temporal context!
@@ -8,7 +371,7 @@ Version 0.6 (2019-07-01)
* Panda safety code is MISRA compliant and ships with a signed version on release2
* New NEOS is 500MB smaller and has a reproducible usr/pipenv
* Lexus ES Hybrid support thanks to wocsor!
- * Improve tuning for supported Toyota with TSS2
+ * Improve tuning for supported Toyota with TSS 2.0
* Various other stability improvements
Version 0.5.13 (2019-05-31)
@@ -314,96 +677,96 @@ Version 0.3.4 (2017-07-28)
Version 0.3.3 (2017-06-28)
===========================
- * Improved model trained on more data
- * Alpha CR-V support thanks to energee and johnnwvs!
- * Using the opendbc project for DBC files
- * Minor performance improvements
- * UI update thanks to pjlao307
- * Power off button
- * 6% more torque on the Civic
+ * Improved model trained on more data
+ * Alpha CR-V support thanks to energee and johnnwvs!
+ * Using the opendbc project for DBC files
+ * Minor performance improvements
+ * UI update thanks to pjlao307
+ * Power off button
+ * 6% more torque on the Civic
Version 0.3.2 (2017-05-22)
===========================
- * Minor stability bugfixes
- * Added metrics and rear view mirror disable to settings
- * Update model with more crowdsourced data
+ * Minor stability bugfixes
+ * Added metrics and rear view mirror disable to settings
+ * Update model with more crowdsourced data
Version 0.3.1 (2017-05-17)
===========================
- * visiond stability bugfix
- * Add logging for angle and flashing
+ * visiond stability bugfix
+ * Add logging for angle and flashing
Version 0.3.0 (2017-05-12)
===========================
- * Add CarParams struct to improve the abstraction layer
- * Refactor visiond IPC to support multiple clients
- * Add raw GPS and beginning support for navigation
- * Improve model in visiond using crowdsourced data
- * Add improved system logging to diagnose instability
- * Rewrite baseui in React Native
- * Moved calibration to the cloud
+ * Add CarParams struct to improve the abstraction layer
+ * Refactor visiond IPC to support multiple clients
+ * Add raw GPS and beginning support for navigation
+ * Improve model in visiond using crowdsourced data
+ * Add improved system logging to diagnose instability
+ * Rewrite baseui in React Native
+ * Moved calibration to the cloud
Version 0.2.9 (2017-03-01)
===========================
- * Retain compatibility with NEOS v1
+ * Retain compatibility with NEOS v1
Version 0.2.8 (2017-02-27)
===========================
- * Fix bug where frames were being dropped in minute 71
+ * Fix bug where frames were being dropped in minute 71
Version 0.2.7 (2017-02-08)
===========================
- * Better performance and pictures at night
- * Fix ptr alignment issue in boardd
- * Fix brake error light, fix crash if too cold
+ * Better performance and pictures at night
+ * Fix ptr alignment issue in boardd
+ * Fix brake error light, fix crash if too cold
Version 0.2.6 (2017-01-31)
===========================
- * Fix bug in visiond model execution
+ * Fix bug in visiond model execution
Version 0.2.5 (2017-01-30)
===========================
- * Fix race condition in manager
+ * Fix race condition in manager
Version 0.2.4 (2017-01-27)
===========================
- * OnePlus 3T support
- * Enable installation as NEOS app
- * Various minor bugfixes
+ * OnePlus 3T support
+ * Enable installation as NEOS app
+ * Various minor bugfixes
Version 0.2.3 (2017-01-11)
===========================
- * Reduce space usage by 80%
- * Add better logging
- * Add Travis CI
+ * Reduce space usage by 80%
+ * Add better logging
+ * Add Travis CI
Version 0.2.2 (2017-01-10)
===========================
- * Board triggers started signal on CAN messages
- * Improved autoexposure
- * Handle out of space, improve upload status
+ * Board triggers started signal on CAN messages
+ * Improved autoexposure
+ * Handle out of space, improve upload status
Version 0.2.1 (2016-12-14)
===========================
- * Performance improvements, removal of more numpy
- * Fix boardd process priority
- * Make counter timer reset on use of steering wheel
+ * Performance improvements, removal of more numpy
+ * Fix boardd process priority
+ * Make counter timer reset on use of steering wheel
Version 0.2 (2016-12-12)
=========================
- * Car/Radar abstraction layers have shipped, see cereal/car.capnp
- * controlsd has been refactored
- * Shipped plant model and testing maneuvers
- * visiond exits more gracefully now
- * Hardware encoder in visiond should always init
- * ui now turns off the screen after 30 seconds
- * Switch to openpilot release branch for future releases
- * Added preliminary Docker container to run tests on PC
+ * Car/Radar abstraction layers have shipped, see cereal/car.capnp
+ * controlsd has been refactored
+ * Shipped plant model and testing maneuvers
+ * visiond exits more gracefully now
+ * Hardware encoder in visiond should always init
+ * ui now turns off the screen after 30 seconds
+ * Switch to openpilot release branch for future releases
+ * Added preliminary Docker container to run tests on PC
Version 0.1 (2016-11-29)
=========================
- * Initial release of openpilot
- * Adaptive cruise control is working
- * Lane keep assist is working
- * Support for Acura ILX 2016 with AcuraWatch Plus
- * Support for Honda Civic 2016 Touring Edition
+ * Initial release of openpilot
+ * Adaptive cruise control is working
+ * Lane keep assist is working
+ * Support for Acura ILX 2016 with AcuraWatch Plus
+ * Support for Honda Civic 2016 Touring Edition
diff --git a/SAFETY.md b/SAFETY.md
deleted file mode 100644
index 3cda811e0cd9f9..00000000000000
--- a/SAFETY.md
+++ /dev/null
@@ -1,151 +0,0 @@
-openpilot Safety
-======
-
-openpilot is an Adaptive Cruise Control (ACC) and Lane Keeping Assist (LKA) system.
-Like other ACC and LKA systems, openpilot requires the driver to be alert and to
-pay attention at all times. We repeat, **driver alertness is necessary, but not
-sufficient, for openpilot to be used safely**.
-
-In order to enforce driver alertness, openpilot includes a driver monitoring feature
-that alerts the driver when distracted.
-
-However, even with an attentive driver, we must make further efforts for the system to be
-safe. We have designed openpilot with two other safety considerations.
-
-1. The driver must always be capable to immediately retake manual control of the vehicle,
- by stepping on either pedal or by pressing the cancel button.
-2. The vehicle must not alter its trajectory too quickly for the driver to safely
- react. This means that while the system is engaged, the actuators are constrained
- to operate within reasonable limits.
-
-Following are details of the car specific safety implementations:
-
-Honda/Acura
-------
-
- - While the system is engaged, gas, brake and steer commands are subject to the same limits used by
- the stock system.
-
- - Without an interceptor, the gas is controlled by the Powertrain Control Module (PCM).
- The PCM limits acceleration to what is reasonable for a cruise control system. With an
- interceptor, the gas is clipped to 60%.
-
- - The brake is controlled by the 0x1FA CAN message. This message allows full
- braking, although the panda firmware and openpilot clip it to 1/4th of the max.
- This is approximately 0.3g of braking.
-
- - Steering is controlled by the 0xE4 CAN message. The Electronic Power Steering (EPS)
- controller in the car limits the torque to a very small amount, so regardless of the
- message, the controller cannot jerk the wheel.
-
- - Brake and gas pedal pressed signals are contained in the 0x17C CAN message. A rising edge of
- either signals triggers a disengagement, which is enforced by the panda firmware and by openpilot. The
- white led on the panda signifies if the panda is allowing control messages.
-
- - Honda CAN uses both a counter and a checksum to ensure integrity and prevent
- replay of the same message.
-
-Toyota/Lexus
-------
-
- - While the system is engaged, gas, brake and steer commands are subject to the same limits used by
- the stock system.
-
- - With the stock Driving Support Unit (DSU) connected (or in DSU-less models like Camry and C-HR),
- the acceleration is controlled by the stock system and is subject to the stock adaptive cruise
- control limits. Without the stock DSU connected, the acceleration command is controlled by the
- 0x343 CAN message and its value is limited between .3g of deceleration and .15g of acceleration
- by the panda firmware and by openpilot. The acceleration command is ignored by the Engine Control
- Module (ECM) while the cruise control system is disengaged.
-
- - Steering torque is controlled through the 0x2E4 CAN message and it's limited by the panda firmware and by
- openpilot to a value between -1500 and 1500. In addition, the vehicle EPS unit will not respond to
- commands outside these limits. A steering torque rate limit is enforced by the panda firmware and by
- openpilot, so that the commanded steering torque must rise from 0 to max value no faster than
- 1.5s. Commanded steering torque is limited by the panda firmware and by openpilot to be no more than 350
- units above the actual EPS generated motor torque to ensure limited differences between
- commanded and actual torques.
-
- - Brake and gas pedal pressed signals are contained in the 0x224 and 0x1D2 CAN messages,
- respectively. A rising edge of either signals triggers a disengagement, which is enforced by the
- panda firmware and by openpilot. Additionally, the cruise control system disengages on the rising edge of
- the brake pedal pressed signal.
-
- - The cruise control system state is contained in the 0x1D2 message. No control messages are
- allowed if the cruise control system is not active. This is enforced by openpilot and the
- panda firmware. The white led on the panda signifies if the panda is allowing control messages.
-
-GM/Chevrolet
-------
-
- - While the system is engaged, gas, brake and steer commands are subject to the same limits used by
- the stock system.
-
- - The gas and regen are controlled by the 0x2CB message and it's limited by the panda firmware and by
- openpilot to a value between 1404 and 3072. the minimum value correspond to a mild decel due to regen,
- while 3072 correspond to approximately 0.18g of acceleration from stop.
-
- - The friction brakes are controlled by the 0x315 message and its value is limited by the panda firmware
- and openpilot to 350. This is approximately 0.3g of braking.
-
- - Steering torque is controlled through the 0x180 CAN message and it's limited by the panda firmware and by
- openpilot to a value between -300 and 300. In addition, the vehicle EPS unit will fault for
- commands outside these limits. A steering torque rate limit is enforced by the panda firmware and by
- openpilot, so that the commanded steering torque must rise from 0 to max value no faster than
- 0.75s. Commanded steering torque is gradually limited by the panda firmware and by openpilot if the driver's
- torque exceeds 12 units in the opposite dicrection to ensure limited applied torque against the
- driver's will.
-
- - Brake pedal and gas pedal potentiometer signals are contained in the 0xF1 and 0x1A1 CAN messages,
- respectively. A rising edge of either signals triggers a disengagement, which is enforced by the
- panda firmware and by openpilot. Additionally, the cruise control system disengages on the rising edge of
- the brake pedal pressed signal. The regen paddle pressed signal is in the 0xBD message. When the
- regen paddle is pressed, a disengagement is enforced by both the firmware and by openpilot.
-
- - GM CAN uses both a counter and a checksum to ensure integrity and prevent
- replay of the same message.
-
-Hyundai/Kia (Lateral only)
-------
-
- - While the system is engaged, steer commands are subject to the same limits used by
- the stock system.
-
- - Steering torque is controlled through the 0x340 CAN message and it's limited by the panda firmware and by
- openpilot to a value between -255 and 255. In addition, the vehicle EPS unit will fault for
- commands outside the values of -409 and 409. A steering torque rate limit is enforced by the panda firmware and by
- openpilot, so that the commanded steering torque must rise from 0 to max value no faster than
- 0.85s. Commanded steering torque is gradually limited by the panda firmware and by openpilot if the driver's
- torque exceeds 50 units in the opposite dicrection to ensure limited applied torque against the
- driver's will.
-
-Chrysler/Jeep/Fiat (Lateral only)
-------
-
- - While the system is engaged, steer commands are subject to the same limits used by
- the stock system.
-
- - Steering torque is controlled through the 0x292 CAN message and it's limited by the panda firmware and by
- openpilot to a value between -261 and 261. In addition, the vehicle EPS unit will fault for
- commands outside these limits. A steering torque rate limit is enforced by the panda firmware and by
- openpilot, so that the commanded steering torque must rise from 0 to max value no faster than
- 0.87s. Commanded steering torque is limited by the panda firmware and by openpilot to be no more than 80
- units above the actual EPS generated motor torque to ensure limited differences between
- commanded and actual torques.
-
-Subaru (Lateral only)
-------
-
- - While the system is engaged, steer commands are subject to the same limits used by
- the stock system.
-
- - Steering torque is controlled through the 0x122 CAN message and it's limited by the panda firmware and by
- openpilot to a value between -255 and 255. In addition, the vehicle EPS unit will fault for
- commands outside the values of -2047 and 2047. A steering torque rate limit is enforced by the panda firmware and by
- openpilot, so that the commanded steering torque must rise from 0 to max value no faster than
- 0.41s. Commanded steering torque is gradually limited by the panda firmware and by openpilot if the driver's
- torque exceeds 60 units in the opposite dicrection to ensure limited applied torque against the
- driver's will.
-
-**Extra note**: comma.ai strongly discourages the use of openpilot forks with safety code either missing or
- not fully meeting the above requirements.
diff --git a/SConstruct b/SConstruct
new file mode 100644
index 00000000000000..14450cec9f8925
--- /dev/null
+++ b/SConstruct
@@ -0,0 +1,437 @@
+import os
+import shutil
+import subprocess
+import sys
+import sysconfig
+import platform
+import numpy as np
+
+TICI = os.path.isfile('/TICI')
+Decider('MD5-timestamp')
+
+AddOption('--test',
+ action='store_true',
+ help='build test files')
+
+AddOption('--extras',
+ action='store_true',
+ help='build misc extras, like setup and installer files')
+
+AddOption('--kaitai',
+ action='store_true',
+ help='Regenerate kaitai struct parsers')
+
+AddOption('--asan',
+ action='store_true',
+ help='turn on ASAN')
+
+AddOption('--ubsan',
+ action='store_true',
+ help='turn on UBSan')
+
+AddOption('--clazy',
+ action='store_true',
+ help='build with clazy')
+
+AddOption('--compile_db',
+ action='store_true',
+ help='build clang compilation database')
+
+AddOption('--snpe',
+ action='store_true',
+ help='use SNPE on PC')
+
+AddOption('--external-sconscript',
+ action='store',
+ metavar='FILE',
+ dest='external_sconscript',
+ help='add an external SConscript to the build')
+
+AddOption('--no-thneed',
+ action='store_true',
+ dest='no_thneed',
+ help='avoid using thneed')
+
+real_arch = arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip()
+if platform.system() == "Darwin":
+ arch = "Darwin"
+
+if arch == "aarch64" and TICI:
+ arch = "larch64"
+
+USE_WEBCAM = os.getenv("USE_WEBCAM") is not None
+
+lenv = {
+ "PATH": os.environ['PATH'],
+ "LD_LIBRARY_PATH": [Dir(f"#third_party/acados/{arch}/lib").abspath],
+ "PYTHONPATH": Dir("#").abspath + ":" + Dir("#pyextra/").abspath,
+
+ "ACADOS_SOURCE_DIR": Dir("#third_party/acados/acados").abspath,
+ "ACADOS_PYTHON_INTERFACE_PATH": Dir("#pyextra/acados_template").abspath,
+ "TERA_PATH": Dir("#").abspath + f"/third_party/acados/{arch}/t_renderer",
+}
+
+rpath = lenv["LD_LIBRARY_PATH"].copy()
+
+if arch == "aarch64" or arch == "larch64":
+ lenv["LD_LIBRARY_PATH"] += ['/data/data/com.termux/files/usr/lib']
+
+ if arch == "aarch64":
+ # android
+ lenv["ANDROID_DATA"] = os.environ['ANDROID_DATA']
+ lenv["ANDROID_ROOT"] = os.environ['ANDROID_ROOT']
+
+ cpppath = [
+ "#third_party/opencl/include",
+ ]
+
+ libpath = [
+ "/usr/local/lib",
+ "/usr/lib",
+ "/system/vendor/lib64",
+ "/system/comma/usr/lib",
+ f"#third_party/acados/{arch}/lib",
+ ]
+
+ if arch == "larch64":
+ libpath += [
+ "#third_party/snpe/larch64",
+ "#third_party/libyuv/larch64/lib",
+ "/usr/lib/aarch64-linux-gnu"
+ ]
+ cpppath += [
+ "#selfdrive/camerad/include",
+ ]
+ cflags = ["-DQCOM2", "-mcpu=cortex-a57"]
+ cxxflags = ["-DQCOM2", "-mcpu=cortex-a57"]
+ rpath += ["/usr/local/lib"]
+ else:
+ rpath = []
+ libpath += [
+ "#third_party/snpe/aarch64",
+ "#third_party/libyuv/lib",
+ "/system/vendor/lib64"
+ ]
+ cflags = ["-DQCOM", "-D_USING_LIBCXX", "-mcpu=cortex-a57"]
+ cxxflags = ["-DQCOM", "-D_USING_LIBCXX", "-mcpu=cortex-a57"]
+else:
+ cflags = []
+ cxxflags = []
+ cpppath = []
+
+ if arch == "Darwin":
+ yuv_dir = "mac" if real_arch != "arm64" else "mac_arm64"
+ libpath = [
+ f"#third_party/libyuv/{yuv_dir}/lib",
+ "/usr/local/lib",
+ "/opt/homebrew/lib",
+ "/usr/local/opt/openssl/lib",
+ "/opt/homebrew/opt/openssl/lib",
+ "/System/Library/Frameworks/OpenGL.framework/Libraries",
+ ]
+ cflags += ["-DGL_SILENCE_DEPRECATION"]
+ cxxflags += ["-DGL_SILENCE_DEPRECATION"]
+ cpppath += [
+ "/opt/homebrew/include",
+ "/usr/local/opt/openssl/include",
+ "/opt/homebrew/opt/openssl/include"
+ ]
+ else:
+ libpath = [
+ "#third_party/acados/x86_64/lib",
+ "#third_party/snpe/x86_64-linux-clang",
+ "#third_party/libyuv/x64/lib",
+ "#third_party/mapbox-gl-native-qt/x86_64",
+ "#cereal",
+ "#selfdrive/common",
+ "/usr/lib",
+ "/usr/local/lib",
+ ]
+
+ rpath += [
+ Dir("#third_party/snpe/x86_64-linux-clang").abspath,
+ Dir("#cereal").abspath,
+ Dir("#selfdrive/common").abspath
+ ]
+
+if GetOption('asan'):
+ ccflags = ["-fsanitize=address", "-fno-omit-frame-pointer"]
+ ldflags = ["-fsanitize=address"]
+elif GetOption('ubsan'):
+ ccflags = ["-fsanitize=undefined"]
+ ldflags = ["-fsanitize=undefined"]
+else:
+ ccflags = []
+ ldflags = []
+
+# no --as-needed on mac linker
+if arch != "Darwin":
+ ldflags += ["-Wl,--as-needed", "-Wl,--no-undefined"]
+
+# Enable swaglog include in submodules
+cflags += ["-DSWAGLOG"]
+cxxflags += ["-DSWAGLOG"]
+
+env = Environment(
+ ENV=lenv,
+ CCFLAGS=[
+ "-g",
+ "-fPIC",
+ "-O2",
+ "-Wunused",
+ "-Werror",
+ "-Wshadow",
+ "-Wno-unknown-warning-option",
+ "-Wno-deprecated-register",
+ "-Wno-register",
+ "-Wno-inconsistent-missing-override",
+ "-Wno-c99-designator",
+ "-Wno-reorder-init-list",
+ "-Wno-error=unused-but-set-variable",
+ ] + cflags + ccflags,
+
+ CPPPATH=cpppath + [
+ "#",
+ "#third_party/acados/include",
+ "#third_party/acados/include/blasfeo/include",
+ "#third_party/acados/include/hpipm/include",
+ "#third_party/catch2/include",
+ "#third_party/bzip2",
+ "#third_party/libyuv/include",
+ "#third_party/openmax/include",
+ "#third_party/json11",
+ "#third_party/curl/include",
+ "#third_party/libgralloc/include",
+ "#third_party/android_frameworks_native/include",
+ "#third_party/android_hardware_libhardware/include",
+ "#third_party/android_system_core/include",
+ "#third_party/linux/include",
+ "#third_party/snpe/include",
+ "#third_party/mapbox-gl-native-qt/include",
+ "#third_party/qrcode",
+ "#third_party",
+ "#cereal",
+ "#opendbc/can",
+ ],
+
+ CC='clang',
+ CXX='clang++',
+ LINKFLAGS=ldflags,
+
+ RPATH=rpath,
+
+ CFLAGS=["-std=gnu11"] + cflags,
+ CXXFLAGS=["-std=c++1z"] + cxxflags,
+ LIBPATH=libpath + [
+ "#cereal",
+ "#third_party",
+ "#opendbc/can",
+ "#selfdrive/boardd",
+ "#selfdrive/common",
+ ],
+ CYTHONCFILESUFFIX=".cpp",
+ COMPILATIONDB_USE_ABSPATH=True,
+ tools=["default", "cython", "compilation_db"],
+)
+
+if GetOption('compile_db'):
+ env.CompilationDatabase('compile_commands.json')
+
+# Setup cache dir
+cache_dir = '/data/scons_cache' if TICI else '/tmp/scons_cache'
+CacheDir(cache_dir)
+Clean(["."], cache_dir)
+
+node_interval = 5
+node_count = 0
+def progress_function(node):
+ global node_count
+ node_count += node_interval
+ sys.stderr.write("progress: %d\n" % node_count)
+
+if os.environ.get('SCONS_PROGRESS'):
+ Progress(progress_function, interval=node_interval)
+
+SHARED = False
+
+def abspath(x):
+ if arch == 'aarch64':
+ pth = os.path.join("/data/pythonpath", x[0].path)
+ env.Depends(pth, x)
+ return File(pth)
+ else:
+ # rpath works elsewhere
+ return x[0].path.rsplit("/", 1)[1][:-3]
+
+# Cython build enviroment
+py_include = sysconfig.get_paths()['include']
+envCython = env.Clone()
+envCython["CPPPATH"] += [py_include, np.get_include()]
+envCython["CCFLAGS"] += ["-Wno-#warnings", "-Wno-shadow", "-Wno-deprecated-declarations"]
+
+envCython["LIBS"] = []
+if arch == "Darwin":
+ envCython["LINKFLAGS"] = ["-bundle", "-undefined", "dynamic_lookup"]
+elif arch == "aarch64":
+ envCython["LINKFLAGS"] = ["-shared"]
+ envCython["LIBS"] = [os.path.basename(py_include)]
+else:
+ envCython["LINKFLAGS"] = ["-pthread", "-shared"]
+
+Export('envCython')
+
+# Qt build environment
+qt_env = env.Clone()
+qt_modules = ["Widgets", "Gui", "Core", "Network", "Concurrent", "Multimedia", "Quick", "Qml", "QuickWidgets", "Location", "Positioning"]
+if arch != "aarch64":
+ qt_modules += ["DBus"]
+
+qt_libs = []
+if arch == "Darwin":
+ if real_arch == "arm64":
+ qt_env['QTDIR'] = "/opt/homebrew/opt/qt@5"
+ else:
+ qt_env['QTDIR'] = "/usr/local/opt/qt@5"
+ qt_dirs = [
+ os.path.join(qt_env['QTDIR'], "include"),
+ ]
+ qt_dirs += [f"{qt_env['QTDIR']}/include/Qt{m}" for m in qt_modules]
+ qt_env["LINKFLAGS"] += ["-F" + os.path.join(qt_env['QTDIR'], "lib")]
+ qt_env["FRAMEWORKS"] += [f"Qt{m}" for m in qt_modules] + ["OpenGL"]
+elif arch == "aarch64":
+ qt_env['QTDIR'] = "/system/comma/usr"
+ qt_dirs = [
+ f"/system/comma/usr/include/qt",
+ ]
+ qt_dirs += [f"/system/comma/usr/include/qt/Qt{m}" for m in qt_modules]
+
+ qt_libs = [f"Qt5{m}" for m in qt_modules]
+ qt_libs += ['EGL', 'GLESv3', 'c++_shared']
+else:
+ qt_env['QTDIR'] = "/usr"
+ qt_dirs = [
+ f"/usr/include/{real_arch}-linux-gnu/qt5",
+ f"/usr/include/{real_arch}-linux-gnu/qt5/QtGui/5.12.8/QtGui",
+ ]
+ qt_dirs += [f"/usr/include/{real_arch}-linux-gnu/qt5/Qt{m}" for m in qt_modules]
+
+ qt_libs = [f"Qt5{m}" for m in qt_modules]
+ if arch == "larch64":
+ qt_libs += ["GLESv2", "wayland-client"]
+ elif arch != "Darwin":
+ qt_libs += ["GL"]
+
+qt_env.Tool('qt')
+qt_env['CPPPATH'] += qt_dirs + ["#selfdrive/ui/qt/"]
+qt_flags = [
+ "-D_REENTRANT",
+ "-DQT_NO_DEBUG",
+ "-DQT_WIDGETS_LIB",
+ "-DQT_GUI_LIB",
+ "-DQT_QUICK_LIB",
+ "-DQT_QUICKWIDGETS_LIB",
+ "-DQT_QML_LIB",
+ "-DQT_CORE_LIB",
+ "-DQT_MESSAGELOGCONTEXT",
+]
+qt_env['CXXFLAGS'] += qt_flags
+qt_env['LIBPATH'] += ['#selfdrive/ui']
+qt_env['LIBS'] = qt_libs
+
+if GetOption("clazy"):
+ checks = [
+ "level0",
+ "level1",
+ "no-range-loop",
+ "no-non-pod-global-static",
+ ]
+ qt_env['CXX'] = 'clazy'
+ qt_env['ENV']['CLAZY_IGNORE_DIRS'] = qt_dirs[0]
+ qt_env['ENV']['CLAZY_CHECKS'] = ','.join(checks)
+
+Export('env', 'qt_env', 'arch', 'real_arch', 'SHARED', 'USE_WEBCAM')
+
+SConscript(['selfdrive/common/SConscript'])
+Import('_common', '_gpucommon', '_gpu_libs')
+
+if SHARED:
+ common, gpucommon = abspath(common), abspath(gpucommon)
+else:
+ common = [_common, 'json11']
+ gpucommon = [_gpucommon] + _gpu_libs
+
+Export('common', 'gpucommon')
+
+# cereal and messaging are shared with the system
+SConscript(['cereal/SConscript'])
+if SHARED:
+ cereal = abspath([File('cereal/libcereal_shared.so')])
+ messaging = abspath([File('cereal/libmessaging_shared.so')])
+else:
+ cereal = [File('#cereal/libcereal.a')]
+ messaging = [File('#cereal/libmessaging.a')]
+ visionipc = [File('#cereal/libvisionipc.a')]
+
+Export('cereal', 'messaging', 'visionipc')
+
+# Build rednose library and ekf models
+
+rednose_config = {
+ 'generated_folder': '#selfdrive/locationd/models/generated',
+ 'to_build': {
+ 'live': ('#selfdrive/locationd/models/live_kf.py', True, ['live_kf_constants.h']),
+ 'car': ('#selfdrive/locationd/models/car_kf.py', True, []),
+ },
+}
+
+if arch not in ["aarch64", "larch64"]:
+ rednose_config['to_build'].update({
+ 'gnss': ('#selfdrive/locationd/models/gnss_kf.py', True, []),
+ 'loc_4': ('#selfdrive/locationd/models/loc_kf.py', True, []),
+ 'pos_computer_4': ('#rednose/helpers/lst_sq_computer.py', False, []),
+ 'pos_computer_5': ('#rednose/helpers/lst_sq_computer.py', False, []),
+ 'feature_handler_5': ('#rednose/helpers/feature_handler.py', False, []),
+ 'lane': ('#xx/pipeline/lib/ekf/lane_kf.py', True, []),
+ })
+
+Export('rednose_config')
+SConscript(['rednose/SConscript'])
+
+# Build openpilot
+
+SConscript(['cereal/SConscript'])
+SConscript(['panda/board/SConscript'])
+SConscript(['opendbc/can/SConscript'])
+
+SConscript(['third_party/SConscript'])
+
+SConscript(['common/SConscript'])
+SConscript(['common/kalman/SConscript'])
+SConscript(['common/transformations/SConscript'])
+
+SConscript(['selfdrive/camerad/SConscript'])
+SConscript(['selfdrive/modeld/SConscript'])
+
+SConscript(['selfdrive/controls/lib/cluster/SConscript'])
+SConscript(['selfdrive/controls/lib/lateral_mpc_lib/SConscript'])
+SConscript(['selfdrive/controls/lib/longitudinal_mpc_lib/SConscript'])
+
+SConscript(['selfdrive/boardd/SConscript'])
+SConscript(['selfdrive/proclogd/SConscript'])
+SConscript(['selfdrive/clocksd/SConscript'])
+
+SConscript(['selfdrive/loggerd/SConscript'])
+
+SConscript(['selfdrive/locationd/SConscript'])
+SConscript(['selfdrive/sensord/SConscript'])
+SConscript(['selfdrive/ui/SConscript'])
+
+if arch != "Darwin":
+ SConscript(['selfdrive/logcatd/SConscript'])
+
+if GetOption('test'):
+ SConscript('panda/tests/safety/SConscript')
+
+external_sconscript = GetOption('external_sconscript')
+if external_sconscript:
+ SConscript([external_sconscript])
diff --git a/apk/ai.comma.plus.black.apk b/apk/ai.comma.plus.black.apk
deleted file mode 100644
index 94b3a6a1915a8c..00000000000000
Binary files a/apk/ai.comma.plus.black.apk and /dev/null differ
diff --git a/apk/ai.comma.plus.frame.apk b/apk/ai.comma.plus.frame.apk
deleted file mode 100644
index 374862a792d77a..00000000000000
Binary files a/apk/ai.comma.plus.frame.apk and /dev/null differ
diff --git a/apk/ai.comma.plus.offroad.apk b/apk/ai.comma.plus.offroad.apk
deleted file mode 100644
index 41920230b4fa09..00000000000000
Binary files a/apk/ai.comma.plus.offroad.apk and /dev/null differ
diff --git a/cereal/.gitignore b/cereal/.gitignore
index 3f6de09fb90f69..14cd02efff2110 100644
--- a/cereal/.gitignore
+++ b/cereal/.gitignore
@@ -1,6 +1,21 @@
gen
node_modules
package-lock.json
+*.tmp
*.pyc
__pycache__
+.*.swp
+.*.swo
+*.os
+*.o
+*.a
+test_runner
+
+libmessaging.*
+libmessaging_shared.*
+services.h
+.sconsign.dblite
+libcereal_shared.*
+.mypy_cache/
+catch2/
diff --git a/cereal/Makefile b/cereal/Makefile
deleted file mode 100644
index 83318bef33d0ad..00000000000000
--- a/cereal/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-PWD := $(shell pwd)
-
-SRCS := log.capnp car.capnp
-
-GENS := gen/cpp/car.capnp.c++ gen/cpp/log.capnp.c++
-JS := gen/js/car.capnp.js gen/js/log.capnp.js
-
-UNAME_M ?= $(shell uname -m)
-
-GENS += gen/c/car.capnp.c gen/c/log.capnp.c gen/c/include/c++.capnp.h gen/c/include/java.capnp.h
-
-ifeq ($(UNAME_M),x86_64)
-
-ifneq (, $(shell which capnpc-java))
-GENS += gen/java/Car.java gen/java/Log.java
-else
-$(warning capnpc-java not found, skipping java build)
-endif
-
-endif
-
-
-ifeq ($(UNAME_M),aarch64)
-CAPNPC=PATH=$(PWD)/../phonelibs/capnp-cpp/aarch64/bin/:$$PATH capnpc
-else
-CAPNPC=capnpc
-endif
-
-.PHONY: all
-all: $(GENS)
-js: $(JS)
-
-.PHONY: clean
-clean:
- rm -rf gen
- rm -rf node_modules
- rm -rf package-lock.json
-
-gen/c/%.capnp.c: %.capnp
- @echo "[ CAPNPC C ] $@"
- mkdir -p gen/c/
- $(CAPNPC) '$<' -o c:gen/c/
-
-gen/js/%.capnp.js: %.capnp
- @echo "[ CAPNPC JavaScript ] $@"
- mkdir -p gen/js/
- sh ./generate_javascript.sh
-
-gen/cpp/%.capnp.c++: %.capnp
- @echo "[ CAPNPC C++ ] $@"
- mkdir -p gen/cpp/
- $(CAPNPC) '$<' -o c++:gen/cpp/
-
-gen/java/Car.java gen/java/Log.java: $(SRCS)
- @echo "[ CAPNPC java ] $@"
- mkdir -p gen/java/
- $(CAPNPC) $^ -o java:gen/java
-
-# c-capnproto needs some empty headers
-gen/c/include/c++.capnp.h gen/c/include/java.capnp.h:
- mkdir -p gen/c/include
- touch '$@'
diff --git a/cereal/SConscript b/cereal/SConscript
new file mode 100644
index 00000000000000..df066dc514309f
--- /dev/null
+++ b/cereal/SConscript
@@ -0,0 +1,72 @@
+Import('env', 'envCython', 'arch', 'common')
+
+import shutil
+
+cereal_dir = Dir('.')
+gen_dir = Dir('gen')
+messaging_dir = Dir('messaging')
+
+# Build cereal
+
+schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp']
+env.Command(["gen/c/include/c++.capnp.h"], [], "mkdir -p " + gen_dir.path + "/c/include && touch $TARGETS")
+env.Command([f'gen/cpp/{s}.c++' for s in schema_files] + [f'gen/cpp/{s}.h' for s in schema_files],
+ schema_files,
+ f"capnpc --src-prefix={cereal_dir.path} $SOURCES -o c++:{gen_dir.path}/cpp/")
+
+# TODO: remove non shared cereal and messaging
+cereal_objects = env.SharedObject([f'gen/cpp/{s}.c++' for s in schema_files])
+
+env.Library('cereal', cereal_objects)
+env.SharedLibrary('cereal_shared', cereal_objects)
+
+# Build messaging
+
+services_h = env.Command(['services.h'], ['services.py'], 'python3 ' + cereal_dir.path + '/services.py > $TARGET')
+
+messaging_objects = env.SharedObject([
+ 'messaging/messaging.cc',
+ 'messaging/impl_zmq.cc',
+ 'messaging/impl_msgq.cc',
+ 'messaging/msgq.cc',
+ 'messaging/socketmaster.cc',
+])
+
+messaging_lib = env.Library('messaging', messaging_objects)
+Depends('messaging/impl_zmq.cc', services_h)
+
+env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, 'zmq', common])
+Depends('messaging/bridge.cc', services_h)
+
+envCython.Program('messaging/messaging_pyx.so', 'messaging/messaging_pyx.pyx', LIBS=envCython["LIBS"]+[messaging_lib, "zmq", common])
+
+
+# Build Vision IPC
+vipc_sources = [
+ 'visionipc/ipc.cc',
+ 'visionipc/visionipc_server.cc',
+ 'visionipc/visionipc_client.cc',
+ 'visionipc/visionbuf.cc',
+]
+
+if arch in ["aarch64", "larch64"]:
+ vipc_sources += ['visionipc/visionbuf_ion.cc']
+else:
+ vipc_sources += ['visionipc/visionbuf_cl.cc']
+
+vipc_objects = env.SharedObject(vipc_sources)
+vipc = env.Library('visionipc', vipc_objects)
+
+
+libs = envCython["LIBS"]+["OpenCL", "zmq", vipc, messaging_lib, common]
+if arch == "aarch64":
+ libs += ["adreno_utils"]
+if arch == "Darwin":
+ del libs[libs.index('OpenCL')]
+ envCython['FRAMEWORKS'] += ['OpenCL']
+envCython.Program('visionipc/visionipc_pyx.so', 'visionipc/visionipc_pyx.pyx', LIBS=libs)
+
+
+if GetOption('test'):
+ env.Program('messaging/test_runner', ['messaging/test_runner.cc', 'messaging/msgq_tests.cc'], LIBS=[messaging_lib, common])
+ env.Program('visionipc/test_runner', ['visionipc/test_runner.cc', 'visionipc/visionipc_tests.cc'], LIBS=[vipc, messaging_lib, 'zmq', 'pthread', 'OpenCL', common])
diff --git a/cereal/__init__.py b/cereal/__init__.py
index 2d3b48526b2c34..88a181cbc51da4 100644
--- a/cereal/__init__.py
+++ b/cereal/__init__.py
@@ -1,3 +1,4 @@
+# pylint: skip-file
import os
import capnp
diff --git a/cereal/car.capnp b/cereal/car.capnp
index f30b20f9770283..5c8c339b74b3fe 100644
--- a/cereal/car.capnp
+++ b/cereal/car.capnp
@@ -1,31 +1,27 @@
using Cxx = import "./include/c++.capnp";
$Cxx.namespace("cereal");
-using Java = import "./include/java.capnp";
-$Java.package("ai.comma.openpilot.cereal");
-$Java.outerClassname("Car");
-
@0x8e2af1e708af8b8d;
# ******* events causing controls state machine transition *******
struct CarEvent @0x9b1657f34caf3ad3 {
name @0 :EventName;
+
+ # event types
enable @1 :Bool;
noEntry @2 :Bool;
- warning @3 :Bool;
+ warning @3 :Bool; # alerts presented only when enabled or soft disabling
userDisable @4 :Bool;
softDisable @5 :Bool;
immediateDisable @6 :Bool;
preEnable @7 :Bool;
- permanent @8 :Bool;
+ permanent @8 :Bool; # alerts presented regardless of openpilot state
enum EventName @0xbaa8c5d505f727de {
- # TODO: copy from error list
canError @0;
steerUnavailable @1;
brakeUnavailable @2;
- gasUnavailable @3;
wrongGear @4;
doorOpen @5;
seatbeltNotLatched @6;
@@ -37,8 +33,6 @@ struct CarEvent @0x9b1657f34caf3ad3 {
buttonEnable @12;
pedalPressed @13;
cruiseDisabled @14;
- radarCanError @15;
- dataNeeded @16;
speedTooLow @17;
outOfSpace @18;
overheat @19;
@@ -49,33 +43,90 @@ struct CarEvent @0x9b1657f34caf3ad3 {
pcmDisable @24;
noTarget @25;
radarFault @26;
- modelCommIssueDEPRECATED @27;
brakeHold @28;
parkBrake @29;
manualRestart @30;
lowSpeedLockout @31;
plannerError @32;
- ipasOverride @33;
- debugAlert @34;
- steerTempUnavailableMute @35;
+ joystickDebug @34;
+ steerTempUnavailableSilent @35;
resumeRequired @36;
preDriverDistracted @37;
promptDriverDistracted @38;
driverDistracted @39;
- geofence @40;
- driverMonitorOn @41;
- driverMonitorOff @42;
preDriverUnresponsive @43;
promptDriverUnresponsive @44;
driverUnresponsive @45;
belowSteerSpeed @46;
- calibrationProgress @47;
lowBattery @48;
- invalidGiraffeHonda @49;
vehicleModelInvalid @50;
- controlsFailed @51;
+ accFaulted @51;
sensorDataInvalid @52;
commIssue @53;
+ tooDistracted @54;
+ posenetInvalid @55;
+ soundsUnavailable @56;
+ preLaneChangeLeft @57;
+ preLaneChangeRight @58;
+ laneChange @59;
+ communityFeatureDisallowed @62;
+ lowMemory @63;
+ stockAeb @64;
+ ldw @65;
+ carUnrecognized @66;
+ invalidLkasSetting @69;
+ speedTooHigh @70;
+ laneChangeBlocked @71;
+ relayMalfunction @72;
+ gasPressed @73;
+ stockFcw @74;
+ startup @75;
+ startupNoCar @76;
+ startupNoControl @77;
+ startupMaster @78;
+ startupNoFw @104;
+ fcw @79;
+ steerSaturated @80;
+ belowEngageSpeed @84;
+ noGps @85;
+ wrongCruiseMode @87;
+ modeldLagging @89;
+ deviceFalling @90;
+ fanMalfunction @91;
+ cameraMalfunction @92;
+ gpsMalfunction @94;
+ processNotRunning @95;
+ dashcamMode @96;
+ controlsInitializing @98;
+ usbError @99;
+ roadCameraError @100;
+ driverCameraError @101;
+ wideRoadCameraError @102;
+ localizerMalfunction @103;
+ highCpuUsage @105;
+ cruiseMismatch @106;
+
+ driverMonitorLowAccDEPRECATED @68;
+ radarCanErrorDEPRECATED @15;
+ radarCommIssueDEPRECATED @67;
+ gasUnavailableDEPRECATED @3;
+ dataNeededDEPRECATED @16;
+ modelCommIssueDEPRECATED @27;
+ ipasOverrideDEPRECATED @33;
+ geofenceDEPRECATED @40;
+ driverMonitorOnDEPRECATED @41;
+ driverMonitorOffDEPRECATED @42;
+ calibrationProgressDEPRECATED @47;
+ invalidGiraffeHondaDEPRECATED @49;
+ invalidGiraffeToyotaDEPRECATED @60;
+ internetConnectivityNeededDEPRECATED @61;
+ whitePandaUnsupportedDEPRECATED @81;
+ commIssueWarningDEPRECATED @83;
+ focusRecoverActiveDEPRECATED @86;
+ neosUpdateRequiredDEPRECATED @88;
+ modelLagWarningDEPRECATED @93;
+ startupOneplusDEPRECATED @82;
+ startupFuzzyFingerprintDEPRECATED @97;
}
}
@@ -83,7 +134,6 @@ struct CarEvent @0x9b1657f34caf3ad3 {
# all speeds in m/s
struct CarState {
- errorsDEPRECATED @0 :List(CarEvent.EventName);
events @13 :List(CarEvent);
# car speed
@@ -95,19 +145,27 @@ struct CarState {
wheelSpeeds @2 :WheelSpeeds;
# gas pedal, 0.0-1.0
- gas @3 :Float32; # this is user + computer
+ gas @3 :Float32; # this is user pedal only
gasPressed @4 :Bool; # this is user pedal only
# brake pedal, 0.0-1.0
brake @5 :Float32; # this is user pedal only
brakePressed @6 :Bool; # this is user pedal only
- brakeLights @19 :Bool;
+ brakeHoldActive @38 :Bool;
# steering wheel
- steeringAngle @7 :Float32; # deg
- steeringRate @15 :Float32; # deg/s
- steeringTorque @8 :Float32; # TODO: standardize units
- steeringPressed @9 :Bool; # if the user is using the steering wheel
+ steeringAngleDeg @7 :Float32;
+ steeringAngleOffsetDeg @37 :Float32; # Offset betweens sensors in case there multiple
+ steeringRateDeg @15 :Float32;
+ steeringTorque @8 :Float32; # TODO: standardize units
+ steeringTorqueEps @27 :Float32; # TODO: standardize units
+ steeringPressed @9 :Bool; # if the user is using the steering wheel
+ steeringRateLimited @29 :Bool; # if the torque is limited by the rate limiter
+ steerWarning @35 :Bool; # temporary steer unavailble
+ steerError @36 :Bool; # permanent steer error
+ stockAeb @30 :Bool;
+ stockFcw @31 :Bool;
+ espDisabled @32 :Bool;
# cruise state
cruiseState @10 :CruiseState;
@@ -126,9 +184,16 @@ struct CarState {
seatbeltUnlatched @25 :Bool;
canValid @26 :Bool;
+ # clutch (manual transmission only)
+ clutchPressed @28 :Bool;
+
# which packets this state came from
canMonoTimes @12: List(UInt64);
+ # blindspot sensors
+ leftBlindspot @33 :Bool; # Is there something blocking the left lane change
+ rightBlindspot @34 :Bool; # Is there something blocking the right lane change
+
struct WheelSpeeds {
# optional wheel speeds
fl @0 :Float32;
@@ -143,6 +208,7 @@ struct CarState {
available @2 :Bool;
speedOffset @3 :Float32;
standstill @4 :Bool;
+ nonAdaptive @5 :Bool;
}
enum GearShifter {
@@ -154,9 +220,10 @@ struct CarState {
sport @5;
low @6;
brake @7;
+ eco @8;
+ manumatic @9;
}
-
# send on change
struct ButtonEvent {
pressed @0 :Bool;
@@ -172,8 +239,14 @@ struct CarState {
altButton1 @6;
altButton2 @7;
altButton3 @8;
+ setCruise @9;
+ resumeCruise @10;
+ gapAdjustCruise @11;
}
}
+
+ errorsDEPRECATED @0 :List(CarEvent.EventName);
+ brakeLightsDEPRECATED @19 :Bool;
}
# ******* radar state @ 20hz *******
@@ -217,22 +290,31 @@ struct CarControl {
enabled @0 :Bool;
active @7 :Bool;
- gasDEPRECATED @1 :Float32;
- brakeDEPRECATED @2 :Float32;
- steeringTorqueDEPRECATED @3 :Float32;
-
actuators @6 :Actuators;
+ roll @8 :Float32;
+ pitch @9 :Float32;
cruiseControl @4 :CruiseControl;
hudControl @5 :HUDControl;
struct Actuators {
# range from 0.0 - 1.0
- gas @0: Float32;
- brake @1: Float32;
+ gasDEPRECATED @0: Float32;
+ brakeDEPRECATED @1: Float32;
# range from -1.0 - 1.0
steer @2: Float32;
- steerAngle @3: Float32;
+ steeringAngleDeg @3: Float32;
+
+ accel @4: Float32; # m/s^2
+ longControlState @5: LongControlState;
+
+ enum LongControlState @0xe40f3a917d908282{
+ off @0;
+ pid @1;
+ stopping @2;
+ starting @3;
+ }
+
}
struct CruiseControl {
@@ -264,21 +346,28 @@ struct CarControl {
wrongGear @4;
seatbeltUnbuckled @5;
speedTooHigh @6;
+ ldw @7;
}
enum AudibleAlert {
- # these are the choices from the Honda
- # map as good as you can for your car
none @0;
- chimeEngage @1;
- chimeDisengage @2;
- chimeError @3;
- chimeWarning1 @4;
- chimeWarning2 @5;
- chimeWarningRepeat @6;
- chimePrompt @7;
+
+ engage @1;
+ disengage @2;
+ refuse @3;
+
+ warningSoft @4;
+ warningImmediate @5;
+
+ prompt @6;
+ promptRepeat @7;
+ promptDistracted @8;
}
}
+
+ gasDEPRECATED @1 :Float32;
+ brakeDEPRECATED @2 :Float32;
+ steeringTorqueDEPRECATED @3 :Float32;
}
# ****** car param ******
@@ -286,32 +375,33 @@ struct CarControl {
struct CarParams {
carName @0 :Text;
carFingerprint @1 :Text;
+ fuzzyFingerprint @55 :Bool;
enableGasInterceptor @2 :Bool;
- enableCruise @3 :Bool;
- enableCamera @4 :Bool;
- enableDsu @5 :Bool; # driving support unit
- enableApgs @6 :Bool; # advanced parking guidance system
+ pcmCruise @3 :Bool; # is openpilot's state tied to the PCM's cruise state?
+ enableDsu @5 :Bool; # driving support unit
+ enableApgs @6 :Bool; # advanced parking guidance system
+ enableBsm @56 :Bool; # blind spot monitoring
+ flags @64 :UInt32; # flags for car specific quirks
minEnableSpeed @7 :Float32;
minSteerSpeed @8 :Float32;
- safetyModel @9 :SafetyModel;
- safetyParam @10 :Int16;
+ maxSteeringAngleDeg @54 :Float32;
+ safetyConfigs @62 :List(SafetyConfig);
steerMaxBP @11 :List(Float32);
steerMaxV @12 :List(Float32);
- gasMaxBP @13 :List(Float32);
- gasMaxV @14 :List(Float32);
- brakeMaxBP @15 :List(Float32);
- brakeMaxV @16 :List(Float32);
-
+ gasMaxBPDEPRECATED @13 :List(Float32);
+ gasMaxVDEPRECATED @14 :List(Float32);
+ brakeMaxBPDEPRECATED @15 :List(Float32);
+ brakeMaxVDEPRECATED @16 :List(Float32);
# things about the car in the manual
- mass @17 :Float32; # [kg] running weight
- wheelbase @18 :Float32; # [m] distance from rear to front axle
- centerToFront @19 :Float32; # [m] GC distance to front axle
- steerRatio @20 :Float32; # [] ratio between front wheels and steering wheel angles
- steerRatioRear @21 :Float32; # [] rear steering ratio wrt front steering (usually 0)
+ mass @17 :Float32; # [kg] curb weight: all fluids no cargo
+ wheelbase @18 :Float32; # [m] distance from rear axle to front axle
+ centerToFront @19 :Float32; # [m] distance from center of mass to front axle
+ steerRatio @20 :Float32; # [] ratio of steering wheel angle to front wheel angle
+ steerRatioRear @21 :Float32; # [] ratio of steering wheel angle to rear wheel angle (usually 0)
# things we can derive
rotationalInertia @22 :Float32; # [kg*m2] body rotational inertia
@@ -319,24 +409,54 @@ struct CarParams {
tireStiffnessRear @24 :Float32; # [N/rad] rear tire coeff of stiff
longitudinalTuning @25 :LongitudinalPIDTuning;
+ lateralParams @48 :LateralParams;
lateralTuning :union {
pid @26 :LateralPIDTuning;
indi @27 :LateralINDITuning;
+ lqr @40 :LateralLQRTuning;
}
steerLimitAlert @28 :Bool;
+ steerLimitTimer @47 :Float32; # time before steerLimitAlert is issued
vEgoStopping @29 :Float32; # Speed at which the car goes into stopping state
+ vEgoStarting @59 :Float32; # Speed at which the car goes into starting state
directAccelControl @30 :Bool; # Does the car have direct accel control or just gas/brake
stoppingControl @31 :Bool; # Does the car allows full control even at lows speeds when stopping
startAccel @32 :Float32; # Required acceleraton to overcome creep braking
+ stopAccel @60 :Float32; # Required acceleraton to keep vehicle stationary
steerRateCost @33 :Float32; # Lateral MPC cost on steering rate
steerControlType @34 :SteerControlType;
radarOffCan @35 :Bool; # True when radar objects aren't visible on CAN
+ minSpeedCan @51 :Float32; # Minimum vehicle speed from CAN (below this value drops to 0)
+ stoppingDecelRate @52 :Float32; # m/s^2/s while trying to stop
+ startingAccelRate @53 :Float32; # m/s^2/s while trying to start
steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds
+ longitudinalActuatorDelayLowerBound @61 :Float32; # Gas/Brake actuator delay in seconds, lower bound
+ longitudinalActuatorDelayUpperBound @58 :Float32; # Gas/Brake actuator delay in seconds, upper bound
openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control?
carVin @38 :Text; # VIN number queried during fingerprinting
+ dashcamOnly @41: Bool;
+ transmissionType @43 :TransmissionType;
+ carFw @44 :List(CarFw);
+
+ radarTimeStep @45: Float32 = 0.05; # time delta between radar updates, 20Hz is very standard
+ communityFeature @46: Bool; # true if a community maintained feature is detected
+ fingerprintSource @49: FingerprintSource;
+ networkLocation @50 :NetworkLocation; # Where Panda/C2 is integrated into the car's CAN network
+
+ wheelSpeedFactor @63 :Float32; # Multiplier on wheels speeds to computer actual speeds
+
+ struct SafetyConfig {
+ safetyModel @0 :SafetyModel;
+ safetyParam @1 :Int16;
+ }
+
+ struct LateralParams {
+ torqueBP @0 :List(Int32);
+ torqueV @1 :List(Int32);
+ }
struct LateralPIDTuning {
kpBP @0 :List(Float32);
@@ -355,33 +475,124 @@ struct CarParams {
deadzoneV @5 :List(Float32);
}
-
struct LateralINDITuning {
- outerLoopGain @0 :Float32;
- innerLoopGain @1 :Float32;
- timeConstant @2 :Float32;
- actuatorEffectiveness @3 :Float32;
+ outerLoopGainBP @4 :List(Float32);
+ outerLoopGainV @5 :List(Float32);
+ innerLoopGainBP @6 :List(Float32);
+ innerLoopGainV @7 :List(Float32);
+ timeConstantBP @8 :List(Float32);
+ timeConstantV @9 :List(Float32);
+ actuatorEffectivenessBP @10 :List(Float32);
+ actuatorEffectivenessV @11 :List(Float32);
+
+ outerLoopGainDEPRECATED @0 :Float32;
+ innerLoopGainDEPRECATED @1 :Float32;
+ timeConstantDEPRECATED @2 :Float32;
+ actuatorEffectivenessDEPRECATED @3 :Float32;
}
+ struct LateralLQRTuning {
+ scale @0 :Float32;
+ ki @1 :Float32;
+ dcGain @2 :Float32;
+
+ # State space system
+ a @3 :List(Float32);
+ b @4 :List(Float32);
+ c @5 :List(Float32);
+
+ k @6 :List(Float32); # LQR gain
+ l @7 :List(Float32); # Kalman gain
+ }
enum SafetyModel {
- # does NOT match board setting
- noOutput @0;
- honda @1;
+ silent @0;
+ hondaNidec @1;
toyota @2;
elm327 @3;
gm @4;
- hondaBosch @5;
+ hondaBoschGiraffe @5;
ford @6;
cadillac @7;
hyundai @8;
chrysler @9;
tesla @10;
subaru @11;
+ gmPassive @12;
+ mazda @13;
+ nissan @14;
+ volkswagen @15;
+ toyotaIpas @16;
+ allOutput @17;
+ gmAscm @18;
+ noOutput @19; # like silent but without silent CAN TXs
+ hondaBosch @20;
+ volkswagenPq @21;
+ subaruLegacy @22; # pre-Global platform
+ hyundaiLegacy @23;
+ hyundaiCommunity @24;
+ stellantis @25;
}
enum SteerControlType {
torque @0;
angle @1;
}
+
+ enum TransmissionType {
+ unknown @0;
+ automatic @1; # Traditional auto, including DSG
+ manual @2; # True "stick shift" only
+ direct @3; # Electric vehicle or other direct drive
+ cvt @4;
+ }
+
+ struct CarFw {
+ ecu @0 :Ecu;
+ fwVersion @1 :Data;
+ address @2: UInt32;
+ subAddress @3: UInt8;
+ }
+
+ enum Ecu {
+ eps @0;
+ esp @1;
+ fwdRadar @2;
+ fwdCamera @3;
+ engine @4;
+ unknown @5;
+ transmission @8; # Transmission Control Module
+ srs @9; # airbag
+ gateway @10; # can gateway
+ hud @11; # heads up display
+ combinationMeter @12; # instrument cluster
+
+ # Toyota only
+ dsu @6;
+ apgs @7;
+
+ # Honda only
+ vsa @13; # Vehicle Stability Assist
+ programmedFuelInjection @14;
+ electricBrakeBooster @15;
+ shiftByWire @16;
+ }
+
+ enum FingerprintSource {
+ can @0;
+ fw @1;
+ fixed @2;
+ }
+
+ enum NetworkLocation {
+ fwdCamera @0; # Standard/default integration at LKAS camera
+ gateway @1; # Integration at vehicle's CAN gateway
+ }
+
+ enableCameraDEPRECATED @4 :Bool;
+ isPandaBlackDEPRECATED @39: Bool;
+ hasStockCameraDEPRECATED @57 :Bool;
+ safetyParamDEPRECATED @10 :Int16;
+ safetyModelDEPRECATED @9 :SafetyModel;
+ safetyModelPassiveDEPRECATED @42 :SafetyModel = silent;
}
diff --git a/cereal/generate_javascript.sh b/cereal/generate_javascript.sh
deleted file mode 100755
index d6525a64d95eed..00000000000000
--- a/cereal/generate_javascript.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-
-rm -r gen/ts
-rm -r gen/js
-
-mkdir gen/ts
-mkdir gen/js
-
-echo "Installing needed npm modules"
-npm i capnpc-ts capnp-ts
-
-capnpc -o node_modules/.bin/capnpc-ts:gen/ts log.capnp car.capnp
-capnpc -o node_modules/.bin/capnpc-ts:gen/ts car.capnp
-
-cat log.capnp | egrep '\([a-zA-Z]*\.[^\s]+\.[^s]+\)' | sed 's/^.*([a-zA-Z]*\.\([a-zA-Z.]*\)).*/\1/' | while read line
-do
- TOKEN=`echo $line | sed 's/\./_/g'`
- ROOT=`echo $line | sed 's/\..*$//g'`
- cat gen/ts/log.capnp.ts | grep '^import.*'${TOKEN}
- if [[ "$?" == "1" ]]
- then
- sed -i 's/^\(import {.*\)'${ROOT}'\(,*\) \(.*\)$/\1'${ROOT}', '${TOKEN}'\2 \3/' ./gen/ts/log.capnp.ts
- fi
-done
-
-tsc ./gen/ts/* --lib es2015 --outDir ./gen/js
diff --git a/cereal/include/java.capnp b/cereal/include/java.capnp
deleted file mode 100644
index cddf6eba3d9777..00000000000000
--- a/cereal/include/java.capnp
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2013-2015 Sandstorm Development Group, Inc. and contributors
-# Licensed under the MIT License:
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-
-@0xc5f1af96651f70ea;
-
-annotation package @0x9ee4c8f803b3b596 (file) : Text;
-# Name of the package, such as "org.example.foo", in which the generated code will reside.
-
-annotation outerClassname @0x9b066bb4881f7cd3 (file) : Text;
-# Name of the outer class that will wrap the generated code.
diff --git a/cereal/install_capnp.sh b/cereal/install_capnp.sh
deleted file mode 100755
index b83e1ffda1d221..00000000000000
--- a/cereal/install_capnp.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-set -e
-echo "Installing capnp"
-
-cd /tmp
-VERSION=0.6.1
-wget https://capnproto.org/capnproto-c++-${VERSION}.tar.gz
-tar xvf capnproto-c++-${VERSION}.tar.gz
-cd capnproto-c++-${VERSION}
-CXXFLAGS="-fPIC" ./configure
-
-make -j4
-
-# manually build binaries statically
-g++ -std=gnu++11 -I./src -I./src -DKJ_HEADER_WARNINGS -DCAPNP_HEADER_WARNINGS -DCAPNP_INCLUDE_DIR=\"/usr/local/include\" -pthread -O2 -DNDEBUG -pthread -pthread -o .libs/capnp src/capnp/compiler/module-loader.o src/capnp/compiler/capnp.o ./.libs/libcapnpc.a ./.libs/libcapnp.a ./.libs/libkj.a -lpthread -pthread
-
-g++ -std=gnu++11 -I./src -I./src -DKJ_HEADER_WARNINGS -DCAPNP_HEADER_WARNINGS -DCAPNP_INCLUDE_DIR=\"/usr/local/include\" -pthread -O2 -DNDEBUG -pthread -pthread -o .libs/capnpc-c++ src/capnp/compiler/capnpc-c++.o ./.libs/libcapnp.a ./.libs/libkj.a -lpthread -pthread
-
-g++ -std=gnu++11 -I./src -I./src -DKJ_HEADER_WARNINGS -DCAPNP_HEADER_WARNINGS -DCAPNP_INCLUDE_DIR=\"/usr/local/include\" -pthread -O2 -DNDEBUG -pthread -pthread -o .libs/capnpc-capnp src/capnp/compiler/capnpc-capnp.o ./.libs/libcapnp.a ./.libs/libkj.a -lpthread -pthread
-
-cp .libs/capnp /usr/local/bin/
-ln -s /usr/local/bin/capnp /usr/local/bin/capnpc
-cp .libs/capnpc-c++ /usr/local/bin/
-cp .libs/capnpc-capnp /usr/local/bin/
-cp .libs/*.a /usr/local/lib
-
-cd /tmp
-echo "Installing c-capnp"
-git clone https://github.com/commaai/c-capnproto.git
-cd c-capnproto
-git submodule update --init --recursive
-autoreconf -f -i -s
-CXXFLAGS="-fPIC" ./configure
-make -j4
-
-# manually build binaries statically
-gcc -fPIC -o .libs/capnpc-c compiler/capnpc-c.o compiler/schema.capnp.o compiler/str.o ./.libs/libcapnp_c.a
-
-cp .libs/capnpc-c /usr/local/bin/
-cp .libs/*.a /usr/local/lib
diff --git a/cereal/legacy.capnp b/cereal/legacy.capnp
new file mode 100644
index 00000000000000..9a489168162090
--- /dev/null
+++ b/cereal/legacy.capnp
@@ -0,0 +1,861 @@
+using Cxx = import "./include/c++.capnp";
+$Cxx.namespace("cereal");
+
+@0x80ef1ec4889c2a63;
+
+# legacy.capnp: a home for deprecated structs
+
+struct LogRotate @0x9811e1f38f62f2d1 {
+ segmentNum @0 :Int32;
+ path @1 :Text;
+}
+
+struct LiveUI @0xc08240f996aefced {
+ rearViewCam @0 :Bool;
+ alertText1 @1 :Text;
+ alertText2 @2 :Text;
+ awarenessStatus @3 :Float32;
+}
+
+struct UiLayoutState @0x88dcce08ad29dda0 {
+ activeApp @0 :App;
+ sidebarCollapsed @1 :Bool;
+ mapEnabled @2 :Bool;
+ mockEngaged @3 :Bool;
+
+ enum App @0x9917470acf94d285 {
+ home @0;
+ music @1;
+ nav @2;
+ settings @3;
+ none @4;
+ }
+}
+
+struct OrbslamCorrection @0x8afd33dc9b35e1aa {
+ correctionMonoTime @0 :UInt64;
+ prePositionECEF @1 :List(Float64);
+ postPositionECEF @2 :List(Float64);
+ prePoseQuatECEF @3 :List(Float32);
+ postPoseQuatECEF @4 :List(Float32);
+ numInliers @5 :UInt32;
+}
+
+struct EthernetPacket @0xa99a9d5b33cf5859 {
+ pkt @0 :Data;
+ ts @1 :Float32;
+}
+
+struct CellInfo @0xcff7566681c277ce {
+ timestamp @0 :UInt64;
+ repr @1 :Text; # android toString() for now
+}
+
+struct WifiScan @0xd4df5a192382ba0b {
+ bssid @0 :Text;
+ ssid @1 :Text;
+ capabilities @2 :Text;
+ frequency @3 :Int32;
+ level @4 :Int32;
+ timestamp @5 :Int64;
+
+ centerFreq0 @6 :Int32;
+ centerFreq1 @7 :Int32;
+ channelWidth @8 :ChannelWidth;
+ operatorFriendlyName @9 :Text;
+ venueName @10 :Text;
+ is80211mcResponder @11 :Bool;
+ passpoint @12 :Bool;
+
+ distanceCm @13 :Int32;
+ distanceSdCm @14 :Int32;
+
+ enum ChannelWidth @0xcb6a279f015f6b51 {
+ w20Mhz @0;
+ w40Mhz @1;
+ w80Mhz @2;
+ w160Mhz @3;
+ w80Plus80Mhz @4;
+ }
+}
+
+struct LiveEventData @0x94b7baa90c5c321e {
+ name @0 :Text;
+ value @1 :Int32;
+}
+
+struct ModelData @0xb8aad62cffef28a9 {
+ frameId @0 :UInt32;
+ frameAge @12 :UInt32;
+ frameDropPerc @13 :Float32;
+ timestampEof @9 :UInt64;
+ modelExecutionTime @14 :Float32;
+ gpuExecutionTime @16 :Float32;
+ rawPred @15 :Data;
+
+ path @1 :PathData;
+ leftLane @2 :PathData;
+ rightLane @3 :PathData;
+ lead @4 :LeadData;
+ freePath @6 :List(Float32);
+
+ settings @5 :ModelSettings;
+ leadFuture @7 :LeadData;
+ speed @8 :List(Float32);
+ meta @10 :MetaData;
+ longitudinal @11 :LongitudinalData;
+
+ struct PathData @0x8817eeea389e9f08 {
+ points @0 :List(Float32);
+ prob @1 :Float32;
+ std @2 :Float32;
+ stds @3 :List(Float32);
+ poly @4 :List(Float32);
+ validLen @5 :Float32;
+ }
+
+ struct LeadData @0xd1c9bef96d26fa91 {
+ dist @0 :Float32;
+ prob @1 :Float32;
+ std @2 :Float32;
+ relVel @3 :Float32;
+ relVelStd @4 :Float32;
+ relY @5 :Float32;
+ relYStd @6 :Float32;
+ relA @7 :Float32;
+ relAStd @8 :Float32;
+ }
+
+ struct ModelSettings @0xa26e3710efd3e914 {
+ bigBoxX @0 :UInt16;
+ bigBoxY @1 :UInt16;
+ bigBoxWidth @2 :UInt16;
+ bigBoxHeight @3 :UInt16;
+ boxProjection @4 :List(Float32);
+ yuvCorrection @5 :List(Float32);
+ inputTransform @6 :List(Float32);
+ }
+
+ struct MetaData @0x9744f25fb60f2bf8 {
+ engagedProb @0 :Float32;
+ desirePrediction @1 :List(Float32);
+ brakeDisengageProb @2 :Float32;
+ gasDisengageProb @3 :Float32;
+ steerOverrideProb @4 :Float32;
+ desireState @5 :List(Float32);
+ }
+
+ struct LongitudinalData @0xf98f999c6a071122 {
+ distances @2 :List(Float32);
+ speeds @0 :List(Float32);
+ accelerations @1 :List(Float32);
+ }
+}
+
+struct ECEFPoint @0xc25bbbd524983447 {
+ x @0 :Float64;
+ y @1 :Float64;
+ z @2 :Float64;
+}
+
+struct ECEFPointDEPRECATED @0xe10e21168db0c7f7 {
+ x @0 :Float32;
+ y @1 :Float32;
+ z @2 :Float32;
+}
+
+struct GPSPlannerPoints @0xab54c59699f8f9f3 {
+ curPosDEPRECATED @0 :ECEFPointDEPRECATED;
+ pointsDEPRECATED @1 :List(ECEFPointDEPRECATED);
+ curPos @6 :ECEFPoint;
+ points @7 :List(ECEFPoint);
+ valid @2 :Bool;
+ trackName @3 :Text;
+ speedLimit @4 :Float32;
+ accelTarget @5 :Float32;
+}
+
+struct GPSPlannerPlan @0xf5ad1d90cdc1dd6b {
+ valid @0 :Bool;
+ poly @1 :List(Float32);
+ trackName @2 :Text;
+ speed @3 :Float32;
+ acceleration @4 :Float32;
+ pointsDEPRECATED @5 :List(ECEFPointDEPRECATED);
+ points @6 :List(ECEFPoint);
+ xLookahead @7 :Float32;
+}
+
+struct UiNavigationEvent @0x90c8426c3eaddd3b {
+ type @0: Type;
+ status @1: Status;
+ distanceTo @2: Float32;
+ endRoadPointDEPRECATED @3: ECEFPointDEPRECATED;
+ endRoadPoint @4: ECEFPoint;
+
+ enum Type @0xe8db07dcf8fcea05 {
+ none @0;
+ laneChangeLeft @1;
+ laneChangeRight @2;
+ mergeLeft @3;
+ mergeRight @4;
+ turnLeft @5;
+ turnRight @6;
+ }
+
+ enum Status @0xb9aa88c75ef99a1f {
+ none @0;
+ passive @1;
+ approaching @2;
+ active @3;
+ }
+}
+
+struct LiveLocationData @0xb99b2bc7a57e8128 {
+ status @0 :UInt8;
+
+ # 3D fix
+ lat @1 :Float64;
+ lon @2 :Float64;
+ alt @3 :Float32; # m
+
+ # speed
+ speed @4 :Float32; # m/s
+
+ # NED velocity components
+ vNED @5 :List(Float32);
+
+ # roll, pitch, heading (x,y,z)
+ roll @6 :Float32; # WRT to center of earth?
+ pitch @7 :Float32; # WRT to center of earth?
+ heading @8 :Float32; # WRT to north?
+
+ # what are these?
+ wanderAngle @9 :Float32;
+ trackAngle @10 :Float32;
+
+ # car frame -- https://upload.wikimedia.org/wikipedia/commons/f/f5/RPY_angles_of_cars.png
+
+ # gyro, in car frame, deg/s
+ gyro @11 :List(Float32);
+
+ # accel, in car frame, m/s^2
+ accel @12 :List(Float32);
+
+ accuracy @13 :Accuracy;
+
+ source @14 :SensorSource;
+ # if we are fixing a location in the past
+ fixMonoTime @15 :UInt64;
+
+ gpsWeek @16 :Int32;
+ timeOfWeek @17 :Float64;
+
+ positionECEF @18 :List(Float64);
+ poseQuatECEF @19 :List(Float32);
+ pitchCalibration @20 :Float32;
+ yawCalibration @21 :Float32;
+ imuFrame @22 :List(Float32);
+
+ struct Accuracy @0x943dc4625473b03f {
+ pNEDError @0 :List(Float32);
+ vNEDError @1 :List(Float32);
+ rollError @2 :Float32;
+ pitchError @3 :Float32;
+ headingError @4 :Float32;
+ ellipsoidSemiMajorError @5 :Float32;
+ ellipsoidSemiMinorError @6 :Float32;
+ ellipsoidOrientationError @7 :Float32;
+ }
+
+ enum SensorSource @0xc871d3cc252af657 {
+ applanix @0;
+ kalman @1;
+ orbslam @2;
+ timing @3;
+ dummy @4;
+ }
+}
+
+struct OrbOdometry @0xd7700859ed1f5b76 {
+ # timing first
+ startMonoTime @0 :UInt64;
+ endMonoTime @1 :UInt64;
+
+ # fundamental matrix and error
+ f @2: List(Float64);
+ err @3: Float64;
+
+ # number of inlier points
+ inliers @4: Int32;
+
+ # for debug only
+ # indexed by endMonoTime features
+ # value is startMonoTime feature match
+ # -1 if no match
+ matches @5: List(Int16);
+}
+
+struct OrbFeatures @0xcd60164a8a0159ef {
+ timestampEof @0 :UInt64;
+ # transposed arrays of normalized image coordinates
+ # len(xs) == len(ys) == len(descriptors) * 32
+ xs @1 :List(Float32);
+ ys @2 :List(Float32);
+ descriptors @3 :Data;
+ octaves @4 :List(Int8);
+
+ # match index to last OrbFeatures
+ # -1 if no match
+ timestampLastEof @5 :UInt64;
+ matches @6: List(Int16);
+}
+
+struct OrbFeaturesSummary @0xd500d30c5803fa4f {
+ timestampEof @0 :UInt64;
+ timestampLastEof @1 :UInt64;
+
+ featureCount @2 :UInt16;
+ matchCount @3 :UInt16;
+ computeNs @4 :UInt64;
+}
+
+struct OrbKeyFrame @0xc8233c0345e27e24 {
+ # this is a globally unique id for the KeyFrame
+ id @0: UInt64;
+
+ # this is the location of the KeyFrame
+ pos @1: ECEFPoint;
+
+ # these are the features in the world
+ # len(dpos) == len(descriptors) * 32
+ dpos @2 :List(ECEFPoint);
+ descriptors @3 :Data;
+}
+
+struct KalmanOdometry @0x92e21bb7ea38793a {
+ trans @0 :List(Float32); # m/s in device frame
+ rot @1 :List(Float32); # rad/s in device frame
+ transStd @2 :List(Float32); # std m/s in device frame
+ rotStd @3 :List(Float32); # std rad/s in device frame
+}
+
+struct OrbObservation @0x9b326d4e436afec7 {
+ observationMonoTime @0 :UInt64;
+ normalizedCoordinates @1 :List(Float32);
+ locationECEF @2 :List(Float64);
+ matchDistance @3: UInt32;
+}
+
+struct CalibrationFeatures @0x8fdfadb254ea867a {
+ frameId @0 :UInt32;
+
+ p0 @1 :List(Float32);
+ p1 @2 :List(Float32);
+ status @3 :List(Int8);
+}
+
+struct NavStatus @0xbd8822120928120c {
+ isNavigating @0 :Bool;
+ currentAddress @1 :Address;
+
+ struct Address @0xce7cd672cacc7814 {
+ title @0 :Text;
+ lat @1 :Float64;
+ lng @2 :Float64;
+ house @3 :Text;
+ address @4 :Text;
+ street @5 :Text;
+ city @6 :Text;
+ state @7 :Text;
+ country @8 :Text;
+ }
+}
+
+struct NavUpdate @0xdb98be6565516acb {
+ isNavigating @0 :Bool;
+ curSegment @1 :Int32;
+ segments @2 :List(Segment);
+
+ struct LatLng @0x9eaef9187cadbb9b {
+ lat @0 :Float64;
+ lng @1 :Float64;
+ }
+
+ struct Segment @0xa5b39b4fc4d7da3f {
+ from @0 :LatLng;
+ to @1 :LatLng;
+ updateTime @2 :Int32;
+ distance @3 :Int32;
+ crossTime @4 :Int32;
+ exitNo @5 :Int32;
+ instruction @6 :Instruction;
+
+ parts @7 :List(LatLng);
+
+ enum Instruction @0xc5417a637451246f {
+ turnLeft @0;
+ turnRight @1;
+ keepLeft @2;
+ keepRight @3;
+ straight @4;
+ roundaboutExitNumber @5;
+ roundaboutExit @6;
+ roundaboutTurnLeft @7;
+ unkn8 @8;
+ roundaboutStraight @9;
+ unkn10 @10;
+ roundaboutTurnRight @11;
+ unkn12 @12;
+ roundaboutUturn @13;
+ unkn14 @14;
+ arrive @15;
+ exitLeft @16;
+ exitRight @17;
+ unkn18 @18;
+ uturn @19;
+ # ...
+ }
+ }
+}
+
+struct TrafficEvent @0xacfa74a094e62626 {
+ type @0 :Type;
+ distance @1 :Float32;
+ action @2 :Action;
+ resuming @3 :Bool;
+
+ enum Type @0xd85d75253435bf4b {
+ stopSign @0;
+ lightRed @1;
+ lightYellow @2;
+ lightGreen @3;
+ stopLight @4;
+ }
+
+ enum Action @0xa6f6ce72165ccb49 {
+ none @0;
+ yield @1;
+ stop @2;
+ resumeReady @3;
+ }
+
+}
+
+
+struct AndroidGnss @0xdfdf30d03fc485bd {
+ union {
+ measurements @0 :Measurements;
+ navigationMessage @1 :NavigationMessage;
+ }
+
+ struct Measurements @0xa20710d4f428d6cd {
+ clock @0 :Clock;
+ measurements @1 :List(Measurement);
+
+ struct Clock @0xa0e27b453a38f450 {
+ timeNanos @0 :Int64;
+ hardwareClockDiscontinuityCount @1 :Int32;
+
+ hasTimeUncertaintyNanos @2 :Bool;
+ timeUncertaintyNanos @3 :Float64;
+
+ hasLeapSecond @4 :Bool;
+ leapSecond @5 :Int32;
+
+ hasFullBiasNanos @6 :Bool;
+ fullBiasNanos @7 :Int64;
+
+ hasBiasNanos @8 :Bool;
+ biasNanos @9 :Float64;
+
+ hasBiasUncertaintyNanos @10 :Bool;
+ biasUncertaintyNanos @11 :Float64;
+
+ hasDriftNanosPerSecond @12 :Bool;
+ driftNanosPerSecond @13 :Float64;
+
+ hasDriftUncertaintyNanosPerSecond @14 :Bool;
+ driftUncertaintyNanosPerSecond @15 :Float64;
+ }
+
+ struct Measurement @0xd949bf717d77614d {
+ svId @0 :Int32;
+ constellation @1 :Constellation;
+
+ timeOffsetNanos @2 :Float64;
+ state @3 :Int32;
+ receivedSvTimeNanos @4 :Int64;
+ receivedSvTimeUncertaintyNanos @5 :Int64;
+ cn0DbHz @6 :Float64;
+ pseudorangeRateMetersPerSecond @7 :Float64;
+ pseudorangeRateUncertaintyMetersPerSecond @8 :Float64;
+ accumulatedDeltaRangeState @9 :Int32;
+ accumulatedDeltaRangeMeters @10 :Float64;
+ accumulatedDeltaRangeUncertaintyMeters @11 :Float64;
+
+ hasCarrierFrequencyHz @12 :Bool;
+ carrierFrequencyHz @13 :Float32;
+ hasCarrierCycles @14 :Bool;
+ carrierCycles @15 :Int64;
+ hasCarrierPhase @16 :Bool;
+ carrierPhase @17 :Float64;
+ hasCarrierPhaseUncertainty @18 :Bool;
+ carrierPhaseUncertainty @19 :Float64;
+ hasSnrInDb @20 :Bool;
+ snrInDb @21 :Float64;
+
+ multipathIndicator @22 :MultipathIndicator;
+
+ enum Constellation @0x9ef1f3ff0deb5ffb {
+ unknown @0;
+ gps @1;
+ sbas @2;
+ glonass @3;
+ qzss @4;
+ beidou @5;
+ galileo @6;
+ }
+
+ enum State @0xcbb9490adce12d72 {
+ unknown @0;
+ codeLock @1;
+ bitSync @2;
+ subframeSync @3;
+ towDecoded @4;
+ msecAmbiguous @5;
+ symbolSync @6;
+ gloStringSync @7;
+ gloTodDecoded @8;
+ bdsD2BitSync @9;
+ bdsD2SubframeSync @10;
+ galE1bcCodeLock @11;
+ galE1c2ndCodeLock @12;
+ galE1bPageSync @13;
+ sbasSync @14;
+ }
+
+ enum MultipathIndicator @0xc04e7b6231d4caa8 {
+ unknown @0;
+ detected @1;
+ notDetected @2;
+ }
+ }
+ }
+
+ struct NavigationMessage @0xe2517b083095fd4e {
+ type @0 :Int32;
+ svId @1 :Int32;
+ messageId @2 :Int32;
+ submessageId @3 :Int32;
+ data @4 :Data;
+ status @5 :Status;
+
+ enum Status @0xec1ff7996b35366f {
+ unknown @0;
+ parityPassed @1;
+ parityRebuilt @2;
+ }
+ }
+}
+
+struct QcomGnss @0xde94674b07ae51c1 {
+ logTs @0 :UInt64;
+ union {
+ measurementReport @1 :MeasurementReport;
+ clockReport @2 :ClockReport;
+ drMeasurementReport @3 :DrMeasurementReport;
+ drSvPoly @4 :DrSvPolyReport;
+ rawLog @5 :Data;
+ }
+
+ enum MeasurementSource @0xd71a12b6faada7ee {
+ gps @0;
+ glonass @1;
+ beidou @2;
+ }
+
+ enum SVObservationState @0xe81e829a0d6c83e9 {
+ idle @0;
+ search @1;
+ searchVerify @2;
+ bitEdge @3;
+ trackVerify @4;
+ track @5;
+ restart @6;
+ dpo @7;
+ glo10msBe @8;
+ glo10msAt @9;
+ }
+
+ struct MeasurementStatus @0xe501010e1bcae83b {
+ subMillisecondIsValid @0 :Bool;
+ subBitTimeIsKnown @1 :Bool;
+ satelliteTimeIsKnown @2 :Bool;
+ bitEdgeConfirmedFromSignal @3 :Bool;
+ measuredVelocity @4 :Bool;
+ fineOrCoarseVelocity @5 :Bool;
+ lockPointValid @6 :Bool;
+ lockPointPositive @7 :Bool;
+ lastUpdateFromDifference @8 :Bool;
+ lastUpdateFromVelocityDifference @9 :Bool;
+ strongIndicationOfCrossCorelation @10 :Bool;
+ tentativeMeasurement @11 :Bool;
+ measurementNotUsable @12 :Bool;
+ sirCheckIsNeeded @13 :Bool;
+ probationMode @14 :Bool;
+
+ glonassMeanderBitEdgeValid @15 :Bool;
+ glonassTimeMarkValid @16 :Bool;
+
+ gpsRoundRobinRxDiversity @17 :Bool;
+ gpsRxDiversity @18 :Bool;
+ gpsLowBandwidthRxDiversityCombined @19 :Bool;
+ gpsHighBandwidthNu4 @20 :Bool;
+ gpsHighBandwidthNu8 @21 :Bool;
+ gpsHighBandwidthUniform @22 :Bool;
+ multipathIndicator @23 :Bool;
+
+ imdJammingIndicator @24 :Bool;
+ lteB13TxJammingIndicator @25 :Bool;
+ freshMeasurementIndicator @26 :Bool;
+
+ multipathEstimateIsValid @27 :Bool;
+ directionIsValid @28 :Bool;
+ }
+
+ struct MeasurementReport @0xf580d7d86b7b8692 {
+ source @0 :MeasurementSource;
+
+ fCount @1 :UInt32;
+
+ gpsWeek @2 :UInt16;
+ glonassCycleNumber @3 :UInt8;
+ glonassNumberOfDays @4 :UInt16;
+
+ milliseconds @5 :UInt32;
+ timeBias @6 :Float32;
+ clockTimeUncertainty @7 :Float32;
+ clockFrequencyBias @8 :Float32;
+ clockFrequencyUncertainty @9 :Float32;
+
+ sv @10 :List(SV);
+
+ struct SV @0xf10c595ae7bb2c27 {
+ svId @0 :UInt8;
+ observationState @2 :SVObservationState;
+ observations @3 :UInt8;
+ goodObservations @4 :UInt8;
+ gpsParityErrorCount @5 :UInt16;
+ glonassFrequencyIndex @1 :Int8;
+ glonassHemmingErrorCount @6 :UInt8;
+ filterStages @7 :UInt8;
+ carrierNoise @8 :UInt16;
+ latency @9 :Int16;
+ predetectInterval @10 :UInt8;
+ postdetections @11 :UInt16;
+
+ unfilteredMeasurementIntegral @12 :UInt32;
+ unfilteredMeasurementFraction @13 :Float32;
+ unfilteredTimeUncertainty @14 :Float32;
+ unfilteredSpeed @15 :Float32;
+ unfilteredSpeedUncertainty @16 :Float32;
+ measurementStatus @17 :MeasurementStatus;
+ multipathEstimate @18 :UInt32;
+ azimuth @19 :Float32;
+ elevation @20 :Float32;
+ carrierPhaseCyclesIntegral @21 :Int32;
+ carrierPhaseCyclesFraction @22 :UInt16;
+ fineSpeed @23 :Float32;
+ fineSpeedUncertainty @24 :Float32;
+ cycleSlipCount @25 :UInt8;
+ }
+
+ }
+
+ struct ClockReport @0xca965e4add8f4f0b {
+ hasFCount @0 :Bool;
+ fCount @1 :UInt32;
+
+ hasGpsWeek @2 :Bool;
+ gpsWeek @3 :UInt16;
+ hasGpsMilliseconds @4 :Bool;
+ gpsMilliseconds @5 :UInt32;
+ gpsTimeBias @6 :Float32;
+ gpsClockTimeUncertainty @7 :Float32;
+ gpsClockSource @8 :UInt8;
+
+ hasGlonassYear @9 :Bool;
+ glonassYear @10 :UInt8;
+ hasGlonassDay @11 :Bool;
+ glonassDay @12 :UInt16;
+ hasGlonassMilliseconds @13 :Bool;
+ glonassMilliseconds @14 :UInt32;
+ glonassTimeBias @15 :Float32;
+ glonassClockTimeUncertainty @16 :Float32;
+ glonassClockSource @17 :UInt8;
+
+ bdsWeek @18 :UInt16;
+ bdsMilliseconds @19 :UInt32;
+ bdsTimeBias @20 :Float32;
+ bdsClockTimeUncertainty @21 :Float32;
+ bdsClockSource @22 :UInt8;
+
+ galWeek @23 :UInt16;
+ galMilliseconds @24 :UInt32;
+ galTimeBias @25 :Float32;
+ galClockTimeUncertainty @26 :Float32;
+ galClockSource @27 :UInt8;
+
+ clockFrequencyBias @28 :Float32;
+ clockFrequencyUncertainty @29 :Float32;
+ frequencySource @30 :UInt8;
+ gpsLeapSeconds @31 :UInt8;
+ gpsLeapSecondsUncertainty @32 :UInt8;
+ gpsLeapSecondsSource @33 :UInt8;
+
+ gpsToGlonassTimeBiasMilliseconds @34 :Float32;
+ gpsToGlonassTimeBiasMillisecondsUncertainty @35 :Float32;
+ gpsToBdsTimeBiasMilliseconds @36 :Float32;
+ gpsToBdsTimeBiasMillisecondsUncertainty @37 :Float32;
+ bdsToGloTimeBiasMilliseconds @38 :Float32;
+ bdsToGloTimeBiasMillisecondsUncertainty @39 :Float32;
+ gpsToGalTimeBiasMilliseconds @40 :Float32;
+ gpsToGalTimeBiasMillisecondsUncertainty @41 :Float32;
+ galToGloTimeBiasMilliseconds @42 :Float32;
+ galToGloTimeBiasMillisecondsUncertainty @43 :Float32;
+ galToBdsTimeBiasMilliseconds @44 :Float32;
+ galToBdsTimeBiasMillisecondsUncertainty @45 :Float32;
+
+ hasRtcTime @46 :Bool;
+ systemRtcTime @47 :UInt32;
+ fCountOffset @48 :UInt32;
+ lpmRtcCount @49 :UInt32;
+ clockResets @50 :UInt32;
+ }
+
+ struct DrMeasurementReport @0x8053c39445c6c75c {
+
+ reason @0 :UInt8;
+ seqNum @1 :UInt8;
+ seqMax @2 :UInt8;
+ rfLoss @3 :UInt16;
+
+ systemRtcValid @4 :Bool;
+ fCount @5 :UInt32;
+ clockResets @6 :UInt32;
+ systemRtcTime @7 :UInt64;
+
+ gpsLeapSeconds @8 :UInt8;
+ gpsLeapSecondsUncertainty @9 :UInt8;
+ gpsToGlonassTimeBiasMilliseconds @10 :Float32;
+ gpsToGlonassTimeBiasMillisecondsUncertainty @11 :Float32;
+
+ gpsWeek @12 :UInt16;
+ gpsMilliseconds @13 :UInt32;
+ gpsTimeBiasMs @14 :UInt32;
+ gpsClockTimeUncertaintyMs @15 :UInt32;
+ gpsClockSource @16 :UInt8;
+
+ glonassClockSource @17 :UInt8;
+ glonassYear @18 :UInt8;
+ glonassDay @19 :UInt16;
+ glonassMilliseconds @20 :UInt32;
+ glonassTimeBias @21 :Float32;
+ glonassClockTimeUncertainty @22 :Float32;
+
+ clockFrequencyBias @23 :Float32;
+ clockFrequencyUncertainty @24 :Float32;
+ frequencySource @25 :UInt8;
+
+ source @26 :MeasurementSource;
+
+ sv @27 :List(SV);
+
+ struct SV @0xf08b81df8cbf459c {
+ svId @0 :UInt8;
+ glonassFrequencyIndex @1 :Int8;
+ observationState @2 :SVObservationState;
+ observations @3 :UInt8;
+ goodObservations @4 :UInt8;
+ filterStages @5 :UInt8;
+ predetectInterval @6 :UInt8;
+ cycleSlipCount @7 :UInt8;
+ postdetections @8 :UInt16;
+
+ measurementStatus @9 :MeasurementStatus;
+
+ carrierNoise @10 :UInt16;
+ rfLoss @11 :UInt16;
+ latency @12 :Int16;
+
+ filteredMeasurementFraction @13 :Float32;
+ filteredMeasurementIntegral @14 :UInt32;
+ filteredTimeUncertainty @15 :Float32;
+ filteredSpeed @16 :Float32;
+ filteredSpeedUncertainty @17 :Float32;
+
+ unfilteredMeasurementFraction @18 :Float32;
+ unfilteredMeasurementIntegral @19 :UInt32;
+ unfilteredTimeUncertainty @20 :Float32;
+ unfilteredSpeed @21 :Float32;
+ unfilteredSpeedUncertainty @22 :Float32;
+
+ multipathEstimate @23 :UInt32;
+ azimuth @24 :Float32;
+ elevation @25 :Float32;
+ dopplerAcceleration @26 :Float32;
+ fineSpeed @27 :Float32;
+ fineSpeedUncertainty @28 :Float32;
+
+ carrierPhase @29 :Float64;
+ fCount @30 :UInt32;
+
+ parityErrorCount @31 :UInt16;
+ goodParity @32 :Bool;
+ }
+ }
+
+ struct DrSvPolyReport @0xb1fb80811a673270 {
+ svId @0 :UInt16;
+ frequencyIndex @1 :Int8;
+
+ hasPosition @2 :Bool;
+ hasIono @3 :Bool;
+ hasTropo @4 :Bool;
+ hasElevation @5 :Bool;
+ polyFromXtra @6 :Bool;
+ hasSbasIono @7 :Bool;
+
+ iode @8 :UInt16;
+ t0 @9 :Float64;
+ xyz0 @10 :List(Float64);
+ xyzN @11 :List(Float64);
+ other @12 :List(Float32);
+
+ positionUncertainty @13 :Float32;
+ ionoDelay @14 :Float32;
+ ionoDot @15 :Float32;
+ sbasIonoDelay @16 :Float32;
+ sbasIonoDot @17 :Float32;
+ tropoDelay @18 :Float32;
+ elevation @19 :Float32;
+ elevationDot @20 :Float32;
+ elevationUncertainty @21 :Float32;
+ velocityCoeff @22 :List(Float64);
+ }
+}
+
+struct LidarPts @0xe3d6685d4e9d8f7a {
+ r @0 :List(UInt16); # uint16 m*500.0
+ theta @1 :List(UInt16); # uint16 deg*100.0
+ reflect @2 :List(UInt8); # uint8 0-255
+
+ # For storing out of file.
+ idx @3 :UInt64;
+
+ # For storing in file
+ pkt @4 :Data;
+}
+
+
diff --git a/cereal/log.capnp b/cereal/log.capnp
index adf76c488dacd3..473a9f6b8a54f9 100644
--- a/cereal/log.capnp
+++ b/cereal/log.capnp
@@ -1,11 +1,8 @@
using Cxx = import "./include/c++.capnp";
$Cxx.namespace("cereal");
-using Java = import "./include/java.capnp";
-$Java.package("ai.comma.openpilot.cereal");
-$Java.outerClassname("Log");
-
using Car = import "car.capnp";
+using Legacy = import "legacy.capnp";
@0xf3b1f17e25a4285b;
@@ -22,6 +19,7 @@ struct Map(Key, Value) {
struct InitData {
kernelArgs @0 :List(Text);
kernelVersion @15 :Text;
+ osVersion @18 :Text;
gctx @1 :Text;
dongleId @2 :Text;
@@ -32,25 +30,36 @@ struct InitData {
gitBranch @11 :Text;
gitRemote @13 :Text;
- androidBuildInfo @5 :AndroidBuildInfo;
- androidSensors @6 :List(AndroidSensor);
androidProperties @16 :Map(Text, Text);
- chffrAndroidExtra @7 :ChffrAndroidExtra;
- iosBuildInfo @14 :IosBuildInfo;
pandaInfo @8 :PandaInfo;
dirty @9 :Bool;
passive @12 :Bool;
- params @17 :Map(Text, Text);
+ params @17 :Map(Text, Data);
enum DeviceType {
unknown @0;
neo @1;
chffrAndroid @2;
chffrIos @3;
+ tici @4;
+ pc @5;
}
+ struct PandaInfo {
+ hasPanda @0 :Bool;
+ dongleId @1 :Text;
+ stVersion @2 :Text;
+ espVersion @3 :Text;
+ }
+
+ # ***** deprecated stuff *****
+ androidBuildInfo @5 :AndroidBuildInfo;
+ androidSensorsDEPRECATED @6 :List(AndroidSensor);
+ chffrAndroidExtraDEPRECATED @7 :ChffrAndroidExtra;
+ iosBuildInfoDEPRECATED @14 :IosBuildInfo;
+
struct AndroidBuildInfo {
board @0 :Text;
bootloader @1 :Text;
@@ -105,38 +114,48 @@ struct InitData {
osVersion @2 :Text;
deviceModel @3 :Text;
}
-
- struct PandaInfo {
- hasPanda @0 :Bool;
- dongleId @1 :Text;
- stVersion @2 :Text;
- espVersion @3 :Text;
- }
}
struct FrameData {
frameId @0 :UInt32;
encodeId @1 :UInt32; # DEPRECATED
- timestampEof @2 :UInt64;
+
+ frameType @7 :FrameType;
frameLength @3 :Int32;
+
+ # Timestamps
+ timestampEof @2 :UInt64;
+ timestampSof @8 :UInt64;
+
+ # Exposure
integLines @4 :Int32;
- globalGain @5 :Int32;
+ highConversionGain @20 :Bool;
+ gain @15 :Float32; # This includes highConversionGain if enabled
+ measuredGreyFraction @21 :Float32;
+ targetGreyFraction @22 :Float32;
+
+ # Focus
lensPos @11 :Int32;
lensSag @12 :Float32;
lensErr @13 :Float32;
lensTruePos @14 :Float32;
- image @6 :Data;
+ focusVal @16 :List(Int16);
+ focusConf @17 :List(UInt8);
+ sharpnessScore @18 :List(UInt16);
+ recoverState @19 :Int32;
- frameType @7 :FrameType;
- timestampSof @8 :UInt64;
transform @10 :List(Float32);
androidCaptureResult @9 :AndroidCaptureResult;
+ image @6 :Data;
+ globalGainDEPRECATED @5 :Int32;
+
enum FrameType {
unknown @0;
neo @1;
chffrAndroid @2;
+ front @3;
}
struct AndroidCaptureResult {
@@ -180,6 +199,7 @@ struct SensorEventData {
gyroUncalibrated @12 :SensorVec;
proximity @13: Float32;
light @14: Float32;
+ temperature @15: Float32;
}
source @8 :SensorSource;
@@ -197,6 +217,10 @@ struct SensorEventData {
lsm6ds3 @5; # accelerometer (c2)
bmp280 @6; # barometer (c2)
mmc3416x @7; # magnetometer (c2)
+ bmx055 @8;
+ rpr0521 @9;
+ lsm6ds3trc @10;
+ mmc5603nj @11;
}
}
@@ -218,7 +242,7 @@ struct GpsLocationData {
speed @4 :Float32;
# Represents heading in degrees.
- bearing @5 :Float32;
+ bearingDeg @5 :Float32;
# Represents expected accuracy in meters. (presumably 1 sigma?)
accuracy @6 :Float32;
@@ -236,7 +260,7 @@ struct GpsLocationData {
verticalAccuracy @10 :Float32;
# Represents bearing accuracy in degrees. (presumably 1 sigma?)
- bearingAccuracy @11 :Float32;
+ bearingAccuracyDeg @11 :Float32;
# Represents velocity accuracy in m/s. (presumably 1 sigma?)
speedAccuracy @12 :Float32;
@@ -260,71 +284,196 @@ struct CanData {
src @3 :UInt8;
}
-struct ThermalData {
- cpu0 @0 :UInt16;
- cpu1 @1 :UInt16;
- cpu2 @2 :UInt16;
- cpu3 @3 :UInt16;
- mem @4 :UInt16;
- gpu @5 :UInt16;
- bat @6 :UInt32;
-
- # not thermal
- freeSpace @7 :Float32;
- batteryPercent @8 :Int16;
- batteryStatus @9 :Text;
- batteryCurrent @15 :Int32;
- batteryVoltage @16 :Int32;
+struct DeviceState @0xa4d8b5af2aa492eb {
usbOnline @12 :Bool;
+ networkType @22 :NetworkType;
+ networkInfo @31 :NetworkInfo;
+ networkStrength @24 :NetworkStrength;
+ lastAthenaPingTime @32 :UInt64;
- fanSpeed @10 :UInt16;
started @11 :Bool;
- startedTs @13 :UInt64;
+ startedMonoTime @13 :UInt64;
- thermalStatus @14 :ThermalStatus;
+ # system utilization
+ freeSpacePercent @7 :Float32;
+ memoryUsagePercent @19 :Int8;
+ gpuUsagePercent @33 :Int8;
+ cpuUsagePercent @34 :List(Int8); # per-core cpu usage
+
+ # power
+ batteryPercent @8 :Int16;
+ batteryCurrent @15 :Int32;
chargingError @17 :Bool;
chargingDisabled @18 :Bool;
+ offroadPowerUsageUwh @23 :UInt32;
+ carBatteryCapacityUwh @25 :UInt32;
+ powerDrawW @40 :Float32;
+
+ # device thermals
+ cpuTempC @26 :List(Float32);
+ gpuTempC @27 :List(Float32);
+ memoryTempC @28 :Float32;
+ ambientTempC @30 :Float32;
+ nvmeTempC @35 :List(Float32);
+ modemTempC @36 :List(Float32);
+ pmicTempC @39 :List(Float32);
+ thermalZones @38 :List(ThermalZone);
+ thermalStatus @14 :ThermalStatus;
+
+ fanSpeedPercentDesired @10 :UInt16;
+ screenBrightnessPercent @37 :Int8;
+
+ struct ThermalZone {
+ name @0 :Text;
+ temp @1 :Float32;
+ }
enum ThermalStatus {
- green @0; # all processes run
- yellow @1; # critical processes run (kill uploader), engage still allowed
- red @2; # no engage, will disengage
- danger @3; # immediate process shutdown
+ green @0;
+ yellow @1;
+ red @2;
+ danger @3;
+ }
+
+ enum NetworkType {
+ none @0;
+ wifi @1;
+ cell2G @2;
+ cell3G @3;
+ cell4G @4;
+ cell5G @5;
+ ethernet @6;
+ }
+
+ enum NetworkStrength {
+ unknown @0;
+ poor @1;
+ moderate @2;
+ good @3;
+ great @4;
+ }
+
+ struct NetworkInfo {
+ technology @0 :Text;
+ operator @1 :Text;
+ band @2 :Text;
+ channel @3 :UInt16;
+ extra @4 :Text;
+ state @5 :Text;
}
+
+ # deprecated
+ cpu0DEPRECATED @0 :UInt16;
+ cpu1DEPRECATED @1 :UInt16;
+ cpu2DEPRECATED @2 :UInt16;
+ cpu3DEPRECATED @3 :UInt16;
+ memDEPRECATED @4 :UInt16;
+ gpuDEPRECATED @5 :UInt16;
+ batDEPRECATED @6 :UInt32;
+ pa0DEPRECATED @21 :UInt16;
+ cpuUsagePercentDEPRECATED @20 :Int8;
+ batteryStatusDEPRECATED @9 :Text;
+ batteryVoltageDEPRECATED @16 :Int32;
+ batteryTempCDEPRECATED @29 :Float32;
}
-struct HealthData {
- # from can health
- voltage @0 :UInt32;
- current @1 :UInt32;
- started @2 :Bool;
+struct PandaState @0xa7649e2575e4591e {
+ ignitionLine @2 :Bool;
controlsAllowed @3 :Bool;
gasInterceptorDetected @4 :Bool;
- startedSignalDetected @5 :Bool;
- isGreyPanda @6 :Bool;
+ canSendErrs @7 :UInt32;
+ canFwdErrs @8 :UInt32;
+ canRxErrs @19 :UInt32;
+ gmlanSendErrs @9 :UInt32;
+ pandaType @10 :PandaType;
+ ignitionCan @13 :Bool;
+ safetyModel @14 :Car.CarParams.SafetyModel;
+ safetyParam @20 :Int16;
+ faultStatus @15 :FaultStatus;
+ powerSaveEnabled @16 :Bool;
+ uptime @17 :UInt32;
+ faults @18 :List(FaultType);
+ harnessStatus @21 :HarnessStatus;
+ heartbeatLost @22 :Bool;
+
+ enum FaultStatus {
+ none @0;
+ faultTemp @1;
+ faultPerm @2;
+ }
+
+ enum FaultType {
+ relayMalfunction @0;
+ unusedInterruptHandled @1;
+ interruptRateCan1 @2;
+ interruptRateCan2 @3;
+ interruptRateCan3 @4;
+ interruptRateTach @5;
+ interruptRateGmlan @6;
+ interruptRateInterrupts @7;
+ interruptRateSpiDma @8;
+ interruptRateSpiCs @9;
+ interruptRateUart1 @10;
+ interruptRateUart2 @11;
+ interruptRateUart3 @12;
+ interruptRateUart5 @13;
+ interruptRateUartDma @14;
+ interruptRateUsb @15;
+ interruptRateTim1 @16;
+ interruptRateTim3 @17;
+ registerDivergent @18;
+ interruptRateKlineInit @19;
+ interruptRateClockSource @20;
+ interruptRateTick @21;
+ # Update max fault type in boardd when adding faults
+ }
+
+ enum PandaType @0x8a58adf93e5b3751 {
+ unknown @0;
+ whitePanda @1;
+ greyPanda @2;
+ blackPanda @3;
+ pedal @4;
+ uno @5;
+ dos @6;
+ redPanda @7;
+ }
+
+ enum HarnessStatus {
+ notConnected @0;
+ normal @1;
+ flipped @2;
+ }
+
+ startedSignalDetectedDEPRECATED @5 :Bool;
+ voltageDEPRECATED @0 :UInt32;
+ currentDEPRECATED @1 :UInt32;
+ hasGpsDEPRECATED @6 :Bool;
+ fanSpeedRpmDEPRECATED @11 :UInt16;
+ usbPowerModeDEPRECATED @12 :PeripheralState.UsbPowerMode;
}
-struct LiveUI {
- rearViewCam @0 :Bool;
- alertText1 @1 :Text;
- alertText2 @2 :Text;
- awarenessStatus @3 :Float32;
+struct PeripheralState {
+ pandaType @0 :PandaState.PandaType;
+ voltage @1 :UInt32;
+ current @2 :UInt32;
+ fanSpeedRpm @3 :UInt16;
+ usbPowerMode @4 :UsbPowerMode;
+
+ enum UsbPowerMode @0xa8883583b32c9877 {
+ none @0;
+ client @1;
+ cdp @2;
+ dcp @3;
+ }
}
struct RadarState @0x9a185389d6fdd05f {
canMonoTimes @10 :List(UInt64);
mdMonoTime @6 :UInt64;
- ftMonoTimeDEPRECATED @7 :UInt64;
- controlsStateMonoTime @11 :UInt64;
+ carStateMonoTime @11 :UInt64;
radarErrors @12 :List(Car.RadarData.Error);
- # all deprecated
- warpMatrixDEPRECATED @0 :List(Float32);
- angleOffsetDEPRECATED @1 :Float32;
- calStatusDEPRECATED @2 :Int8;
- calCycleDEPRECATED @8 :Int32;
- calPercDEPRECATED @9 :Int8;
-
leadOne @3 :LeadData;
leadTwo @4 :LeadData;
cumLagMs @5 :Float32;
@@ -335,7 +484,6 @@ struct RadarState @0x9a185389d6fdd05f {
vRel @2 :Float32;
aRel @3 :Float32;
vLead @4 :Float32;
- aLeadDEPRECATED @5 :Float32;
dPath @6 :Float32;
vLat @7 :Float32;
vLeadK @8 :Float32;
@@ -343,22 +491,37 @@ struct RadarState @0x9a185389d6fdd05f {
fcw @10 :Bool;
status @11 :Bool;
aLeadTau @12 :Float32;
+ modelProb @13 :Float32;
+ radar @14 :Bool;
+
+ aLeadDEPRECATED @5 :Float32;
}
+
+ # deprecated
+ ftMonoTimeDEPRECATED @7 :UInt64;
+ warpMatrixDEPRECATED @0 :List(Float32);
+ angleOffsetDEPRECATED @1 :Float32;
+ calStatusDEPRECATED @2 :Int8;
+ calCycleDEPRECATED @8 :Int32;
+ calPercDEPRECATED @9 :Int8;
}
struct LiveCalibrationData {
- # deprecated
- warpMatrix @0 :List(Float32);
- # camera_frame_from_model_frame
- warpMatrix2 @5 :List(Float32);
- warpMatrixBig @6 :List(Float32);
calStatus @1 :Int8;
calCycle @2 :Int32;
calPerc @3 :Int8;
+ validBlocks @9 :Int32;
# view_frame_from_road_frame
# ui's is inversed needs new
extrinsicMatrix @4 :List(Float32);
+ # the direction of travel vector in device frame
+ rpyCalib @7 :List(Float32);
+ rpyCalibSpread @8 :List(Float32);
+
+ warpMatrixDEPRECATED @0 :List(Float32);
+ warpMatrix2DEPRECATED @5 :List(Float32);
+ warpMatrixBigDEPRECATED @6 :List(Float32);
}
struct LiveTracks {
@@ -375,68 +538,45 @@ struct LiveTracks {
}
struct ControlsState @0x97ff69c53601abf1 {
- canMonoTimeDEPRECATED @16 :UInt64;
+ startMonoTime @48 :UInt64;
canMonoTimes @21 :List(UInt64);
- radarStateMonoTimeDEPRECATED @17 :UInt64;
- mdMonoTimeDEPRECATED @18 :UInt64;
- planMonoTime @28 :UInt64;
- pathPlanMonoTime @50 :UInt64;
+ longitudinalPlanMonoTime @28 :UInt64;
+ lateralPlanMonoTime @50 :UInt64;
state @31 :OpenpilotState;
- vEgo @0 :Float32;
- vEgoRaw @32 :Float32;
- aEgoDEPRECATED @1 :Float32;
- longControlState @30 :LongControlState;
+ enabled @19 :Bool;
+ active @36 :Bool;
+
+ longControlState @30 :Car.CarControl.Actuators.LongControlState;
vPid @2 :Float32;
vTargetLead @3 :Float32;
+ vCruise @22 :Float32;
upAccelCmd @4 :Float32;
uiAccelCmd @5 :Float32;
ufAccelCmd @33 :Float32;
- yActualDEPRECATED @6 :Float32;
- yDesDEPRECATED @7 :Float32;
- upSteerDEPRECATED @8 :Float32;
- uiSteerDEPRECATED @9 :Float32;
- ufSteerDEPRECATED @34 :Float32;
- aTargetMinDEPRECATED @10 :Float32;
- aTargetMaxDEPRECATED @11 :Float32;
aTarget @35 :Float32;
- jerkFactor @12 :Float32;
- angleSteers @13 :Float32; # Steering angle in degrees.
- angleSteersDes @29 :Float32;
- curvature @37 :Float32; # path curvature from vehicle model
- hudLeadDEPRECATED @14 :Int32;
- cumLagMs @15 :Float32;
- startMonoTime @48 :UInt64;
- mapValid @49 :Bool;
+ curvature @37 :Float32; # path curvature from vehicle model
forceDecel @51 :Bool;
- enabled @19 :Bool;
- active @36 :Bool;
- steerOverride @20 :Bool;
-
- vCruise @22 :Float32;
-
- rearViewCam @23 :Bool;
+ # UI alerts
alertText1 @24 :Text;
alertText2 @25 :Text;
alertStatus @38 :AlertStatus;
alertSize @39 :AlertSize;
alertBlinkingRate @42 :Float32;
alertType @44 :Text;
- alertSound @45 :Text;
- awarenessStatus @26 :Float32;
- angleModelBias @27 :Float32;
- gpsPlannerActive @40 :Bool;
+ alertSound @56 :Car.CarControl.HUDControl.AudibleAlert;
engageable @41 :Bool; # can OP be engaged?
- driverMonitoringOn @43 :Bool;
- # maps
- vCurvature @46 :Float32;
- decelForTurn @47 :Bool;
+ cumLagMs @15 :Float32;
+ canErrorCounter @57 :UInt32;
lateralControlState :union {
indiState @52 :LateralINDIState;
pidState @53 :LateralPIDState;
+ lqrState @55 :LateralLQRState;
+ angleState @58 :LateralAngleState;
+ debugState @59 :LateralDebugState;
}
enum OpenpilotState @0xdbe58b96d2d1ac61 {
@@ -446,16 +586,9 @@ struct ControlsState @0x97ff69c53601abf1 {
softDisabling @3;
}
- enum LongControlState {
- off @0;
- pid @1;
- stopping @2;
- starting @3;
- }
-
enum AlertStatus {
normal @0; # low priority alert for user's convenience
- userPrompt @1; # mid piority alert that might require user intervention
+ userPrompt @1; # mid priority alert that might require user intervention
critical @2; # high priority alert that needs immediate user intervention
}
@@ -468,80 +601,181 @@ struct ControlsState @0x97ff69c53601abf1 {
struct LateralINDIState {
active @0 :Bool;
- steerAngle @1 :Float32;
- steerRate @2 :Float32;
- steerAccel @3 :Float32;
+ steeringAngleDeg @1 :Float32;
+ steeringRateDeg @2 :Float32;
+ steeringAccelDeg @3 :Float32;
rateSetPoint @4 :Float32;
accelSetPoint @5 :Float32;
accelError @6 :Float32;
delayedOutput @7 :Float32;
delta @8 :Float32;
output @9 :Float32;
+ saturated @10 :Bool;
+ steeringAngleDesiredDeg @11 :Float32;
+ steeringRateDesiredDeg @12 :Float32;
}
struct LateralPIDState {
active @0 :Bool;
- steerAngle @1 :Float32;
- steerRate @2 :Float32;
+ steeringAngleDeg @1 :Float32;
+ steeringRateDeg @2 :Float32;
angleError @3 :Float32;
p @4 :Float32;
i @5 :Float32;
f @6 :Float32;
output @7 :Float32;
saturated @8 :Bool;
+ steeringAngleDesiredDeg @9 :Float32;
}
-}
+ struct LateralLQRState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ i @2 :Float32;
+ output @3 :Float32;
+ lqrOutput @4 :Float32;
+ saturated @5 :Bool;
+ steeringAngleDesiredDeg @6 :Float32;
+ }
+
+ struct LateralAngleState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ output @2 :Float32;
+ saturated @3 :Bool;
+ steeringAngleDesiredDeg @4 :Float32;
+ }
+
+ struct LateralDebugState {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ output @2 :Float32;
+ saturated @3 :Bool;
+ }
-struct LiveEventData {
- name @0 :Text;
- value @1 :Int32;
+ # deprecated
+ vEgoDEPRECATED @0 :Float32;
+ vEgoRawDEPRECATED @32 :Float32;
+ aEgoDEPRECATED @1 :Float32;
+ canMonoTimeDEPRECATED @16 :UInt64;
+ radarStateMonoTimeDEPRECATED @17 :UInt64;
+ mdMonoTimeDEPRECATED @18 :UInt64;
+ yActualDEPRECATED @6 :Float32;
+ yDesDEPRECATED @7 :Float32;
+ upSteerDEPRECATED @8 :Float32;
+ uiSteerDEPRECATED @9 :Float32;
+ ufSteerDEPRECATED @34 :Float32;
+ aTargetMinDEPRECATED @10 :Float32;
+ aTargetMaxDEPRECATED @11 :Float32;
+ rearViewCamDEPRECATED @23 :Bool;
+ driverMonitoringOnDEPRECATED @43 :Bool;
+ hudLeadDEPRECATED @14 :Int32;
+ alertSoundDEPRECATED @45 :Text;
+ angleModelBiasDEPRECATED @27 :Float32;
+ gpsPlannerActiveDEPRECATED @40 :Bool;
+ decelForTurnDEPRECATED @47 :Bool;
+ decelForModelDEPRECATED @54 :Bool;
+ awarenessStatusDEPRECATED @26 :Float32;
+ angleSteersDEPRECATED @13 :Float32;
+ vCurvatureDEPRECATED @46 :Float32;
+ mapValidDEPRECATED @49 :Bool;
+ jerkFactorDEPRECATED @12 :Float32;
+ steerOverrideDEPRECATED @20 :Bool;
+ steeringAngleDesiredDegDEPRECATED @29 :Float32;
}
-struct ModelData {
+struct ModelDataV2 {
frameId @0 :UInt32;
+ frameAge @1 :UInt32;
+ frameDropPerc @2 :Float32;
+ timestampEof @3 :UInt64;
+ modelExecutionTime @15 :Float32;
+ gpuExecutionTime @17 :Float32;
+ rawPredictions @16 :Data;
+
+ # predicted future position, orientation, etc..
+ position @4 :XYZTData;
+ orientation @5 :XYZTData;
+ velocity @6 :XYZTData;
+ orientationRate @7 :XYZTData;
+ acceleration @19 :XYZTData;
+
+ # prediction lanelines and road edges
+ laneLines @8 :List(XYZTData);
+ laneLineProbs @9 :List(Float32);
+ laneLineStds @13 :List(Float32);
+ roadEdges @10 :List(XYZTData);
+ roadEdgeStds @14 :List(Float32);
+
+ # predicted lead cars
+ leads @11 :List(LeadDataV2);
+ leadsV3 @18 :List(LeadDataV3);
+
+ meta @12 :MetaData;
+
+ # All SI units and in device frame
+ struct XYZTData {
+ x @0 :List(Float32);
+ y @1 :List(Float32);
+ z @2 :List(Float32);
+ t @3 :List(Float32);
+ xStd @4 :List(Float32);
+ yStd @5 :List(Float32);
+ zStd @6 :List(Float32);
+ }
- path @1 :PathData;
- leftLane @2 :PathData;
- rightLane @3 :PathData;
- lead @4 :LeadData;
- freePath @6 :List(Float32);
-
- settings @5 :ModelSettings;
+ struct LeadDataV2 {
+ prob @0 :Float32; # probability that car is your lead at time t
+ t @1 :Float32;
- struct PathData {
- points @0 :List(Float32);
- prob @1 :Float32;
- std @2 :Float32;
- stds @3 :List(Float32);
- poly @4 :List(Float32);
+ # x and y are relative position in device frame
+ # v is norm relative speed
+ # a is norm relative acceleration
+ xyva @2 :List(Float32);
+ xyvaStd @3 :List(Float32);
}
- struct LeadData {
- dist @0 :Float32;
- prob @1 :Float32;
- std @2 :Float32;
- relVel @3 :Float32;
- relVelStd @4 :Float32;
+ struct LeadDataV3 {
+ prob @0 :Float32; # probability that car is your lead at time t
+ probTime @1 :Float32;
+ t @2 :List(Float32);
+
+ # x and y are relative position in device frame
+ # v absolute norm speed
+ # a is derivative of v
+ x @3 :List(Float32);
+ xStd @4 :List(Float32);
+ y @5 :List(Float32);
+ yStd @6 :List(Float32);
+ v @7 :List(Float32);
+ vStd @8 :List(Float32);
+ a @9 :List(Float32);
+ aStd @10 :List(Float32);
}
- struct ModelSettings {
- bigBoxX @0 :UInt16;
- bigBoxY @1 :UInt16;
- bigBoxWidth @2 :UInt16;
- bigBoxHeight @3 :UInt16;
- boxProjection @4 :List(Float32);
- yuvCorrection @5 :List(Float32);
- inputTransform @6 :List(Float32);
- }
-}
-struct CalibrationFeatures {
- frameId @0 :UInt32;
+ struct MetaData {
+ engagedProb @0 :Float32;
+ desirePrediction @1 :List(Float32);
+ desireState @5 :List(Float32);
+ disengagePredictions @6 :DisengagePredictions;
+ hardBrakePredicted @7 :Bool;
- p0 @1 :List(Float32);
- p1 @2 :List(Float32);
- status @3 :List(Int8);
+ # deprecated
+ brakeDisengageProbDEPRECATED @2 :Float32;
+ gasDisengageProbDEPRECATED @3 :Float32;
+ steerOverrideProbDEPRECATED @4 :Float32;
+ }
+
+ struct DisengagePredictions {
+ t @0 :List(Float32);
+ brakeDisengageProbs @1 :List(Float32);
+ gasDisengageProbs @2 :List(Float32);
+ steerOverrideProbs @3 :List(Float32);
+ brake3MetersPerSecondSquaredProbs @4 :List(Float32);
+ brake4MetersPerSecondSquaredProbs @5 :List(Float32);
+ brake5MetersPerSecondSquaredProbs @6 :List(Float32);
+ }
}
struct EncodeIndex {
@@ -556,6 +790,8 @@ struct EncodeIndex {
segmentId @4 :UInt32;
# index into camera file in segment in encode order
segmentIdEncode @5 :UInt32;
+ timestampSof @6 :UInt64;
+ timestampEof @7 :UInt64;
enum Type {
bigBoxLossless @0; # rcamera.mkv
@@ -577,678 +813,176 @@ struct AndroidLogEntry {
message @6 :Text;
}
-struct LogRotate {
- segmentNum @0 :Int32;
- path @1 :Text;
-}
-
-struct Plan {
- mdMonoTime @9 :UInt64;
- radarStateMonoTime @10 :UInt64;
- commIssue @31 :Bool;
-
- eventsDEPRECATED @13 :List(Car.CarEvent);
-
- # lateral, 3rd order polynomial
- lateralValidDEPRECATED @0 :Bool;
- dPolyDEPRECATED @1 :List(Float32);
- laneWidthDEPRECATED @11 :Float32;
-
- # longitudinal
- longitudinalValidDEPRECATED @2 :Bool;
- vCruise @16 :Float32;
- aCruise @17 :Float32;
- vTarget @3 :Float32;
- vTargetFuture @14 :Float32;
- vMax @20 :Float32;
- aTargetMinDEPRECATED @4 :Float32;
- aTargetMaxDEPRECATED @5 :Float32;
- aTarget @18 :Float32;
-
- vStart @26 :Float32;
- aStart @27 :Float32;
-
- jerkFactor @6 :Float32;
+struct LongitudinalPlan @0xe00b5b3eba12876c {
+ modelMonoTime @9 :UInt64;
hasLead @7 :Bool;
- hasLeftLaneDEPRECATED @23 :Bool;
- hasRightLaneDEPRECATED @24 :Bool;
fcw @8 :Bool;
longitudinalPlanSource @15 :LongitudinalPlanSource;
+ processingDelay @29 :Float32;
- # gps trajectory in car frame
- gpsTrajectory @12 :GpsTrajectory;
-
- gpsPlannerActive @19 :Bool;
-
- # maps
- vCurvature @21 :Float32;
- decelForTurn @22 :Bool;
- mapValid @25 :Bool;
- radarValid @28 :Bool;
- radarCanError @30 :Bool;
+ # desired speed/accel/jerk over next 2.5s
+ accels @32 :List(Float32);
+ speeds @33 :List(Float32);
+ jerks @34 :List(Float32);
- processingDelay @29 :Float32;
+ enum LongitudinalPlanSource {
+ cruise @0;
+ lead0 @1;
+ lead1 @2;
+ lead2 @3;
+ e2e @4;
+ }
+ # deprecated
+ vCruiseDEPRECATED @16 :Float32;
+ aCruiseDEPRECATED @17 :Float32;
+ vTargetDEPRECATED @3 :Float32;
+ vTargetFutureDEPRECATED @14 :Float32;
+ aTargetDEPRECATED @18 :Float32;
+ vStartDEPRECATED @26 :Float32;
+ aStartDEPRECATED @27 :Float32;
+ vMaxDEPRECATED @20 :Float32;
+ radarStateMonoTimeDEPRECATED @10 :UInt64;
+ jerkFactorDEPRECATED @6 :Float32;
+ hasLeftLaneDEPRECATED @23 :Bool;
+ hasRightLaneDEPRECATED @24 :Bool;
+ aTargetMinDEPRECATED @4 :Float32;
+ aTargetMaxDEPRECATED @5 :Float32;
+ lateralValidDEPRECATED @0 :Bool;
+ longitudinalValidDEPRECATED @2 :Bool;
+ dPolyDEPRECATED @1 :List(Float32);
+ laneWidthDEPRECATED @11 :Float32;
+ vCurvatureDEPRECATED @21 :Float32;
+ decelForTurnDEPRECATED @22 :Bool;
+ mapValidDEPRECATED @25 :Bool;
+ radarValidDEPRECATED @28 :Bool;
+ radarCanErrorDEPRECATED @30 :Bool;
+ commIssueDEPRECATED @31 :Bool;
+ eventsDEPRECATED @13 :List(Car.CarEvent);
+ gpsTrajectoryDEPRECATED @12 :GpsTrajectory;
+ gpsPlannerActiveDEPRECATED @19 :Bool;
struct GpsTrajectory {
x @0 :List(Float32);
y @1 :List(Float32);
}
-
- enum LongitudinalPlanSource {
- cruise @0;
- mpc1 @1;
- mpc2 @2;
- mpc3 @3;
- }
}
-struct PathPlan {
+struct LateralPlan @0xe1e9318e2ae8b51e {
laneWidth @0 :Float32;
-
- dPoly @1 :List(Float32);
- cPoly @2 :List(Float32);
- cProb @3 :Float32;
- lPoly @4 :List(Float32);
lProb @5 :Float32;
- rPoly @6 :List(Float32);
rProb @7 :Float32;
+ dPathPoints @20 :List(Float32);
+ dProb @21 :Float32;
- angleSteers @8 :Float32; # deg
- rateSteers @13 :Float32; # deg/s
mpcSolutionValid @9 :Bool;
- paramsValid @10 :Bool;
- modelValidDEPRECATED @12 :Bool;
- angleOffset @11 :Float32;
- sensorValid @14 :Bool;
- commIssue @15 :Bool;
-}
-
-struct LiveLocationData {
- status @0 :UInt8;
-
- # 3D fix
- lat @1 :Float64;
- lon @2 :Float64;
- alt @3 :Float32; # m
-
- # speed
- speed @4 :Float32; # m/s
-
- # NED velocity components
- vNED @5 :List(Float32);
-
- # roll, pitch, heading (x,y,z)
- roll @6 :Float32; # WRT to center of earth?
- pitch @7 :Float32; # WRT to center of earth?
- heading @8 :Float32; # WRT to north?
-
- # what are these?
- wanderAngle @9 :Float32;
- trackAngle @10 :Float32;
-
- # car frame -- https://upload.wikimedia.org/wikipedia/commons/f/f5/RPY_angles_of_cars.png
-
- # gyro, in car frame, deg/s
- gyro @11 :List(Float32);
-
- # accel, in car frame, m/s^2
- accel @12 :List(Float32);
+ desire @17 :Desire;
+ laneChangeState @18 :LaneChangeState;
+ laneChangeDirection @19 :LaneChangeDirection;
+ useLaneLines @29 :Bool;
- accuracy @13 :Accuracy;
+ # desired curvatures over next 2.5s in rad/m
+ psis @26 :List(Float32);
+ curvatures @27 :List(Float32);
+ curvatureRates @28 :List(Float32);
- source @14 :SensorSource;
- # if we are fixing a location in the past
- fixMonoTime @15 :UInt64;
-
- gpsWeek @16 :Int32;
- timeOfWeek @17 :Float64;
-
- positionECEF @18 :List(Float64);
- poseQuatECEF @19 :List(Float32);
- pitchCalibration @20 :Float32;
- yawCalibration @21 :Float32;
- imuFrame @22 :List(Float32);
-
- struct Accuracy {
- pNEDError @0 :List(Float32);
- vNEDError @1 :List(Float32);
- rollError @2 :Float32;
- pitchError @3 :Float32;
- headingError @4 :Float32;
- ellipsoidSemiMajorError @5 :Float32;
- ellipsoidSemiMinorError @6 :Float32;
- ellipsoidOrientationError @7 :Float32;
- }
-
- enum SensorSource {
- applanix @0;
- kalman @1;
- orbslam @2;
- timing @3;
- dummy @4;
- }
-}
-
-struct EthernetPacket {
- pkt @0 :Data;
- ts @1 :Float32;
-}
-
-struct NavUpdate {
- isNavigating @0 :Bool;
- curSegment @1 :Int32;
- segments @2 :List(Segment);
-
- struct LatLng {
- lat @0 :Float64;
- lng @1 :Float64;
- }
-
- struct Segment {
- from @0 :LatLng;
- to @1 :LatLng;
- updateTime @2 :Int32;
- distance @3 :Int32;
- crossTime @4 :Int32;
- exitNo @5 :Int32;
- instruction @6 :Instruction;
-
- parts @7 :List(LatLng);
-
- enum Instruction {
- turnLeft @0;
- turnRight @1;
- keepLeft @2;
- keepRight @3;
- straight @4;
- roundaboutExitNumber @5;
- roundaboutExit @6;
- roundaboutTurnLeft @7;
- unkn8 @8;
- roundaboutStraight @9;
- unkn10 @10;
- roundaboutTurnRight @11;
- unkn12 @12;
- roundaboutUturn @13;
- unkn14 @14;
- arrive @15;
- exitLeft @16;
- exitRight @17;
- unkn18 @18;
- uturn @19;
- # ...
- }
- }
-}
-
-struct NavStatus {
- isNavigating @0 :Bool;
- currentAddress @1 :Address;
-
- struct Address {
- title @0 :Text;
- lat @1 :Float64;
- lng @2 :Float64;
- house @3 :Text;
- address @4 :Text;
- street @5 :Text;
- city @6 :Text;
- state @7 :Text;
- country @8 :Text;
- }
-}
-
-struct CellInfo {
- timestamp @0 :UInt64;
- repr @1 :Text; # android toString() for now
-}
-
-struct WifiScan {
- bssid @0 :Text;
- ssid @1 :Text;
- capabilities @2 :Text;
- frequency @3 :Int32;
- level @4 :Int32;
- timestamp @5 :Int64;
-
- centerFreq0 @6 :Int32;
- centerFreq1 @7 :Int32;
- channelWidth @8 :ChannelWidth;
- operatorFriendlyName @9 :Text;
- venueName @10 :Text;
- is80211mcResponder @11 :Bool;
- passpoint @12 :Bool;
-
- distanceCm @13 :Int32;
- distanceSdCm @14 :Int32;
-
- enum ChannelWidth {
- w20Mhz @0;
- w40Mhz @1;
- w80Mhz @2;
- w160Mhz @3;
- w80Plus80Mhz @4;
+ enum Desire {
+ none @0;
+ turnLeft @1;
+ turnRight @2;
+ laneChangeLeft @3;
+ laneChangeRight @4;
+ keepLeft @5;
+ keepRight @6;
}
-}
-struct AndroidGnss {
- union {
- measurements @0 :Measurements;
- navigationMessage @1 :NavigationMessage;
+ enum LaneChangeState {
+ off @0;
+ preLaneChange @1;
+ laneChangeStarting @2;
+ laneChangeFinishing @3;
}
- struct Measurements {
- clock @0 :Clock;
- measurements @1 :List(Measurement);
-
- struct Clock {
- timeNanos @0 :Int64;
- hardwareClockDiscontinuityCount @1 :Int32;
-
- hasTimeUncertaintyNanos @2 :Bool;
- timeUncertaintyNanos @3 :Float64;
-
- hasLeapSecond @4 :Bool;
- leapSecond @5 :Int32;
-
- hasFullBiasNanos @6 :Bool;
- fullBiasNanos @7 :Int64;
-
- hasBiasNanos @8 :Bool;
- biasNanos @9 :Float64;
-
- hasBiasUncertaintyNanos @10 :Bool;
- biasUncertaintyNanos @11 :Float64;
-
- hasDriftNanosPerSecond @12 :Bool;
- driftNanosPerSecond @13 :Float64;
-
- hasDriftUncertaintyNanosPerSecond @14 :Bool;
- driftUncertaintyNanosPerSecond @15 :Float64;
- }
-
- struct Measurement {
- svId @0 :Int32;
- constellation @1 :Constellation;
-
- timeOffsetNanos @2 :Float64;
- state @3 :Int32;
- receivedSvTimeNanos @4 :Int64;
- receivedSvTimeUncertaintyNanos @5 :Int64;
- cn0DbHz @6 :Float64;
- pseudorangeRateMetersPerSecond @7 :Float64;
- pseudorangeRateUncertaintyMetersPerSecond @8 :Float64;
- accumulatedDeltaRangeState @9 :Int32;
- accumulatedDeltaRangeMeters @10 :Float64;
- accumulatedDeltaRangeUncertaintyMeters @11 :Float64;
-
- hasCarrierFrequencyHz @12 :Bool;
- carrierFrequencyHz @13 :Float32;
- hasCarrierCycles @14 :Bool;
- carrierCycles @15 :Int64;
- hasCarrierPhase @16 :Bool;
- carrierPhase @17 :Float64;
- hasCarrierPhaseUncertainty @18 :Bool;
- carrierPhaseUncertainty @19 :Float64;
- hasSnrInDb @20 :Bool;
- snrInDb @21 :Float64;
-
- multipathIndicator @22 :MultipathIndicator;
-
- enum Constellation {
- unknown @0;
- gps @1;
- sbas @2;
- glonass @3;
- qzss @4;
- beidou @5;
- galileo @6;
- }
-
- enum State {
- unknown @0;
- codeLock @1;
- bitSync @2;
- subframeSync @3;
- towDecoded @4;
- msecAmbiguous @5;
- symbolSync @6;
- gloStringSync @7;
- gloTodDecoded @8;
- bdsD2BitSync @9;
- bdsD2SubframeSync @10;
- galE1bcCodeLock @11;
- galE1c2ndCodeLock @12;
- galE1bPageSync @13;
- sbasSync @14;
- }
-
- enum MultipathIndicator {
- unknown @0;
- detected @1;
- notDetected @2;
- }
- }
+ enum LaneChangeDirection {
+ none @0;
+ left @1;
+ right @2;
}
- struct NavigationMessage {
- type @0 :Int32;
- svId @1 :Int32;
- messageId @2 :Int32;
- submessageId @3 :Int32;
- data @4 :Data;
- status @5 :Status;
-
- enum Status {
- unknown @0;
- parityPassed @1;
- parityRebuilt @2;
- }
- }
+ # deprecated
+ curvatureDEPRECATED @22 :Float32;
+ curvatureRateDEPRECATED @23 :Float32;
+ rawCurvatureDEPRECATED @24 :Float32;
+ rawCurvatureRateDEPRECATED @25 :Float32;
+ cProbDEPRECATED @3 :Float32;
+ dPolyDEPRECATED @1 :List(Float32);
+ cPolyDEPRECATED @2 :List(Float32);
+ lPolyDEPRECATED @4 :List(Float32);
+ rPolyDEPRECATED @6 :List(Float32);
+ modelValidDEPRECATED @12 :Bool;
+ commIssueDEPRECATED @15 :Bool;
+ posenetValidDEPRECATED @16 :Bool;
+ sensorValidDEPRECATED @14 :Bool;
+ paramsValidDEPRECATED @10 :Bool;
+ steeringAngleDegDEPRECATED @8 :Float32; # deg
+ steeringRateDegDEPRECATED @13 :Float32; # deg/s
+ angleOffsetDegDEPRECATED @11 :Float32;
}
-struct QcomGnss {
- logTs @0 :UInt64;
- union {
- measurementReport @1 :MeasurementReport;
- clockReport @2 :ClockReport;
- drMeasurementReport @3 :DrMeasurementReport;
- drSvPoly @4 :DrSvPolyReport;
- rawLog @5 :Data;
- }
-
- enum MeasurementSource @0xd71a12b6faada7ee {
- gps @0;
- glonass @1;
- beidou @2;
- }
-
- enum SVObservationState @0xe81e829a0d6c83e9 {
- idle @0;
- search @1;
- searchVerify @2;
- bitEdge @3;
- trackVerify @4;
- track @5;
- restart @6;
- dpo @7;
- glo10msBe @8;
- glo10msAt @9;
- }
-
- struct MeasurementStatus @0xe501010e1bcae83b {
- subMillisecondIsValid @0 :Bool;
- subBitTimeIsKnown @1 :Bool;
- satelliteTimeIsKnown @2 :Bool;
- bitEdgeConfirmedFromSignal @3 :Bool;
- measuredVelocity @4 :Bool;
- fineOrCoarseVelocity @5 :Bool;
- lockPointValid @6 :Bool;
- lockPointPositive @7 :Bool;
- lastUpdateFromDifference @8 :Bool;
- lastUpdateFromVelocityDifference @9 :Bool;
- strongIndicationOfCrossCorelation @10 :Bool;
- tentativeMeasurement @11 :Bool;
- measurementNotUsable @12 :Bool;
- sirCheckIsNeeded @13 :Bool;
- probationMode @14 :Bool;
-
- glonassMeanderBitEdgeValid @15 :Bool;
- glonassTimeMarkValid @16 :Bool;
-
- gpsRoundRobinRxDiversity @17 :Bool;
- gpsRxDiversity @18 :Bool;
- gpsLowBandwidthRxDiversityCombined @19 :Bool;
- gpsHighBandwidthNu4 @20 :Bool;
- gpsHighBandwidthNu8 @21 :Bool;
- gpsHighBandwidthUniform @22 :Bool;
- multipathIndicator @23 :Bool;
-
- imdJammingIndicator @24 :Bool;
- lteB13TxJammingIndicator @25 :Bool;
- freshMeasurementIndicator @26 :Bool;
-
- multipathEstimateIsValid @27 :Bool;
- directionIsValid @28 :Bool;
- }
-
- struct MeasurementReport {
- source @0 :MeasurementSource;
-
- fCount @1 :UInt32;
-
- gpsWeek @2 :UInt16;
- glonassCycleNumber @3 :UInt8;
- glonassNumberOfDays @4 :UInt16;
-
- milliseconds @5 :UInt32;
- timeBias @6 :Float32;
- clockTimeUncertainty @7 :Float32;
- clockFrequencyBias @8 :Float32;
- clockFrequencyUncertainty @9 :Float32;
-
- sv @10 :List(SV);
-
- struct SV {
- svId @0 :UInt8;
- observationState @2 :SVObservationState;
- observations @3 :UInt8;
- goodObservations @4 :UInt8;
- gpsParityErrorCount @5 :UInt16;
- glonassFrequencyIndex @1 :Int8;
- glonassHemmingErrorCount @6 :UInt8;
- filterStages @7 :UInt8;
- carrierNoise @8 :UInt16;
- latency @9 :Int16;
- predetectInterval @10 :UInt8;
- postdetections @11 :UInt16;
-
- unfilteredMeasurementIntegral @12 :UInt32;
- unfilteredMeasurementFraction @13 :Float32;
- unfilteredTimeUncertainty @14 :Float32;
- unfilteredSpeed @15 :Float32;
- unfilteredSpeedUncertainty @16 :Float32;
- measurementStatus @17 :MeasurementStatus;
- multipathEstimate @18 :UInt32;
- azimuth @19 :Float32;
- elevation @20 :Float32;
- carrierPhaseCyclesIntegral @21 :Int32;
- carrierPhaseCyclesFraction @22 :UInt16;
- fineSpeed @23 :Float32;
- fineSpeedUncertainty @24 :Float32;
- cycleSlipCount @25 :UInt8;
- }
-
- }
-
- struct ClockReport {
- hasFCount @0 :Bool;
- fCount @1 :UInt32;
-
- hasGpsWeek @2 :Bool;
- gpsWeek @3 :UInt16;
- hasGpsMilliseconds @4 :Bool;
- gpsMilliseconds @5 :UInt32;
- gpsTimeBias @6 :Float32;
- gpsClockTimeUncertainty @7 :Float32;
- gpsClockSource @8 :UInt8;
-
- hasGlonassYear @9 :Bool;
- glonassYear @10 :UInt8;
- hasGlonassDay @11 :Bool;
- glonassDay @12 :UInt16;
- hasGlonassMilliseconds @13 :Bool;
- glonassMilliseconds @14 :UInt32;
- glonassTimeBias @15 :Float32;
- glonassClockTimeUncertainty @16 :Float32;
- glonassClockSource @17 :UInt8;
-
- bdsWeek @18 :UInt16;
- bdsMilliseconds @19 :UInt32;
- bdsTimeBias @20 :Float32;
- bdsClockTimeUncertainty @21 :Float32;
- bdsClockSource @22 :UInt8;
-
- galWeek @23 :UInt16;
- galMilliseconds @24 :UInt32;
- galTimeBias @25 :Float32;
- galClockTimeUncertainty @26 :Float32;
- galClockSource @27 :UInt8;
-
- clockFrequencyBias @28 :Float32;
- clockFrequencyUncertainty @29 :Float32;
- frequencySource @30 :UInt8;
- gpsLeapSeconds @31 :UInt8;
- gpsLeapSecondsUncertainty @32 :UInt8;
- gpsLeapSecondsSource @33 :UInt8;
-
- gpsToGlonassTimeBiasMilliseconds @34 :Float32;
- gpsToGlonassTimeBiasMillisecondsUncertainty @35 :Float32;
- gpsToBdsTimeBiasMilliseconds @36 :Float32;
- gpsToBdsTimeBiasMillisecondsUncertainty @37 :Float32;
- bdsToGloTimeBiasMilliseconds @38 :Float32;
- bdsToGloTimeBiasMillisecondsUncertainty @39 :Float32;
- gpsToGalTimeBiasMilliseconds @40 :Float32;
- gpsToGalTimeBiasMillisecondsUncertainty @41 :Float32;
- galToGloTimeBiasMilliseconds @42 :Float32;
- galToGloTimeBiasMillisecondsUncertainty @43 :Float32;
- galToBdsTimeBiasMilliseconds @44 :Float32;
- galToBdsTimeBiasMillisecondsUncertainty @45 :Float32;
-
- hasRtcTime @46 :Bool;
- systemRtcTime @47 :UInt32;
- fCountOffset @48 :UInt32;
- lpmRtcCount @49 :UInt32;
- clockResets @50 :UInt32;
- }
-
- struct DrMeasurementReport {
-
- reason @0 :UInt8;
- seqNum @1 :UInt8;
- seqMax @2 :UInt8;
- rfLoss @3 :UInt16;
-
- systemRtcValid @4 :Bool;
- fCount @5 :UInt32;
- clockResets @6 :UInt32;
- systemRtcTime @7 :UInt64;
+struct LiveLocationKalman {
+
+ # More info on reference frames:
+ # https://github.com/commaai/openpilot/tree/master/common/transformations
+
+ positionECEF @0 : Measurement;
+ positionGeodetic @1 : Measurement;
+ velocityECEF @2 : Measurement;
+ velocityNED @3 : Measurement;
+ velocityDevice @4 : Measurement;
+ accelerationDevice @5: Measurement;
+
+
+ # These angles are all eulers and roll, pitch, yaw
+ # orientationECEF transforms to rot matrix: ecef_from_device
+ orientationECEF @6 : Measurement;
+ calibratedOrientationECEF @20 : Measurement;
+ orientationNED @7 : Measurement;
+ angularVelocityDevice @8 : Measurement;
+
+ # orientationNEDCalibrated transforms to rot matrix: NED_from_calibrated
+ calibratedOrientationNED @9 : Measurement;
+
+ # Calibrated frame is simply device frame
+ # aligned with the vehicle
+ velocityCalibrated @10 : Measurement;
+ accelerationCalibrated @11 : Measurement;
+ angularVelocityCalibrated @12 : Measurement;
+
+ gpsWeek @13 :Int32;
+ gpsTimeOfWeek @14 :Float64;
+ status @15 :Status;
+ unixTimestampMillis @16 :Int64;
+ inputsOK @17 :Bool = true;
+ posenetOK @18 :Bool = true;
+ gpsOK @19 :Bool = true;
+ sensorsOK @21 :Bool = true;
+ deviceStable @22 :Bool = true;
+ timeSinceReset @23 :Float64;
+ excessiveResets @24 :Bool;
- gpsLeapSeconds @8 :UInt8;
- gpsLeapSecondsUncertainty @9 :UInt8;
- gpsToGlonassTimeBiasMilliseconds @10 :Float32;
- gpsToGlonassTimeBiasMillisecondsUncertainty @11 :Float32;
-
- gpsWeek @12 :UInt16;
- gpsMilliseconds @13 :UInt32;
- gpsTimeBiasMs @14 :UInt32;
- gpsClockTimeUncertaintyMs @15 :UInt32;
- gpsClockSource @16 :UInt8;
-
- glonassClockSource @17 :UInt8;
- glonassYear @18 :UInt8;
- glonassDay @19 :UInt16;
- glonassMilliseconds @20 :UInt32;
- glonassTimeBias @21 :Float32;
- glonassClockTimeUncertainty @22 :Float32;
-
- clockFrequencyBias @23 :Float32;
- clockFrequencyUncertainty @24 :Float32;
- frequencySource @25 :UInt8;
-
- source @26 :MeasurementSource;
-
- sv @27 :List(SV);
-
- struct SV {
- svId @0 :UInt8;
- glonassFrequencyIndex @1 :Int8;
- observationState @2 :SVObservationState;
- observations @3 :UInt8;
- goodObservations @4 :UInt8;
- filterStages @5 :UInt8;
- predetectInterval @6 :UInt8;
- cycleSlipCount @7 :UInt8;
- postdetections @8 :UInt16;
-
- measurementStatus @9 :MeasurementStatus;
-
- carrierNoise @10 :UInt16;
- rfLoss @11 :UInt16;
- latency @12 :Int16;
-
- filteredMeasurementFraction @13 :Float32;
- filteredMeasurementIntegral @14 :UInt32;
- filteredTimeUncertainty @15 :Float32;
- filteredSpeed @16 :Float32;
- filteredSpeedUncertainty @17 :Float32;
-
- unfilteredMeasurementFraction @18 :Float32;
- unfilteredMeasurementIntegral @19 :UInt32;
- unfilteredTimeUncertainty @20 :Float32;
- unfilteredSpeed @21 :Float32;
- unfilteredSpeedUncertainty @22 :Float32;
-
- multipathEstimate @23 :UInt32;
- azimuth @24 :Float32;
- elevation @25 :Float32;
- dopplerAcceleration @26 :Float32;
- fineSpeed @27 :Float32;
- fineSpeedUncertainty @28 :Float32;
-
- carrierPhase @29 :Float64;
- fCount @30 :UInt32;
-
- parityErrorCount @31 :UInt16;
- goodParity @32 :Bool;
- }
+ enum Status {
+ uninitialized @0;
+ uncalibrated @1;
+ valid @2;
}
- struct DrSvPolyReport {
- svId @0 :UInt16;
- frequencyIndex @1 :Int8;
-
- hasPosition @2 :Bool;
- hasIono @3 :Bool;
- hasTropo @4 :Bool;
- hasElevation @5 :Bool;
- polyFromXtra @6 :Bool;
- hasSbasIono @7 :Bool;
-
- iode @8 :UInt16;
- t0 @9 :Float64;
- xyz0 @10 :List(Float64);
- xyzN @11 :List(Float64);
- other @12 :List(Float32);
-
- positionUncertainty @13 :Float32;
- ionoDelay @14 :Float32;
- ionoDot @15 :Float32;
- sbasIonoDelay @16 :Float32;
- sbasIonoDot @17 :Float32;
- tropoDelay @18 :Float32;
- elevation @19 :Float32;
- elevationDot @20 :Float32;
- elevationUncertainty @21 :Float32;
-
- velocityCoeff @22 :List(Float64);
-
+ struct Measurement {
+ value @0 : List(Float64);
+ std @1 : List(Float64);
+ valid @2 : Bool;
}
}
-struct LidarPts {
- r @0 :List(UInt16); # uint16 m*500.0
- theta @1 :List(UInt16); # uint16 deg*100.0
- reflect @2 :List(UInt8); # uint8 0-255
-
- # For storing out of file.
- idx @3 :UInt64;
-
- # For storing in file
- pkt @4 :Data;
-}
-
struct ProcLog {
cpuTimes @0 :List(CPUTimes);
mem @1 :Mem;
@@ -1299,7 +1033,6 @@ struct ProcLog {
inactive @6 :UInt64;
shared @7 :UInt64;
}
-
}
struct UbloxGnss {
@@ -1307,6 +1040,8 @@ struct UbloxGnss {
measurementReport @0 :MeasurementReport;
ephemeris @1 :Ephemeris;
ionoData @2 :IonoData;
+ hwStatus @3 :HwStatus;
+ hwStatus2 @4 :HwStatus2;
}
struct MeasurementReport {
@@ -1430,8 +1165,48 @@ struct UbloxGnss {
healthValid @5 :Bool;
ionoCoeffsValid @6 :Bool;
}
-}
+ struct HwStatus {
+ noisePerMS @0 :UInt16;
+ agcCnt @1 :UInt16;
+ aStatus @2 :AntennaSupervisorState;
+ aPower @3 :AntennaPowerStatus;
+ jamInd @4 :UInt8;
+ flags @5 :UInt8;
+
+ enum AntennaSupervisorState {
+ init @0;
+ dontknow @1;
+ ok @2;
+ short @3;
+ open @4;
+ }
+
+ enum AntennaPowerStatus {
+ off @0;
+ on @1;
+ dontknow @2;
+ }
+ }
+
+ struct HwStatus2 {
+ ofsI @0 :Int8;
+ magI @1 :UInt8;
+ ofsQ @2 :Int8;
+ magQ @3 :UInt8;
+ cfgSource @4 :ConfigSource;
+ lowLevCfg @5 :UInt32;
+ postStatus @6 :UInt32;
+
+ enum ConfigSource {
+ undefined @0;
+ rom @1;
+ otp @2;
+ configpins @3;
+ flash @4;
+ }
+ }
+}
struct Clocks {
bootTimeNanos @0 :UInt64;
@@ -1445,7 +1220,7 @@ struct LiveMpcData {
x @0 :List(Float32);
y @1 :List(Float32);
psi @2 :List(Float32);
- delta @3 :List(Float32);
+ curvature @3 :List(Float32);
qpIterations @4 :UInt32;
calculationTime @5 :UInt64;
cost @6 :Float64;
@@ -1465,203 +1240,90 @@ struct LiveLongitudinalMpcData {
cost @10 :Float64;
}
-
-struct ECEFPointDEPRECATED @0xe10e21168db0c7f7 {
- x @0 :Float32;
- y @1 :Float32;
- z @2 :Float32;
-}
-
-struct ECEFPoint @0xc25bbbd524983447 {
- x @0 :Float64;
- y @1 :Float64;
- z @2 :Float64;
-}
-
-struct GPSPlannerPoints {
- curPosDEPRECATED @0 :ECEFPointDEPRECATED;
- pointsDEPRECATED @1 :List(ECEFPointDEPRECATED);
- curPos @6 :ECEFPoint;
- points @7 :List(ECEFPoint);
- valid @2 :Bool;
- trackName @3 :Text;
- speedLimit @4 :Float32;
- accelTarget @5 :Float32;
-}
-
-struct GPSPlannerPlan {
- valid @0 :Bool;
- poly @1 :List(Float32);
- trackName @2 :Text;
- speed @3 :Float32;
- acceleration @4 :Float32;
- pointsDEPRECATED @5 :List(ECEFPointDEPRECATED);
- points @6 :List(ECEFPoint);
- xLookahead @7 :Float32;
-}
-
-struct TrafficEvent @0xacfa74a094e62626 {
- type @0 :Type;
- distance @1 :Float32;
- action @2 :Action;
- resuming @3 :Bool;
-
- enum Type {
- stopSign @0;
- lightRed @1;
- lightYellow @2;
- lightGreen @3;
- stopLight @4;
- }
-
- enum Action {
- none @0;
- yield @1;
- stop @2;
- resumeReady @3;
- }
-
-}
-
-struct OrbslamCorrection {
- correctionMonoTime @0 :UInt64;
- prePositionECEF @1 :List(Float64);
- postPositionECEF @2 :List(Float64);
- prePoseQuatECEF @3 :List(Float32);
- postPoseQuatECEF @4 :List(Float32);
- numInliers @5 :UInt32;
-}
-
-struct OrbObservation {
- observationMonoTime @0 :UInt64;
- normalizedCoordinates @1 :List(Float32);
- locationECEF @2 :List(Float64);
- matchDistance @3: UInt32;
-}
-
-struct UiNavigationEvent {
- type @0: Type;
- status @1: Status;
- distanceTo @2: Float32;
- endRoadPointDEPRECATED @3: ECEFPointDEPRECATED;
- endRoadPoint @4: ECEFPoint;
-
- enum Type {
- none @0;
- laneChangeLeft @1;
- laneChangeRight @2;
- mergeLeft @3;
- mergeRight @4;
- turnLeft @5;
- turnRight @6;
- }
-
- enum Status {
- none @0;
- passive @1;
- approaching @2;
- active @3;
- }
-}
-
-struct UiLayoutState {
- activeApp @0 :App;
- sidebarCollapsed @1 :Bool;
- mapEnabled @2 :Bool;
-
- enum App {
- home @0;
- music @1;
- nav @2;
- }
-}
-
struct Joystick {
# convenient for debug and live tuning
axes @0: List(Float32);
buttons @1: List(Bool);
}
-struct OrbOdometry {
- # timing first
- startMonoTime @0 :UInt64;
- endMonoTime @1 :UInt64;
-
- # fundamental matrix and error
- f @2: List(Float64);
- err @3: Float64;
-
- # number of inlier points
- inliers @4: Int32;
-
- # for debug only
- # indexed by endMonoTime features
- # value is startMonoTime feature match
- # -1 if no match
- matches @5: List(Int16);
-}
-
-struct OrbFeatures {
- timestampEof @0 :UInt64;
- # transposed arrays of normalized image coordinates
- # len(xs) == len(ys) == len(descriptors) * 32
- xs @1 :List(Float32);
- ys @2 :List(Float32);
- descriptors @3 :Data;
- octaves @4 :List(Int8);
-
- # match index to last OrbFeatures
- # -1 if no match
- timestampLastEof @5 :UInt64;
- matches @6: List(Int16);
-}
-
-struct OrbFeaturesSummary {
- timestampEof @0 :UInt64;
- timestampLastEof @1 :UInt64;
-
- featureCount @2 :UInt16;
- matchCount @3 :UInt16;
- computeNs @4 :UInt64;
-}
-
-struct OrbKeyFrame {
- # this is a globally unique id for the KeyFrame
- id @0: UInt64;
-
- # this is the location of the KeyFrame
- pos @1: ECEFPoint;
-
- # these are the features in the world
- # len(dpos) == len(descriptors) * 32
- dpos @2 :List(ECEFPoint);
- descriptors @3 :Data;
+struct DriverState {
+ frameId @0 :UInt32;
+ modelExecutionTime @14 :Float32;
+ dspExecutionTime @16 :Float32;
+ rawPredictions @15 :Data;
+
+ faceOrientation @3 :List(Float32);
+ facePosition @4 :List(Float32);
+ faceProb @5 :Float32;
+ leftEyeProb @6 :Float32;
+ rightEyeProb @7 :Float32;
+ leftBlinkProb @8 :Float32;
+ rightBlinkProb @9 :Float32;
+ faceOrientationStd @11 :List(Float32);
+ facePositionStd @12 :List(Float32);
+ sunglassesProb @13 :Float32;
+ poorVision @17 :Float32;
+ partialFace @18 :Float32;
+ distractedPose @19 :Float32;
+ distractedEyes @20 :Float32;
+ eyesOnRoad @21 :Float32;
+ phoneUse @22 :Float32;
+ occludedProb @23 :Float32;
+
+ irPwrDEPRECATED @10 :Float32;
+ descriptorDEPRECATED @1 :List(Float32);
+ stdDEPRECATED @2 :Float32;
}
-struct DriverMonitoring {
- frameId @0 :UInt32;
- descriptor @1 :List(Float32);
- std @2 :Float32;
+struct DriverMonitoringState @0xb83cda094a1da284 {
+ events @0 :List(Car.CarEvent);
+ faceDetected @1 :Bool;
+ isDistracted @2 :Bool;
+ awarenessStatus @3 :Float32;
+ posePitchOffset @6 :Float32;
+ posePitchValidCount @7 :UInt32;
+ poseYawOffset @8 :Float32;
+ poseYawValidCount @9 :UInt32;
+ stepChange @10 :Float32;
+ awarenessActive @11 :Float32;
+ awarenessPassive @12 :Float32;
+ isLowStd @13 :Bool;
+ hiStdCount @14 :UInt32;
+ isActiveMode @16 :Bool;
+
+ isRHDDEPRECATED @4 :Bool;
+ isPreviewDEPRECATED @15 :Bool;
+ rhdCheckedDEPRECATED @5 :Bool;
}
struct Boot {
wallTimeNanos @0 :UInt64;
- lastKmsg @1 :Data;
- lastPmsg @2 :Data;
+ pstore @4 :Map(Text, Data);
+ commands @5 :Map(Text, Data);
+ launchLog @3 :Text;
+
+ lastKmsgDEPRECATED @1 :Data;
+ lastPmsgDEPRECATED @2 :Data;
}
struct LiveParametersData {
valid @0 :Bool;
gyroBias @1 :Float32;
- angleOffset @2 :Float32;
- angleOffsetAverage @3 :Float32;
+ angleOffsetDeg @2 :Float32;
+ angleOffsetAverageDeg @3 :Float32;
stiffnessFactor @4 :Float32;
steerRatio @5 :Float32;
sensorValid @6 :Bool;
yawRate @7 :Float32;
+ posenetSpeed @8 :Float32;
+ posenetValid @9 :Bool;
+ angleOffsetFastStd @10 :Float32;
+ angleOffsetAverageStd @11 :Float32;
+ stiffnessFactorStd @12 :Float32;
+ steerRatioStd @13 :Float32;
}
-struct LiveMapData {
+struct LiveMapDataDEPRECATED {
speedLimitValid @0 :Bool;
speedLimit @1 :Float32;
speedAdvisoryValid @12 :Bool;
@@ -1682,92 +1344,189 @@ struct LiveMapData {
}
struct CameraOdometry {
+ frameId @4 :UInt32;
+ timestampEof @5 :UInt64;
trans @0 :List(Float32); # m/s in device frame
rot @1 :List(Float32); # rad/s in device frame
transStd @2 :List(Float32); # std m/s in device frame
rotStd @3 :List(Float32); # std rad/s in device frame
}
-struct KalmanOdometry {
- trans @0 :List(Float32); # m/s in device frame
- rot @1 :List(Float32); # rad/s in device frame
- transStd @2 :List(Float32); # std m/s in device frame
- rotStd @3 :List(Float32); # std rad/s in device frame
+struct Sentinel {
+ enum SentinelType {
+ endOfSegment @0;
+ endOfRoute @1;
+ startOfSegment @2;
+ startOfRoute @3;
+ }
+ type @0 :SentinelType;
+ signal @1 :Int32;
+}
+
+struct ManagerState {
+ processes @0 :List(ProcessState);
+
+ struct ProcessState {
+ name @0 :Text;
+ pid @1 :Int32;
+ running @2 :Bool;
+ shouldBeRunning @4 :Bool;
+ exitCode @3 :Int32;
+ }
+}
+
+struct UploaderState {
+ immediateQueueSize @0 :UInt32;
+ immediateQueueCount @1 :UInt32;
+ rawQueueSize @2 :UInt32;
+ rawQueueCount @3 :UInt32;
+
+ # stats for last successfully uploaded file
+ lastTime @4 :Float32; # s
+ lastSpeed @5 :Float32; # MB/s
+ lastFilename @6 :Text;
+}
+
+struct NavInstruction {
+ maneuverPrimaryText @0 :Text;
+ maneuverSecondaryText @1 :Text;
+ maneuverDistance @2 :Float32; # m
+ maneuverType @3 :Text; # TODO: Make Enum
+ maneuverModifier @4 :Text; # TODO: Make Enum
+
+ distanceRemaining @5 :Float32; # m
+ timeRemaining @6 :Float32; # s
+ timeRemainingTypical @7 :Float32; # s
+
+ lanes @8 :List(Lane);
+ showFull @9 :Bool;
+
+ struct Lane {
+ directions @0 :List(Direction);
+ active @1 :Bool;
+ activeDirection @2 :Direction;
+ }
+
+ enum Direction {
+ none @0;
+ left @1;
+ right @2;
+ straight @3;
+ }
+
+}
+
+struct NavRoute {
+ coordinates @0 :List(Coordinate);
+
+ struct Coordinate {
+ latitude @0 :Float32;
+ longitude @1 :Float32;
+ }
}
struct Event {
- # in nanoseconds?
- logMonoTime @0 :UInt64;
+ logMonoTime @0 :UInt64; # nanoseconds
valid @67 :Bool = true;
union {
+ # *********** log metadata ***********
initData @1 :InitData;
- frame @2 :FrameData;
+ sentinel @73 :Sentinel;
+
+ # *********** bootlog ***********
+ boot @60 :Boot;
+
+ # ********** openpilot daemon msgs **********
gpsNMEA @3 :GPSNMEAData;
- sensorEventDEPRECATED @4 :SensorEventData;
can @5 :List(CanData);
- thermal @6 :ThermalData;
controlsState @7 :ControlsState;
- liveEventDEPRECATED @8 :List(LiveEventData);
- model @9 :ModelData;
- features @10 :CalibrationFeatures;
sensorEvents @11 :List(SensorEventData);
- health @12 :HealthData;
+ pandaStates @81 :List(PandaState);
+ peripheralState @80 :PeripheralState;
radarState @13 :RadarState;
- liveUIDEPRECATED @14 :LiveUI;
- encodeIdx @15 :EncodeIndex;
liveTracks @16 :List(LiveTracks);
sendcan @17 :List(CanData);
- logMessage @18 :Text;
liveCalibration @19 :LiveCalibrationData;
- androidLogEntry @20 :AndroidLogEntry;
- gpsLocation @21 :GpsLocationData;
carState @22 :Car.CarState;
carControl @23 :Car.CarControl;
- plan @24 :Plan;
- liveLocation @25 :LiveLocationData;
- ethernetData @26 :List(EthernetPacket);
- navUpdate @27 :NavUpdate;
- cellInfo @28 :List(CellInfo);
- wifiScan @29 :List(WifiScan);
- androidGnss @30 :AndroidGnss;
- qcomGnss @31 :QcomGnss;
- lidarPts @32 :LidarPts;
- procLog @33 :ProcLog;
+ longitudinalPlan @24 :LongitudinalPlan;
+ lateralPlan @64 :LateralPlan;
ubloxGnss @34 :UbloxGnss;
- clocks @35 :Clocks;
- liveMpc @36 :LiveMpcData;
- liveLongitudinalMpc @37 :LiveLongitudinalMpcData;
- navStatus @38 :NavStatus;
ubloxRaw @39 :Data;
- gpsPlannerPoints @40 :GPSPlannerPoints;
- gpsPlannerPlan @41 :GPSPlannerPlan;
- applanixRaw @42 :Data;
- trafficEvents @43 :List(TrafficEvent);
- liveLocationTiming @44 :LiveLocationData;
- orbslamCorrectionDEPRECATED @45 :OrbslamCorrection;
- liveLocationCorrected @46 :LiveLocationData;
- orbObservation @47 :List(OrbObservation);
gpsLocationExternal @48 :GpsLocationData;
- location @49 :LiveLocationData;
- uiNavigationEvent @50 :UiNavigationEvent;
- liveLocationKalman @51 :LiveLocationData;
- testJoystick @52 :Joystick;
- orbOdometry @53 :OrbOdometry;
- orbFeatures @54 :OrbFeatures;
- applanixLocation @55 :LiveLocationData;
- orbKeyFrame @56 :OrbKeyFrame;
- uiLayoutState @57 :UiLayoutState;
- orbFeaturesSummary @58 :OrbFeaturesSummary;
- driverMonitoring @59 :DriverMonitoring;
- boot @60 :Boot;
+ driverState @59 :DriverState;
liveParameters @61 :LiveParametersData;
- liveMapData @62 :LiveMapData;
cameraOdometry @63 :CameraOdometry;
- pathPlan @64 :PathPlan;
- kalmanOdometry @65 :KalmanOdometry;
thumbnail @66: Thumbnail;
carEvents @68: List(Car.CarEvent);
carParams @69: Car.CarParams;
+ driverMonitoringState @71: DriverMonitoringState;
+ liveLocationKalman @72 :LiveLocationKalman;
+ modelV2 @75 :ModelDataV2;
+
+ # camera stuff, each camera state has a matching encode idx
+ roadCameraState @2 :FrameData;
+ driverCameraState @70: FrameData;
+ wideRoadCameraState @74: FrameData;
+ roadEncodeIdx @15 :EncodeIndex;
+ driverEncodeIdx @76 :EncodeIndex;
+ wideRoadEncodeIdx @77 :EncodeIndex;
+
+ # systems stuff
+ androidLog @20 :AndroidLogEntry;
+ managerState @78 :ManagerState;
+ uploaderState @79 :UploaderState;
+ procLog @33 :ProcLog;
+ clocks @35 :Clocks;
+ deviceState @6 :DeviceState;
+ logMessage @18 :Text;
+
+ # navigation
+ navInstruction @82 :NavInstruction;
+ navRoute @83 :NavRoute;
+ navThumbnail @84: Thumbnail;
+
+ # *********** debug ***********
+ testJoystick @52 :Joystick;
+
+ # *********** legacy + deprecated ***********
+ model @9 :Legacy.ModelData; # TODO: rename modelV2 and mark this as deprecated
+ liveMpcDEPRECATED @36 :LiveMpcData;
+ liveLongitudinalMpcDEPRECATED @37 :LiveLongitudinalMpcData;
+ liveLocationKalmanDEPRECATED @51 :Legacy.LiveLocationData;
+ orbslamCorrectionDEPRECATED @45 :Legacy.OrbslamCorrection;
+ liveUIDEPRECATED @14 :Legacy.LiveUI;
+ sensorEventDEPRECATED @4 :SensorEventData;
+ liveEventDEPRECATED @8 :List(Legacy.LiveEventData);
+ liveLocationDEPRECATED @25 :Legacy.LiveLocationData;
+ ethernetDataDEPRECATED @26 :List(Legacy.EthernetPacket);
+ cellInfoDEPRECATED @28 :List(Legacy.CellInfo);
+ wifiScanDEPRECATED @29 :List(Legacy.WifiScan);
+ uiNavigationEventDEPRECATED @50 :Legacy.UiNavigationEvent;
+ liveMapDataDEPRECATED @62 :LiveMapDataDEPRECATED;
+ gpsPlannerPointsDEPRECATED @40 :Legacy.GPSPlannerPoints;
+ gpsPlannerPlanDEPRECATED @41 :Legacy.GPSPlannerPlan;
+ applanixRawDEPRECATED @42 :Data;
+ androidGnssDEPRECATED @30 :Legacy.AndroidGnss;
+ qcomGnssDEPRECATD @31 :Legacy.QcomGnss;
+ lidarPtsDEPRECATED @32 :Legacy.LidarPts;
+ navStatusDEPRECATED @38 :Legacy.NavStatus;
+ trafficEventsDEPRECATED @43 :List(Legacy.TrafficEvent);
+ liveLocationTimingDEPRECATED @44 :Legacy.LiveLocationData;
+ liveLocationCorrectedDEPRECATED @46 :Legacy.LiveLocationData;
+ navUpdateDEPRECATED @27 :Legacy.NavUpdate;
+ orbObservationDEPRECATED @47 :List(Legacy.OrbObservation);
+ locationDEPRECATED @49 :Legacy.LiveLocationData;
+ orbOdometryDEPRECATED @53 :Legacy.OrbOdometry;
+ orbFeaturesDEPRECATED @54 :Legacy.OrbFeatures;
+ applanixLocationDEPRECATED @55 :Legacy.LiveLocationData;
+ orbKeyFrameDEPRECATED @56 :Legacy.OrbKeyFrame;
+ orbFeaturesSummaryDEPRECATED @58 :Legacy.OrbFeaturesSummary;
+ featuresDEPRECATED @10 :Legacy.CalibrationFeatures;
+ kalmanOdometryDEPRECATED @65 :Legacy.KalmanOdometry;
+ gpsLocationDEPRECATED @21 :GpsLocationData;
+ uiLayoutStateDEPRECATED @57 :Legacy.UiLayoutState;
+ pandaStateDEPRECATED @12 :PandaState;
}
}
diff --git a/cereal/logger/logger.h b/cereal/logger/logger.h
new file mode 100644
index 00000000000000..e21509352f76db
--- /dev/null
+++ b/cereal/logger/logger.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#ifdef SWAGLOG
+#include "selfdrive/common/swaglog.h"
+#else
+
+#define CLOUDLOG_DEBUG 10
+#define CLOUDLOG_INFO 20
+#define CLOUDLOG_WARNING 30
+#define CLOUDLOG_ERROR 40
+#define CLOUDLOG_CRITICAL 50
+
+#define cloudlog(lvl, fmt, ...) printf(fmt "\n", ## __VA_ARGS__)
+
+#define LOGD(fmt, ...) cloudlog(CLOUDLOG_DEBUG, fmt, ## __VA_ARGS__)
+#define LOG(fmt, ...) cloudlog(CLOUDLOG_INFO, fmt, ## __VA_ARGS__)
+#define LOGW(fmt, ...) cloudlog(CLOUDLOG_WARNING, fmt, ## __VA_ARGS__)
+#define LOGE(fmt, ...) cloudlog(CLOUDLOG_ERROR, fmt, ## __VA_ARGS__)
+
+#endif
diff --git a/cereal/maptile.capnp b/cereal/maptile.capnp
deleted file mode 100644
index 336901392aa306..00000000000000
--- a/cereal/maptile.capnp
+++ /dev/null
@@ -1,53 +0,0 @@
-using Cxx = import "./include/c++.capnp";
-$Cxx.namespace("cereal");
-
-using Java = import "./include/java.capnp";
-$Java.package("ai.comma.openpilot.cereal");
-$Java.outerClassname("Map");
-
-@0xa086df597ef5d7a0;
-
-# Geometry
-struct Point {
- x @0: Float64;
- y @1: Float64;
- z @2: Float64;
-}
-
-struct PolyLine {
- points @0: List(Point);
-}
-
-# Map features
-struct Lane {
- id @0 :Text;
-
- leftBoundary @1 :LaneBoundary;
- rightBoundary @2 :LaneBoundary;
-
- leftAdjacentId @3 :Text;
- rightAdjacentId @4 :Text;
-
- inboundIds @5 :List(Text);
- outboundIds @6 :List(Text);
-
- struct LaneBoundary {
- polyLine @0 :PolyLine;
- startHeading @1 :Float32; # WRT north
- }
-}
-
-# Map tiles
-struct TileSummary {
- version @0 :Text;
- updatedAt @1 :UInt64; # Millis since epoch
-
- level @2 :UInt8;
- x @3 :UInt16;
- y @4 :UInt16;
-}
-
-struct MapTile {
- summary @0 :TileSummary;
- lanes @1 :List(Lane);
-}
diff --git a/cereal/messaging/.gitignore b/cereal/messaging/.gitignore
new file mode 100644
index 00000000000000..dbbe8e22aee488
--- /dev/null
+++ b/cereal/messaging/.gitignore
@@ -0,0 +1,10 @@
+demo
+bridge
+test_runner
+*.o
+*.os
+*.d
+*.a
+*.so
+messaging_pyx.cpp
+build/
diff --git a/cereal/messaging/__init__.py b/cereal/messaging/__init__.py
new file mode 100644
index 00000000000000..0440104eb73a22
--- /dev/null
+++ b/cereal/messaging/__init__.py
@@ -0,0 +1,251 @@
+# must be build with scons
+from .messaging_pyx import Context, Poller, SubSocket, PubSocket # pylint: disable=no-name-in-module, import-error
+from .messaging_pyx import MultiplePublishersError, MessagingError # pylint: disable=no-name-in-module, import-error
+import os
+import capnp
+
+from typing import Optional, List, Union
+from collections import deque
+
+from cereal import log
+from cereal.services import service_list
+
+assert MultiplePublishersError
+assert MessagingError
+
+NO_TRAVERSAL_LIMIT = 2**64-1
+AVG_FREQ_HISTORY = 100
+SIMULATION = "SIMULATION" in os.environ
+
+# sec_since_boot is faster, but allow to run standalone too
+try:
+ from common.realtime import sec_since_boot
+except ImportError:
+ import time
+ sec_since_boot = time.time
+ print("Warning, using python time.time() instead of faster sec_since_boot")
+
+context = Context()
+
+def log_from_bytes(dat: bytes) -> capnp.lib.capnp._DynamicStructReader:
+ return log.Event.from_bytes(dat, traversal_limit_in_words=NO_TRAVERSAL_LIMIT)
+
+def new_message(service: Optional[str] = None, size: Optional[int] = None) -> capnp.lib.capnp._DynamicStructBuilder:
+ dat = log.Event.new_message()
+ dat.logMonoTime = int(sec_since_boot() * 1e9)
+ dat.valid = True
+ if service is not None:
+ if size is None:
+ dat.init(service)
+ else:
+ dat.init(service, size)
+ return dat
+
+def pub_sock(endpoint: str) -> PubSocket:
+ sock = PubSocket()
+ sock.connect(context, endpoint)
+ return sock
+
+def sub_sock(endpoint: str, poller: Optional[Poller] = None, addr: str = "127.0.0.1",
+ conflate: bool = False, timeout: Optional[int] = None) -> SubSocket:
+ sock = SubSocket()
+ sock.connect(context, endpoint, addr.encode('utf8'), conflate)
+
+ if timeout is not None:
+ sock.setTimeout(timeout)
+
+ if poller is not None:
+ poller.registerSocket(sock)
+ return sock
+
+
+def drain_sock_raw(sock: SubSocket, wait_for_one: bool = False) -> List[bytes]:
+ """Receive all message currently available on the queue"""
+ ret: List[bytes] = []
+ while 1:
+ if wait_for_one and len(ret) == 0:
+ dat = sock.receive()
+ else:
+ dat = sock.receive(non_blocking=True)
+
+ if dat is None:
+ break
+
+ ret.append(dat)
+
+ return ret
+
+def drain_sock(sock: SubSocket, wait_for_one: bool = False) -> List[capnp.lib.capnp._DynamicStructReader]:
+ """Receive all message currently available on the queue"""
+ ret: List[capnp.lib.capnp._DynamicStructReader] = []
+ while 1:
+ if wait_for_one and len(ret) == 0:
+ dat = sock.receive()
+ else:
+ dat = sock.receive(non_blocking=True)
+
+ if dat is None: # Timeout hit
+ break
+
+ dat = log_from_bytes(dat)
+ ret.append(dat)
+
+ return ret
+
+
+# TODO: print when we drop packets?
+def recv_sock(sock: SubSocket, wait: bool = False) -> Union[None, capnp.lib.capnp._DynamicStructReader]:
+ """Same as drain sock, but only returns latest message. Consider using conflate instead."""
+ dat = None
+
+ while 1:
+ if wait and dat is None:
+ rcv = sock.receive()
+ else:
+ rcv = sock.receive(non_blocking=True)
+
+ if rcv is None: # Timeout hit
+ break
+
+ dat = rcv
+
+ if dat is not None:
+ dat = log_from_bytes(dat)
+
+ return dat
+
+def recv_one(sock: SubSocket) -> Union[None, capnp.lib.capnp._DynamicStructReader]:
+ dat = sock.receive()
+ if dat is not None:
+ dat = log_from_bytes(dat)
+ return dat
+
+def recv_one_or_none(sock: SubSocket) -> Union[None, capnp.lib.capnp._DynamicStructReader]:
+ dat = sock.receive(non_blocking=True)
+ if dat is not None:
+ dat = log_from_bytes(dat)
+ return dat
+
+def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
+ """Keep receiving until we get a message"""
+ while True:
+ dat = sock.receive()
+ if dat is not None:
+ return log_from_bytes(dat)
+
+class SubMaster():
+ def __init__(self, services: List[str], poll: Optional[List[str]] = None,
+ ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None,
+ addr: str = "127.0.0.1"):
+ self.frame = -1
+ self.updated = {s: False for s in services}
+ self.rcv_time = {s: 0. for s in services}
+ self.rcv_frame = {s: 0 for s in services}
+ self.alive = {s: False for s in services}
+ self.recv_dts = {s: deque([0.0] * AVG_FREQ_HISTORY, maxlen=AVG_FREQ_HISTORY) for s in services}
+ self.sock = {}
+ self.freq = {}
+ self.data = {}
+ self.valid = {}
+ self.logMonoTime = {}
+
+ self.poller = Poller()
+ self.non_polled_services = [s for s in services if poll is not None and
+ len(poll) and s not in poll]
+
+ self.ignore_average_freq = [] if ignore_avg_freq is None else ignore_avg_freq
+ self.ignore_alive = [] if ignore_alive is None else ignore_alive
+
+ for s in services:
+ if addr is not None:
+ p = self.poller if s not in self.non_polled_services else None
+ self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True)
+ self.freq[s] = service_list[s].frequency
+
+ try:
+ data = new_message(s)
+ except capnp.lib.capnp.KjException: # pylint: disable=c-extension-no-member
+ data = new_message(s, 0) # lists
+
+ self.data[s] = getattr(data, s)
+ self.logMonoTime[s] = 0
+ self.valid[s] = data.valid
+
+ def __getitem__(self, s: str) -> capnp.lib.capnp._DynamicStructReader:
+ return self.data[s]
+
+ def update(self, timeout: int = 1000) -> None:
+ msgs = []
+ for sock in self.poller.poll(timeout):
+ msgs.append(recv_one_or_none(sock))
+
+ # non-blocking receive for non-polled sockets
+ for s in self.non_polled_services:
+ msgs.append(recv_one_or_none(self.sock[s]))
+ self.update_msgs(sec_since_boot(), msgs)
+
+ def update_msgs(self, cur_time: float, msgs: List[capnp.lib.capnp._DynamicStructReader]) -> None:
+ self.frame += 1
+ self.updated = dict.fromkeys(self.updated, False)
+ for msg in msgs:
+ if msg is None:
+ continue
+
+ s = msg.which()
+ self.updated[s] = True
+
+ if self.rcv_time[s] > 1e-5 and self.freq[s] > 1e-5 and (s not in self.non_polled_services) \
+ and (s not in self.ignore_average_freq):
+ self.recv_dts[s].append(cur_time - self.rcv_time[s])
+
+ self.rcv_time[s] = cur_time
+ self.rcv_frame[s] = self.frame
+ self.data[s] = getattr(msg, s)
+ self.logMonoTime[s] = msg.logMonoTime
+ self.valid[s] = msg.valid
+
+ if SIMULATION:
+ self.alive[s] = True
+
+ if not SIMULATION:
+ for s in self.data:
+ # arbitrary small number to avoid float comparison. If freq is 0, we can skip the check
+ if self.freq[s] > 1e-5:
+ # alive if delay is within 10x the expected frequency
+ self.alive[s] = (cur_time - self.rcv_time[s]) < (10. / self.freq[s])
+
+ # alive if average frequency is higher than 90% of expected frequency
+ avg_dt = sum(self.recv_dts[s]) / AVG_FREQ_HISTORY
+ expected_dt = 1 / (self.freq[s] * 0.90)
+ self.alive[s] = self.alive[s] and (avg_dt < expected_dt)
+ else:
+ self.alive[s] = True
+
+ def all_alive(self, service_list=None) -> bool:
+ if service_list is None: # check all
+ service_list = self.alive.keys()
+ return all(self.alive[s] for s in service_list if s not in self.ignore_alive)
+
+ def all_valid(self, service_list=None) -> bool:
+ if service_list is None: # check all
+ service_list = self.valid.keys()
+ return all(self.valid[s] for s in service_list)
+
+ def all_alive_and_valid(self, service_list=None) -> bool:
+ if service_list is None: # check all
+ service_list = self.alive.keys()
+ return self.all_alive(service_list=service_list) and self.all_valid(service_list=service_list)
+
+class PubMaster():
+ def __init__(self, services: List[str]):
+ self.sock = {}
+ for s in services:
+ self.sock[s] = pub_sock(s)
+
+ def send(self, s: str, dat: Union[bytes, capnp.lib.capnp._DynamicStructBuilder]) -> None:
+ if not isinstance(dat, bytes):
+ dat = dat.to_bytes()
+ self.sock[s].send(dat)
+
+ def all_readers_updated(self, s: str) -> bool:
+ return self.sock[s].all_readers_updated()
diff --git a/cereal/messaging/bridge.cc b/cereal/messaging/bridge.cc
new file mode 100644
index 00000000000000..d4bdfcea714c53
--- /dev/null
+++ b/cereal/messaging/bridge.cc
@@ -0,0 +1,79 @@
+#include
+#include
+#include
+#include
+#include