diff --git a/404.html b/404.html index 6d5fb387..493029b9 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Groundlight - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/api-reference-docs/_static/documentation_options.js b/api-reference-docs/_static/documentation_options.js index 8630a0b5..cbac5110 100644 --- a/api-reference-docs/_static/documentation_options.js +++ b/api-reference-docs/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '0.12.1', + VERSION: '0.13.0', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/api-reference-docs/genindex.html b/api-reference-docs/genindex.html index c00ca8ca..9165c77f 100644 --- a/api-reference-docs/genindex.html +++ b/api-reference-docs/genindex.html @@ -3,7 +3,7 @@ - Index — Groundlight Python SDK 0.12.1 documentation + Index — Groundlight Python SDK 0.13.0 documentation @@ -13,7 +13,7 @@ - + @@ -33,7 +33,7 @@ Groundlight Python SDK
- 0.12.1 + 0.13.0
@@ -202,6 +202,10 @@

L

M

+
Returns:
@@ -225,7 +228,7 @@

Welcome to Groundlight Python SDK’s documentation!
-ask_confident(detector: Detector | str, image: str | bytes | Image | BytesIO | BufferedReader | UnavailableModule, confidence_threshold: float | None = None, wait: float | None = None) ImageQuery
+ask_confident(detector: Detector | str, image: str | bytes | Image | BytesIO | BufferedReader | UnavailableModule, confidence_threshold: float | None = None, wait: float | None = None, metadata: dict | str | None = None) ImageQuery

Evaluates an image with Groundlight waiting until an answer above the confidence threshold of the detector is reached or the wait period has passed.

@@ -248,6 +251,9 @@

Welcome to Groundlight Python SDK’s documentation!

confidence_threshold (float) – The confidence threshold to wait for. If not set, use the detector’s confidence threshold.

  • wait (float) – How long to wait (in seconds) for a confident answer.

  • +
  • metadata (dict or str) – A dictionary or JSON string of custom key/value metadata to associate with +the image query (limited to 1KB). You can retrieve this metadata later by calling +get_image_query().

  • Returns:
    @@ -261,7 +267,7 @@

    Welcome to Groundlight Python SDK’s documentation!
    -ask_ml(detector: Detector | str, image: str | bytes | Image | BytesIO | BufferedReader | UnavailableModule, wait: float | None = None) ImageQuery
    +ask_ml(detector: Detector | str, image: str | bytes | Image | BytesIO | BufferedReader | UnavailableModule, wait: float | None = None, metadata: dict | str | None = None) ImageQuery

    Evaluates an image with Groundlight, getting the first answer Groundlight can provide.

    Parameters:
    @@ -281,6 +287,9 @@

    Welcome to Groundlight Python SDK’s documentation!

  • wait (float) – How long to wait (in seconds) for any answer.

  • +
  • metadata (dict or str) – A dictionary or JSON string of custom key/value metadata to associate with +the image query (limited to 1KB). You can retrieve this metadata later by calling +get_image_query().

  • Returns:
    @@ -465,7 +474,7 @@

    Welcome to Groundlight Python SDK’s documentation!
    -submit_image_query(detector: Detector | str, image: str | bytes | Image | BytesIO | BufferedReader | UnavailableModule, wait: float | None = None, patience_time: float | None = None, confidence_threshold: float | None = None, human_review: str | None = None, want_async: bool = False, inspection_id: str | None = None) ImageQuery
    +submit_image_query(detector: Detector | str, image: str | bytes | Image | BytesIO | BufferedReader | UnavailableModule, wait: float | None = None, patience_time: float | None = None, confidence_threshold: float | None = None, human_review: str | None = None, want_async: bool = False, inspection_id: str | None = None, metadata: dict | str | None = None) ImageQuery

    Evaluates an image with Groundlight.

    Parameters:
    @@ -500,6 +509,9 @@

    Welcome to Groundlight Python SDK’s documentation!
  • inspection_id (str) – Most users will omit this. For accounts with Inspection Reports enabled, this is the ID of the inspection to associate with the image query.

  • +
  • metadata (dict or str) – A dictionary or JSON string of custom key/value metadata to associate with +the image query (limited to 1KB). You can retrieve this metadata later by calling +get_image_query().

  • Returns:
    diff --git a/api-reference-docs/models.html b/api-reference-docs/models.html index f03f231e..60dad41e 100644 --- a/api-reference-docs/models.html +++ b/api-reference-docs/models.html @@ -4,7 +4,7 @@ - API Response Objects — Groundlight Python SDK 0.12.1 documentation + API Response Objects — Groundlight Python SDK 0.13.0 documentation @@ -14,7 +14,7 @@ - + @@ -35,7 +35,7 @@ Groundlight Python SDK
    - 0.12.1 + 0.13.0
    @@ -62,6 +62,7 @@
  • ImageQuery.created_at
  • ImageQuery.detector_id
  • ImageQuery.id
  • +
  • ImageQuery.metadata
  • ImageQuery.query
  • ImageQuery.result
  • ImageQuery.result_type
  • @@ -307,6 +308,19 @@

    API Response Objects } ], "default": null + }, + "metadata": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A dictionary of custom key/value metadata to associate with the image query (limited to 1KB).", + "title": "Metadata" } }, "$defs": { @@ -365,6 +379,7 @@

    API Response Objects

    created_at (datetime.datetime)

  • detector_id (str)

  • id (str)

  • +
  • metadata (Dict[str, Any] | None)

  • query (str)

  • result (model.ClassificationResult | None)

  • result_type (model.ResultTypeEnum)

  • @@ -390,6 +405,12 @@

    API Response Objects

    A unique ID for this object.

    +
    +
    +field metadata: Dict[str, Any] | None = None
    +

    A dictionary of custom key/value metadata to associate with the image query (limited to 1KB).

    +
    +
    field query: str [Required]
    @@ -733,6 +754,19 @@

    API Response Objects } ], "default": null + }, + "metadata": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A dictionary of custom key/value metadata to associate with the image query (limited to 1KB).", + "title": "Metadata" } }, "required": [ diff --git a/api-reference-docs/objects.inv b/api-reference-docs/objects.inv index 98f02287..bb83a05b 100644 Binary files a/api-reference-docs/objects.inv and b/api-reference-docs/objects.inv differ diff --git a/api-reference-docs/py-modindex.html b/api-reference-docs/py-modindex.html index 27876e5d..7e5cbd42 100644 --- a/api-reference-docs/py-modindex.html +++ b/api-reference-docs/py-modindex.html @@ -3,7 +3,7 @@ - Python Module Index — Groundlight Python SDK 0.12.1 documentation + Python Module Index — Groundlight Python SDK 0.13.0 documentation @@ -13,7 +13,7 @@ - + @@ -36,7 +36,7 @@ Groundlight Python SDK
    - 0.12.1 + 0.13.0
    diff --git a/api-reference-docs/search.html b/api-reference-docs/search.html index f841a8b2..9ac28842 100644 --- a/api-reference-docs/search.html +++ b/api-reference-docs/search.html @@ -3,7 +3,7 @@ - Search — Groundlight Python SDK 0.12.1 documentation + Search — Groundlight Python SDK 0.13.0 documentation @@ -14,7 +14,7 @@ - + @@ -36,7 +36,7 @@ Groundlight Python SDK
    - 0.12.1 + 0.13.0
    diff --git a/api-reference-docs/searchindex.js b/api-reference-docs/searchindex.js index 510d8f79..70e2ce1c 100644 --- a/api-reference-docs/searchindex.js +++ b/api-reference-docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "models"], "filenames": ["index.rst", "models.rst"], "titles": ["Welcome to Groundlight Python SDK\u2019s documentation!", "API Response Objects"], "terms": {"For": 0, "detail": 0, "view": 0, "sourc": 0, "code": 0, "visit": 0, "github": 0, "repositori": 0, "class": 0, "client": 0, "endpoint": 0, "str": [0, 1], "none": [0, 1], "api_token": 0, "access": 0, "cloud": 0, "servic": 0, "The": [0, 1], "api": 0, "token": 0, "auth": 0, "i": [0, 1], "specifi": 0, "through": 0, "groundlight_api_token": 0, "environ": 0, "variabl": 0, "default": [0, 1], "exampl": [0, 1], "usag": 0, "gl": 0, "detector": [0, 1], "get_or_create_detector": 0, "name": [0, 1], "door": 0, "queri": [0, 1], "lock": 0, "confidence_threshold": [0, 1], "0": [0, 1], "9": [0, 1], "image_queri": [0, 1], "submit_image_queri": 0, "imag": [0, 1], "path": 0, "jpeg": 0, "wait": 0, "human_review": 0, "alwai": 0, "print": 0, "f": 0, "confid": [0, 1], "result": [0, 1], "poll": 0, "backend": 0, "answer": 0, "wait_for_confident_result": 0, "timeout_sec": 0, "60": 0, "examin": 0, "new": 0, "after": 0, "continu": 0, "train": 0, "ml": 0, "model": [0, 1], "ha": 0, "re": 0, "evalu": 0, "__init__": 0, "construct": 0, "paramet": 0, "option": [0, 1], "differ": 0, "us": [0, 1], "thi": [0, 1], "your": 0, "call": 0, "If": [0, 1], "unset": 0, "fallback": 0, "return": [0, 1], "type": [0, 1], "add_label": 0, "imagequeri": [0, 1], "label": [0, 1], "add": 0, "an": 0, "question": [0, 1], "either": 0, "object": 0, "from": 0, "id": [0, 1], "string": [0, 1], "ye": 0, "NO": 0, "ask_async": 0, "byte": 0, "bytesio": 0, "bufferedread": 0, "unavailablemodul": 0, "patience_tim": 0, "float": [0, 1], "conveni": 0, "method": 0, "submit": 0, "asynchron": 0, "equival": 0, "want_async": 0, "true": 0, "get_image_queri": 0, "retriev": 0, "like": 0, "det_12345": 0, "np": 0, "ndarrai": 0, "sever": 0, "possibl": 0, "format": [0, 1], "filenam": 0, "file": 0, "arrai": [0, 1], "numpi": 0, "valu": 0, "255": 0, "dimens": 0, "h": 0, "w": 0, "3": 0, "bgr": 0, "order": 0, "note": 0, "opencv": 0, "rgb": 0, "img": 0, "1": [0, 1], "revers": 0, "channel": 0, "pil": 0, "ani": 0, "binari": 0, "must": 0, "encod": 0, "alreadi": 0, "pixel": 0, "get": 0, "convert": 0, "high": 0, "qualiti": 0, "befor": 0, "send": [0, 1], "how": [0, 1], "long": 0, "second": 0, "longer": 0, "more": 0, "arriv": 0, "within": 0, "updat": 0, "predict": [0, 1], "base": 0, "stronger": 0, "find": 0, "addition": 0, "priorit": 0, "human": [0, 1], "review": [0, 1], "necessari": 0, "soft": 0, "server": 0, "side": 0, "timeout": 0, "set": 0, "threshold": [0, 1], "onli": 0, "never": 0, "inspection_id": 0, "most": 0, "user": 0, "omit": 0, "account": [0, 1], "inspect": 0, "report": 0, "enabl": 0, "associ": 0, "have": 0, "later": 0, "assert": 0, "do": 0, "attempt": 0, "all": 0, "async": 0, "being": 0, "comput": 0, "avail": 0, "anoth": 0, "machin": 0, "abov": 0, "block": 0, "until": 0, "now": 0, "altern": 0, "you": 0, "can": 0, "check": 0, "without": 0, "ask_confid": 0, "reach": 0, "period": 0, "pass": 0, "ask_ml": 0, "first": 0, "provid": 0, "create_detector": 0, "pipeline_config": 0, "creat": [0, 1], "given": 0, "pipelin": 0, "config": 0, "get_detector": 0, "get_detector_by_nam": 0, "tri": 0, "look": 0, "up": 0, "exist": 0, "otherwis": 0, "list_detector": 0, "page": [0, 1], "int": [0, 1], "page_s": 0, "10": 0, "paginateddetectorlist": [0, 1], "list": [0, 1], "out": 0, "own": 0, "number": [0, 1], "size": 0, "list_image_queri": 0, "paginatedimagequerylist": [0, 1], "start_inspect": 0, "start": 0, "uniqu": [0, 1], "identifi": 0, "stop_inspect": 0, "stop": 0, "rais": 0, "except": 0, "respons": 0, "wa": [0, 1], "successfulli": 0, "fail": 0, "depend": 0, "bool": 0, "fals": 0, "soon": 0, "update_detector_confidence_threshold": 0, "detector_id": [0, 1], "rtype": 0, "update_inspection_metadata": 0, "user_provided_kei": 0, "user_provided_valu": 0, "metadata": 0, "kei": 0, "pair": 0, "30": 0, "level": 0, "current": 0, "done": 0, "exponenti": 0, "back": 0, "off": 0, "maximum": [0, 1], "wait_for_ml_result": 0, "index": 0, "modul": 0, "search": 0, "pydant": 1, "show": 1, "json": 1, "schema": 1, "titl": 1, "properti": 1, "descript": 1, "A": 1, "allof": 1, "ref": 1, "def": 1, "detectortypeenum": 1, "created_at": 1, "when": 1, "date": 1, "time": 1, "At": 1, "short": 1, "maxlength": 1, "200": 1, "about": 1, "group_nam": 1, "which": 1, "group": 1, "should": 1, "part": 1, "anyof": 1, "minimum": 1, "null": 1, "": 1, "below": 1, "const": 1, "requir": 1, "field": 1, "datetim": 1, "confloat": 1, "ge": 1, "le": 1, "constr": 1, "max_length": 1, "constraint": 1, "imagequerytypeenum": 1, "result_typ": 1, "resulttypeenum": 1, "what": 1, "ar": 1, "we": 1, "classificationresult": 1, "On": 1, "scale": 1, "binary_classif": 1, "count": 1, "integ": 1, "123": 1, "next": 1, "uri": 1, "minlength": 1, "http": 1, "org": 1, "4": 1, "previou": 1, "2": 1, "item": 1, "pydantic_cor": 1, "_pydantic_cor": 1, "url": 1, "anyurl": 1}, "objects": {"groundlight": [[0, 0, 0, "-", "client"]], "groundlight.client": [[0, 1, 1, "", "Groundlight"]], "groundlight.client.Groundlight": [[0, 2, 1, "", "__init__"], [0, 2, 1, "", "add_label"], [0, 2, 1, "", "ask_async"], [0, 2, 1, "", "ask_confident"], [0, 2, 1, "", "ask_ml"], [0, 2, 1, "", "create_detector"], [0, 2, 1, "", "get_detector"], [0, 2, 1, "", "get_detector_by_name"], [0, 2, 1, "", "get_image_query"], [0, 2, 1, "", "get_or_create_detector"], [0, 2, 1, "", "list_detectors"], [0, 2, 1, "", "list_image_queries"], [0, 2, 1, "", "start_inspection"], [0, 2, 1, "", "stop_inspection"], [0, 2, 1, "", "submit_image_query"], [0, 2, 1, "", "update_detector_confidence_threshold"], [0, 2, 1, "", "update_inspection_metadata"], [0, 2, 1, "", "wait_for_confident_result"], [0, 2, 1, "", "wait_for_ml_result"]], "model": [[1, 3, 1, "", "Detector"], [1, 3, 1, "", "ImageQuery"], [1, 3, 1, "", "PaginatedDetectorList"], [1, 3, 1, "", "PaginatedImageQueryList"]], "model.Detector": [[1, 4, 1, "", "confidence_threshold"], [1, 4, 1, "", "created_at"], [1, 4, 1, "", "group_name"], [1, 4, 1, "", "id"], [1, 4, 1, "", "name"], [1, 4, 1, "", "query"], [1, 4, 1, "", "type"]], "model.ImageQuery": [[1, 4, 1, "", "created_at"], [1, 4, 1, "", "detector_id"], [1, 4, 1, "", "id"], [1, 4, 1, "", "query"], [1, 4, 1, "", "result"], [1, 4, 1, "", "result_type"], [1, 4, 1, "", "type"]], "model.PaginatedDetectorList": [[1, 4, 1, "", "count"], [1, 4, 1, "", "next"], [1, 4, 1, "", "previous"], [1, 4, 1, "", "results"]], "model.PaginatedImageQueryList": [[1, 4, 1, "", "count"], [1, 4, 1, "", "next"], [1, 4, 1, "", "previous"], [1, 4, 1, "", "results"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:pydantic_model", "4": "py:pydantic_field"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "pydantic_model", "Python model"], "4": ["py", "pydantic_field", "Python field"]}, "titleterms": {"welcom": 0, "groundlight": 0, "python": 0, "sdk": 0, "": 0, "document": 0, "content": 0, "indic": 0, "tabl": 0, "api": 1, "respons": 1, "object": 1}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Welcome to Groundlight Python SDK\u2019s documentation!": [[0, "welcome-to-groundlight-python-sdk-s-documentation"]], "Contents:": [[0, null]], "Indices and tables": [[0, "indices-and-tables"]], "API Response Objects": [[1, "api-response-objects"]]}, "indexentries": {"groundlight (class in groundlight.client)": [[0, "groundlight.client.Groundlight"]], "__init__() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.__init__"]], "add_label() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.add_label"]], "ask_async() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.ask_async"]], "ask_confident() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.ask_confident"]], "ask_ml() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.ask_ml"]], "create_detector() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.create_detector"]], "get_detector() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_detector"]], "get_detector_by_name() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_detector_by_name"]], "get_image_query() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_image_query"]], "get_or_create_detector() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_or_create_detector"]], "groundlight.client": [[0, "module-groundlight.client"]], "list_detectors() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.list_detectors"]], "list_image_queries() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.list_image_queries"]], "module": [[0, "module-groundlight.client"]], "start_inspection() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.start_inspection"]], "stop_inspection() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.stop_inspection"]], "submit_image_query() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.submit_image_query"]], "update_detector_confidence_threshold() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.update_detector_confidence_threshold"]], "update_inspection_metadata() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.update_inspection_metadata"]], "wait_for_confident_result() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.wait_for_confident_result"]], "wait_for_ml_result() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.wait_for_ml_result"]], "confidence_threshold (model.detector attribute)": [[1, "model.Detector.confidence_threshold"]], "count (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.count"]], "count (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.count"]], "created_at (model.detector attribute)": [[1, "model.Detector.created_at"]], "created_at (model.imagequery attribute)": [[1, "model.ImageQuery.created_at"]], "detector_id (model.imagequery attribute)": [[1, "model.ImageQuery.detector_id"]], "group_name (model.detector attribute)": [[1, "model.Detector.group_name"]], "id (model.detector attribute)": [[1, "model.Detector.id"]], "id (model.imagequery attribute)": [[1, "model.ImageQuery.id"]], "name (model.detector attribute)": [[1, "model.Detector.name"]], "next (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.next"]], "next (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.next"]], "previous (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.previous"]], "previous (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.previous"]], "query (model.detector attribute)": [[1, "model.Detector.query"]], "query (model.imagequery attribute)": [[1, "model.ImageQuery.query"]], "result (model.imagequery attribute)": [[1, "model.ImageQuery.result"]], "result_type (model.imagequery attribute)": [[1, "model.ImageQuery.result_type"]], "results (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.results"]], "results (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.results"]], "type (model.detector attribute)": [[1, "model.Detector.type"]], "type (model.imagequery attribute)": [[1, "model.ImageQuery.type"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "models"], "filenames": ["index.rst", "models.rst"], "titles": ["Welcome to Groundlight Python SDK\u2019s documentation!", "API Response Objects"], "terms": {"For": 0, "detail": 0, "view": 0, "sourc": 0, "code": 0, "visit": 0, "github": 0, "repositori": 0, "class": 0, "client": 0, "endpoint": 0, "str": [0, 1], "none": [0, 1], "api_token": 0, "access": 0, "cloud": 0, "servic": 0, "The": [0, 1], "api": 0, "token": 0, "auth": 0, "i": [0, 1], "specifi": 0, "through": 0, "groundlight_api_token": 0, "environ": 0, "variabl": 0, "default": [0, 1], "exampl": [0, 1], "usag": 0, "gl": 0, "detector": [0, 1], "get_or_create_detector": 0, "name": [0, 1], "door": 0, "queri": [0, 1], "lock": 0, "confidence_threshold": [0, 1], "0": [0, 1], "9": [0, 1], "image_queri": [0, 1], "submit_image_queri": 0, "imag": [0, 1], "path": 0, "jpeg": 0, "wait": 0, "human_review": 0, "alwai": 0, "print": 0, "f": 0, "confid": [0, 1], "result": [0, 1], "poll": 0, "backend": 0, "answer": 0, "wait_for_confident_result": 0, "timeout_sec": 0, "60": 0, "examin": 0, "new": 0, "after": 0, "continu": 0, "train": 0, "ml": 0, "model": [0, 1], "ha": 0, "re": 0, "evalu": 0, "__init__": 0, "construct": 0, "paramet": 0, "option": [0, 1], "differ": 0, "us": [0, 1], "thi": [0, 1], "your": 0, "call": 0, "If": [0, 1], "unset": 0, "fallback": 0, "return": [0, 1], "type": [0, 1], "add_label": 0, "imagequeri": [0, 1], "label": [0, 1], "add": 0, "an": 0, "question": [0, 1], "either": 0, "object": 0, "from": 0, "id": [0, 1], "string": [0, 1], "ye": 0, "NO": 0, "ask_async": 0, "byte": 0, "bytesio": 0, "bufferedread": 0, "unavailablemodul": 0, "patience_tim": 0, "float": [0, 1], "metadata": [0, 1], "dict": [0, 1], "conveni": 0, "method": 0, "submit": 0, "asynchron": 0, "equival": 0, "want_async": 0, "true": 0, "get_image_queri": 0, "retriev": 0, "like": 0, "det_12345": 0, "np": 0, "ndarrai": 0, "sever": 0, "possibl": 0, "format": [0, 1], "filenam": 0, "file": 0, "arrai": [0, 1], "numpi": 0, "valu": [0, 1], "255": 0, "dimens": 0, "h": 0, "w": 0, "3": 0, "bgr": 0, "order": 0, "note": 0, "opencv": 0, "rgb": 0, "img": 0, "1": [0, 1], "revers": 0, "channel": 0, "pil": 0, "ani": [0, 1], "binari": 0, "must": 0, "encod": 0, "alreadi": 0, "pixel": 0, "get": 0, "convert": 0, "high": 0, "qualiti": 0, "befor": 0, "send": [0, 1], "how": [0, 1], "long": 0, "second": 0, "longer": 0, "more": 0, "arriv": 0, "within": 0, "updat": 0, "predict": [0, 1], "base": 0, "stronger": 0, "find": 0, "addition": 0, "priorit": 0, "human": [0, 1], "review": [0, 1], "necessari": 0, "soft": 0, "server": 0, "side": 0, "timeout": 0, "set": 0, "threshold": [0, 1], "onli": 0, "never": 0, "inspection_id": 0, "most": 0, "user": 0, "omit": 0, "account": [0, 1], "inspect": 0, "report": 0, "enabl": 0, "associ": [0, 1], "A": [0, 1], "dictionari": [0, 1], "json": [0, 1], "custom": [0, 1], "kei": [0, 1], "limit": [0, 1], "1kb": [0, 1], "you": 0, "can": 0, "later": 0, "have": 0, "assert": 0, "do": 0, "attempt": 0, "all": 0, "async": 0, "being": 0, "comput": 0, "avail": 0, "anoth": 0, "machin": 0, "abov": 0, "block": 0, "until": 0, "now": 0, "altern": 0, "check": 0, "without": 0, "ask_confid": 0, "reach": 0, "period": 0, "pass": 0, "ask_ml": 0, "first": 0, "provid": 0, "create_detector": 0, "pipeline_config": 0, "creat": [0, 1], "given": 0, "pipelin": 0, "config": 0, "get_detector": 0, "get_detector_by_nam": 0, "tri": 0, "look": 0, "up": 0, "exist": 0, "otherwis": 0, "list_detector": 0, "page": [0, 1], "int": [0, 1], "page_s": 0, "10": 0, "paginateddetectorlist": [0, 1], "list": [0, 1], "out": 0, "own": 0, "number": [0, 1], "size": 0, "list_image_queri": 0, "paginatedimagequerylist": [0, 1], "start_inspect": 0, "start": 0, "uniqu": [0, 1], "identifi": 0, "stop_inspect": 0, "stop": 0, "rais": 0, "except": 0, "respons": 0, "wa": [0, 1], "successfulli": 0, "fail": 0, "depend": 0, "bool": 0, "fals": 0, "soon": 0, "update_detector_confidence_threshold": 0, "detector_id": [0, 1], "rtype": 0, "update_inspection_metadata": 0, "user_provided_kei": 0, "user_provided_valu": 0, "pair": 0, "30": 0, "level": 0, "current": 0, "done": 0, "exponenti": 0, "back": 0, "off": 0, "maximum": [0, 1], "wait_for_ml_result": 0, "index": 0, "modul": 0, "search": 0, "pydant": 1, "show": 1, "schema": 1, "titl": 1, "properti": 1, "descript": 1, "allof": 1, "ref": 1, "def": 1, "detectortypeenum": 1, "created_at": 1, "when": 1, "date": 1, "time": 1, "At": 1, "short": 1, "maxlength": 1, "200": 1, "about": 1, "group_nam": 1, "which": 1, "group": 1, "should": 1, "part": 1, "anyof": 1, "minimum": 1, "null": 1, "": 1, "below": 1, "const": 1, "requir": 1, "field": 1, "datetim": 1, "confloat": 1, "ge": 1, "le": 1, "constr": 1, "max_length": 1, "constraint": 1, "imagequerytypeenum": 1, "result_typ": 1, "resulttypeenum": 1, "what": 1, "ar": 1, "we": 1, "classificationresult": 1, "On": 1, "scale": 1, "binary_classif": 1, "count": 1, "integ": 1, "123": 1, "next": 1, "uri": 1, "minlength": 1, "http": 1, "org": 1, "4": 1, "previou": 1, "2": 1, "item": 1, "pydantic_cor": 1, "_pydantic_cor": 1, "url": 1, "anyurl": 1}, "objects": {"groundlight": [[0, 0, 0, "-", "client"]], "groundlight.client": [[0, 1, 1, "", "Groundlight"]], "groundlight.client.Groundlight": [[0, 2, 1, "", "__init__"], [0, 2, 1, "", "add_label"], [0, 2, 1, "", "ask_async"], [0, 2, 1, "", "ask_confident"], [0, 2, 1, "", "ask_ml"], [0, 2, 1, "", "create_detector"], [0, 2, 1, "", "get_detector"], [0, 2, 1, "", "get_detector_by_name"], [0, 2, 1, "", "get_image_query"], [0, 2, 1, "", "get_or_create_detector"], [0, 2, 1, "", "list_detectors"], [0, 2, 1, "", "list_image_queries"], [0, 2, 1, "", "start_inspection"], [0, 2, 1, "", "stop_inspection"], [0, 2, 1, "", "submit_image_query"], [0, 2, 1, "", "update_detector_confidence_threshold"], [0, 2, 1, "", "update_inspection_metadata"], [0, 2, 1, "", "wait_for_confident_result"], [0, 2, 1, "", "wait_for_ml_result"]], "model": [[1, 3, 1, "", "Detector"], [1, 3, 1, "", "ImageQuery"], [1, 3, 1, "", "PaginatedDetectorList"], [1, 3, 1, "", "PaginatedImageQueryList"]], "model.Detector": [[1, 4, 1, "", "confidence_threshold"], [1, 4, 1, "", "created_at"], [1, 4, 1, "", "group_name"], [1, 4, 1, "", "id"], [1, 4, 1, "", "name"], [1, 4, 1, "", "query"], [1, 4, 1, "", "type"]], "model.ImageQuery": [[1, 4, 1, "", "created_at"], [1, 4, 1, "", "detector_id"], [1, 4, 1, "", "id"], [1, 4, 1, "", "metadata"], [1, 4, 1, "", "query"], [1, 4, 1, "", "result"], [1, 4, 1, "", "result_type"], [1, 4, 1, "", "type"]], "model.PaginatedDetectorList": [[1, 4, 1, "", "count"], [1, 4, 1, "", "next"], [1, 4, 1, "", "previous"], [1, 4, 1, "", "results"]], "model.PaginatedImageQueryList": [[1, 4, 1, "", "count"], [1, 4, 1, "", "next"], [1, 4, 1, "", "previous"], [1, 4, 1, "", "results"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:pydantic_model", "4": "py:pydantic_field"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "pydantic_model", "Python model"], "4": ["py", "pydantic_field", "Python field"]}, "titleterms": {"welcom": 0, "groundlight": 0, "python": 0, "sdk": 0, "": 0, "document": 0, "content": 0, "indic": 0, "tabl": 0, "api": 1, "respons": 1, "object": 1}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Welcome to Groundlight Python SDK\u2019s documentation!": [[0, "welcome-to-groundlight-python-sdk-s-documentation"]], "Contents:": [[0, null]], "Indices and tables": [[0, "indices-and-tables"]], "API Response Objects": [[1, "api-response-objects"]]}, "indexentries": {"groundlight (class in groundlight.client)": [[0, "groundlight.client.Groundlight"]], "__init__() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.__init__"]], "add_label() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.add_label"]], "ask_async() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.ask_async"]], "ask_confident() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.ask_confident"]], "ask_ml() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.ask_ml"]], "create_detector() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.create_detector"]], "get_detector() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_detector"]], "get_detector_by_name() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_detector_by_name"]], "get_image_query() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_image_query"]], "get_or_create_detector() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.get_or_create_detector"]], "groundlight.client": [[0, "module-groundlight.client"]], "list_detectors() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.list_detectors"]], "list_image_queries() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.list_image_queries"]], "module": [[0, "module-groundlight.client"]], "start_inspection() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.start_inspection"]], "stop_inspection() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.stop_inspection"]], "submit_image_query() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.submit_image_query"]], "update_detector_confidence_threshold() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.update_detector_confidence_threshold"]], "update_inspection_metadata() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.update_inspection_metadata"]], "wait_for_confident_result() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.wait_for_confident_result"]], "wait_for_ml_result() (groundlight.client.groundlight method)": [[0, "groundlight.client.Groundlight.wait_for_ml_result"]], "confidence_threshold (model.detector attribute)": [[1, "model.Detector.confidence_threshold"]], "count (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.count"]], "count (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.count"]], "created_at (model.detector attribute)": [[1, "model.Detector.created_at"]], "created_at (model.imagequery attribute)": [[1, "model.ImageQuery.created_at"]], "detector_id (model.imagequery attribute)": [[1, "model.ImageQuery.detector_id"]], "group_name (model.detector attribute)": [[1, "model.Detector.group_name"]], "id (model.detector attribute)": [[1, "model.Detector.id"]], "id (model.imagequery attribute)": [[1, "model.ImageQuery.id"]], "metadata (model.imagequery attribute)": [[1, "model.ImageQuery.metadata"]], "name (model.detector attribute)": [[1, "model.Detector.name"]], "next (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.next"]], "next (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.next"]], "previous (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.previous"]], "previous (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.previous"]], "query (model.detector attribute)": [[1, "model.Detector.query"]], "query (model.imagequery attribute)": [[1, "model.ImageQuery.query"]], "result (model.imagequery attribute)": [[1, "model.ImageQuery.result"]], "result_type (model.imagequery attribute)": [[1, "model.ImageQuery.result_type"]], "results (model.paginateddetectorlist attribute)": [[1, "model.PaginatedDetectorList.results"]], "results (model.paginatedimagequerylist attribute)": [[1, "model.PaginatedImageQueryList.results"]], "type (model.detector attribute)": [[1, "model.Detector.type"]], "type (model.imagequery attribute)": [[1, "model.ImageQuery.type"]]}}) \ No newline at end of file diff --git a/assets/js/004649c5.46c6f850.js b/assets/js/004649c5.46c6f850.js new file mode 100644 index 00000000..cd95adfd --- /dev/null +++ b/assets/js/004649c5.46c6f850.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[342],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>u});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=p(n),g=a,u=m["".concat(l,".").concat(g)]||m[g]||d[g]||i;return n?r.createElement(u,o(o({ref:t},c),{},{components:n})):r.createElement(u,o({ref:t},c))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={sidebar_position:1},o="Grabbing Images",s={unversionedId:"building-applications/grabbing-images",id:"building-applications/grabbing-images",title:"Grabbing Images",description:"Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.",source:"@site/docs/building-applications/2-grabbing-images.md",sourceDirName:"building-applications",slug:"/building-applications/grabbing-images",permalink:"/python-sdk/docs/building-applications/grabbing-images",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/2-grabbing-images.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Sample Applications",permalink:"/python-sdk/docs/building-applications/sample-applications"},next:{title:"Working with Detectors",permalink:"/python-sdk/docs/building-applications/working-with-detectors"}},l={},p=[{value:"PIL",id:"pil",level:2},{value:"OpenCV",id:"opencv",level:2},{value:"Numpy",id:"numpy",level:2},{value:"Channel order: BGR vs RGB",id:"channel-order-bgr-vs-rgb",level:3},{value:"Framegrab",id:"framegrab",level:2}],c={toc:p},m="wrapper";function d(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,r.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"grabbing-images"},"Grabbing Images"),(0,a.kt)("p",null,"Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays. "),(0,a.kt)("h2",{id:"pil"},"PIL"),(0,a.kt)("p",null,"The Groundlight SDK can accept PIL images directly in ",(0,a.kt)("inlineCode",{parentName:"p"},"submit_image_query"),". Here's an example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python"},'from groundlight import Groundlight\nfrom PIL import Image\n\ngl = Groundlight()\ndet = gl.get_or_create_detector(name="path-clear", query="Is the path clear?")\npil_img = Image.open("./docs/static/img/doorway.jpg")\ngl.submit_image_query(det, pil_img)\n')),(0,a.kt)("h2",{id:"opencv"},"OpenCV"),(0,a.kt)("p",null,"OpenCV is a popular image processing library, with many utilities for working with images.\nOpenCV images are stored as numpy arrays. (Note they are stored in BGR order, not RGB order, but as of Groundlight SDK v0.8 this is the expected order.)\nOpenCV's images can be send directly to ",(0,a.kt)("inlineCode",{parentName:"p"},"submit_image_query")," as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"import cv2\n\ncam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)\n\n_, frame = cam.read() # Capture one frame\ngl.submit_image_query(detector, frame) # Send the frame to Groundlight\ncam.release() # Release the camera\n")),(0,a.kt)("h2",{id:"numpy"},"Numpy"),(0,a.kt)("p",null,"The Groundlight SDK can accept images as ",(0,a.kt)("inlineCode",{parentName:"p"},"numpy")," arrays. They should be in the standard HWN format in BGR color order, matching OpenCV standards.\nPixel values should be from 0-255 (not 0.0-1.0 as floats). So ",(0,a.kt)("inlineCode",{parentName:"p"},"uint8")," data type is preferable since it saves memory."),(0,a.kt)("p",null,"Here's sample code to create an 800x600 random image in numpy:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"import numpy as np\n\nnp_img = np.random.uniform(low=0, high=255, size=(600, 800, 3)).astype(np.uint8)\n# Note: channel order is interpretted as BGR not RGB\ngl.submit_image_query(detector, np_img)\n")),(0,a.kt)("h3",{id:"channel-order-bgr-vs-rgb"},"Channel order: BGR vs RGB"),(0,a.kt)("p",null,"Groundlight expects images in BGR order, because this is standard for OpenCV, which uses numpy arrays as image storage.\n(OpenCV uses BGR because it was originally developed decades ago for compatibility with the BGR color format used by many cameras and image processing hardware at the time of its creation.)\nMost other image libraries use RGB order, so if you are using images as numpy arrays which did not originate from OpenCV you likely need to reverse the channel order before sending the images to Groundlight.\nNote this change was made in v0.8 of the Groundlight SDK - in previous versions, RGB order was expected. "),(0,a.kt)("p",null,"If you have an RGB array, you must reverse the channel order before sending it to Groundlight, like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"# Convert numpy image in RGB channel order to BGR order\nbgr_img = rgb_img[:, :, ::-1]\n")),(0,a.kt)("p",null,"The difference can be surprisingly subtle when red and blue get swapped. Often images just look a little off, but sometimes they look very wrong."),(0,a.kt)("p",null,"Here's an example of a natural-scene image where you might think the color balance is just off:\n",(0,a.kt)("img",{alt:"Correct color order",src:n(2e3).Z,width:"800",height:"600"}),"\n",(0,a.kt)("img",{alt:"Swapped color channels",src:n(9337).Z,width:"800",height:"600"})),(0,a.kt)("p",null,"In industrial settings, the difference can be almost impossible to detect without prior knowledge of the scene:\n",(0,a.kt)("img",{alt:"Correct color order",src:n(6033).Z,width:"1418",height:"979"}),"\n",(0,a.kt)("img",{alt:"Swapped color channels",src:n(2239).Z,width:"1418",height:"979"})),(0,a.kt)("h2",{id:"framegrab"},"Framegrab"),(0,a.kt)("p",null,"For a unified interface to many different kinds of image sources, see the ",(0,a.kt)("a",{parentName:"p",href:"https://pypi.org/project/framegrab/"},"framegrab library"),".\nFramegrab is still an early work in progress, but has many useful features for working with cameras and other image sources. Framegrab provides a single interface for many different kinds of image sources, including:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"USB cameras"),(0,a.kt)("li",{parentName:"ul"},"IP cameras"),(0,a.kt)("li",{parentName:"ul"},"Video files"),(0,a.kt)("li",{parentName:"ul"},"Image files")))}d.isMDXComponent=!0},2239:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/cnc-gripper-bgr-3f62a203a84000db8dffb8b542aa8706.jpg"},6033:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/cnc-gripper-4e667290978a62db9edcb5859e42da1b.jpg"},9337:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/michonne-bgr-b7e5ce1b0ea7a8fad1386bb13f0b13cb.jpg"},2e3:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/michonne-d62a9f110b7dab2a04b1dca75c5cf39c.jpg"}}]); \ No newline at end of file diff --git a/assets/js/b3e12d2d.388f43c1.js b/assets/js/0fd99c0f.3b605a77.js similarity index 96% rename from assets/js/b3e12d2d.388f43c1.js rename to assets/js/0fd99c0f.3b605a77.js index 08276134..204dd074 100644 --- a/assets/js/b3e12d2d.388f43c1.js +++ b/assets/js/0fd99c0f.3b605a77.js @@ -1 +1 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[242],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var i=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),g=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=g(e.components);return i.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=g(r),p=n,m=d["".concat(s,".").concat(p)]||d[p]||c[p]||a;return r?i.createElement(m,o(o({ref:t},u),{},{components:r})):i.createElement(m,o({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,o[1]=l;for(var g=2;g{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>l,toc:()=>g});var i=r(7462),n=(r(7294),r(3905));const a={sidebar_position:2},o="Working with Detectors",l={unversionedId:"building-applications/working-with-detectors",id:"building-applications/working-with-detectors",title:"Working with Detectors",description:"Explicitly create a new detector",source:"@site/docs/building-applications/2-working-with-detectors.md",sourceDirName:"building-applications",slug:"/building-applications/working-with-detectors",permalink:"/python-sdk/docs/building-applications/working-with-detectors",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/2-working-with-detectors.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Grabbing Images",permalink:"/python-sdk/docs/building-applications/grabbing-images"},next:{title:"Confidence Levels",permalink:"/python-sdk/docs/building-applications/managing-confidence"}},s={},g=[{value:"Explicitly create a new detector",id:"explicitly-create-a-new-detector",level:3},{value:"Retrieve an existing detector",id:"retrieve-an-existing-detector",level:3},{value:"List your detectors",id:"list-your-detectors",level:3},{value:"Retrieve an image query",id:"retrieve-an-image-query",level:3},{value:"List your previous image queries",id:"list-your-previous-image-queries",level:3},{value:"Adding labels to existing image queries",id:"adding-labels-to-existing-image-queries",level:3}],u={toc:g},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"working-with-detectors"},"Working with Detectors"),(0,n.kt)("h3",{id:"explicitly-create-a-new-detector"},"Explicitly create a new detector"),(0,n.kt)("p",null,"Typically you'll use the ",(0,n.kt)("inlineCode",{parentName:"p"},"get_or_create_detector(name: str, query: str)")," method to find an existing detector you've already created with the same name, or create a new one if it doesn't exists. But if you'd like to force creating a new detector you can also use the ",(0,n.kt)("inlineCode",{parentName:"p"},"create_detector(name: str, query: str)")," method"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\ndetector = gl.create_detector(name="your_detector_name", query="is this what we want to see?")\n# highlight-end\n')),(0,n.kt)("h3",{id:"retrieve-an-existing-detector"},"Retrieve an existing detector"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\ndetector = gl.get_detector(id="YOUR_DETECTOR_ID")\n# highlight-end\n')),(0,n.kt)("h3",{id:"list-your-detectors"},"List your detectors"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python"},"from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\n# Defaults to 10 results per page\ndetectors = gl.list_detectors()\n\n# Pagination: 1st page of 5 results per page\ndetectors = gl.list_detectors(page=1, page_size=5)\n# highlight-end\n")),(0,n.kt)("h3",{id:"retrieve-an-image-query"},"Retrieve an image query"),(0,n.kt)("p",null,"In practice, you may want to check for a new result on your query. For example, after a cloud reviewer labels your query. For example, you can use the ",(0,n.kt)("inlineCode",{parentName:"p"},"image_query.id")," after the above ",(0,n.kt)("inlineCode",{parentName:"p"},"submit_image_query()")," call."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\nimage_query = gl.get_image_query(id="iq_YOUR_IMAGE_QUERY_ID")\n# highlight-end\n')),(0,n.kt)("h3",{id:"list-your-previous-image-queries"},"List your previous image queries"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python"},"from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\n# Defaults to 10 results per page\nimage_queries = gl.list_image_queries()\n\n# Pagination: 1st page of 5 results per page\nimage_queries = gl.list_image_queries(page=1, page_size=5)\n# highlight-end\n")),(0,n.kt)("h3",{id:"adding-labels-to-existing-image-queries"},"Adding labels to existing image queries"),(0,n.kt)("p",null,"Groundlight lets you start using models by making queries against your very first image, but there are a few situations where you might either have an existing dataset, or you'd like to handle the escalation response programatically in your own code but still include the label to get better responses in the future. With your ",(0,n.kt)("inlineCode",{parentName:"p"},"image_query")," from either ",(0,n.kt)("inlineCode",{parentName:"p"},"submit_image_query()")," or ",(0,n.kt)("inlineCode",{parentName:"p"},"get_image_query()")," you can add the label directly. Note that if the query is already in the escalation queue due to low ML confidence or audit thresholds, it may also receive labels from another source."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python"},'from groundlight import Groundlight\nfrom PIL import Image\nimport requests\n\ngl = Groundlight()\nd = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")\nimage_url= "https://images.selfstorage.com/large-compress/2174925f24362c479b2.jpg"\nimage = Image.open(requests.get(image_url, stream=True).raw)\nimage_query = gl.submit_image_query(detector=d, image=image)\n# highlight-start\ngl.add_label(image_query, \'YES\') # or \'NO\'\n# highlight-end\n')),(0,n.kt)("p",null,"The only valid labels at this time are ",(0,n.kt)("inlineCode",{parentName:"p"},"'YES'")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"'NO'"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[136],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var i=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=i.createContext({}),g=function(e){var t=i.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=g(e.components);return i.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=g(r),p=n,m=d["".concat(s,".").concat(p)]||d[p]||c[p]||a;return r?i.createElement(m,o(o({ref:t},u),{},{components:r})):i.createElement(m,o({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:n,o[1]=l;for(var g=2;g{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>l,toc:()=>g});var i=r(7462),n=(r(7294),r(3905));const a={sidebar_position:2},o="Working with Detectors",l={unversionedId:"building-applications/working-with-detectors",id:"building-applications/working-with-detectors",title:"Working with Detectors",description:"Explicitly create a new detector",source:"@site/docs/building-applications/3-working-with-detectors.md",sourceDirName:"building-applications",slug:"/building-applications/working-with-detectors",permalink:"/python-sdk/docs/building-applications/working-with-detectors",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/3-working-with-detectors.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Grabbing Images",permalink:"/python-sdk/docs/building-applications/grabbing-images"},next:{title:"Confidence Levels",permalink:"/python-sdk/docs/building-applications/managing-confidence"}},s={},g=[{value:"Explicitly create a new detector",id:"explicitly-create-a-new-detector",level:3},{value:"Retrieve an existing detector",id:"retrieve-an-existing-detector",level:3},{value:"List your detectors",id:"list-your-detectors",level:3},{value:"Retrieve an image query",id:"retrieve-an-image-query",level:3},{value:"List your previous image queries",id:"list-your-previous-image-queries",level:3},{value:"Adding labels to existing image queries",id:"adding-labels-to-existing-image-queries",level:3}],u={toc:g},d="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,i.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"working-with-detectors"},"Working with Detectors"),(0,n.kt)("h3",{id:"explicitly-create-a-new-detector"},"Explicitly create a new detector"),(0,n.kt)("p",null,"Typically you'll use the ",(0,n.kt)("inlineCode",{parentName:"p"},"get_or_create_detector(name: str, query: str)")," method to find an existing detector you've already created with the same name, or create a new one if it doesn't exists. But if you'd like to force creating a new detector you can also use the ",(0,n.kt)("inlineCode",{parentName:"p"},"create_detector(name: str, query: str)")," method"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\ndetector = gl.create_detector(name="your_detector_name", query="is this what we want to see?")\n# highlight-end\n')),(0,n.kt)("h3",{id:"retrieve-an-existing-detector"},"Retrieve an existing detector"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\ndetector = gl.get_detector(id="YOUR_DETECTOR_ID")\n# highlight-end\n')),(0,n.kt)("h3",{id:"list-your-detectors"},"List your detectors"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python"},"from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\n# Defaults to 10 results per page\ndetectors = gl.list_detectors()\n\n# Pagination: 1st page of 5 results per page\ndetectors = gl.list_detectors(page=1, page_size=5)\n# highlight-end\n")),(0,n.kt)("h3",{id:"retrieve-an-image-query"},"Retrieve an image query"),(0,n.kt)("p",null,"In practice, you may want to check for a new result on your query. For example, after a cloud reviewer labels your query. For example, you can use the ",(0,n.kt)("inlineCode",{parentName:"p"},"image_query.id")," after the above ",(0,n.kt)("inlineCode",{parentName:"p"},"submit_image_query()")," call."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\nimage_query = gl.get_image_query(id="iq_YOUR_IMAGE_QUERY_ID")\n# highlight-end\n')),(0,n.kt)("h3",{id:"list-your-previous-image-queries"},"List your previous image queries"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python"},"from groundlight import Groundlight\n\ngl = Groundlight()\n# highlight-start\n# Defaults to 10 results per page\nimage_queries = gl.list_image_queries()\n\n# Pagination: 1st page of 5 results per page\nimage_queries = gl.list_image_queries(page=1, page_size=5)\n# highlight-end\n")),(0,n.kt)("h3",{id:"adding-labels-to-existing-image-queries"},"Adding labels to existing image queries"),(0,n.kt)("p",null,"Groundlight lets you start using models by making queries against your very first image, but there are a few situations where you might either have an existing dataset, or you'd like to handle the escalation response programatically in your own code but still include the label to get better responses in the future. With your ",(0,n.kt)("inlineCode",{parentName:"p"},"image_query")," from either ",(0,n.kt)("inlineCode",{parentName:"p"},"submit_image_query()")," or ",(0,n.kt)("inlineCode",{parentName:"p"},"get_image_query()")," you can add the label directly. Note that if the query is already in the escalation queue due to low ML confidence or audit thresholds, it may also receive labels from another source."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-python"},'from groundlight import Groundlight\nfrom PIL import Image\nimport requests\n\ngl = Groundlight()\nd = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")\nimage_url= "https://images.selfstorage.com/large-compress/2174925f24362c479b2.jpg"\nimage = Image.open(requests.get(image_url, stream=True).raw)\nimage_query = gl.submit_image_query(detector=d, image=image)\n# highlight-start\ngl.add_label(image_query, \'YES\') # or \'NO\'\n# highlight-end\n')),(0,n.kt)("p",null,"The only valid labels at this time are ",(0,n.kt)("inlineCode",{parentName:"p"},"'YES'")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"'NO'"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/17e77bd5.1ada1f9e.js b/assets/js/1b28ffce.14f50206.js similarity index 96% rename from assets/js/17e77bd5.1ada1f9e.js rename to assets/js/1b28ffce.14f50206.js index 6d068de9..58f61ae5 100644 --- a/assets/js/17e77bd5.1ada1f9e.js +++ b/assets/js/1b28ffce.14f50206.js @@ -1 +1 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[157],{3905:(n,t,e)=>{e.d(t,{Zo:()=>u,kt:()=>m});var i=e(7294);function a(n,t,e){return t in n?Object.defineProperty(n,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[t]=e,n}function o(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),e.push.apply(e,i)}return e}function r(n){for(var t=1;t=0||(a[e]=n[e]);return a}(n,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(n,e)&&(a[e]=n[e])}return a}var l=i.createContext({}),c=function(n){var t=i.useContext(l),e=t;return n&&(e="function"==typeof n?n(t):r(r({},t),n)),e},u=function(n){var t=c(n.components);return i.createElement(l.Provider,{value:t},n.children)},d="mdxType",p={inlineCode:"code",wrapper:function(n){var t=n.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(n,t){var e=n.components,a=n.mdxType,o=n.originalType,l=n.parentName,u=s(n,["components","mdxType","originalType","parentName"]),d=c(e),g=a,m=d["".concat(l,".").concat(g)]||d[g]||p[g]||o;return e?i.createElement(m,r(r({ref:t},u),{},{components:e})):i.createElement(m,r({ref:t},u))}));function m(n,t){var e=arguments,a=t&&t.mdxType;if("string"==typeof n||a){var o=e.length,r=new Array(o);r[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=n,s[d]="string"==typeof n?n:a,r[1]=s;for(var c=2;c{e.r(t),e.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=e(7462),a=(e(7294),e(3905));const o={sidebar_position:7},r="Industrial and Manufacturing Applications",s={unversionedId:"building-applications/industrial",id:"building-applications/industrial",title:"Industrial and Manufacturing Applications",description:"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.",source:"@site/docs/building-applications/7-industrial.md",sourceDirName:"building-applications",slug:"/building-applications/industrial",permalink:"/python-sdk/docs/building-applications/industrial",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/7-industrial.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Using Groundlight on the Edge",permalink:"/python-sdk/docs/building-applications/edge"},next:{title:"Installation",permalink:"/python-sdk/docs/installation/"}},l={},c=[{value:"Machine Tending",id:"machine-tending",level:2},{value:"Process Automation",id:"process-automation",level:2},{value:"Quality Control",id:"quality-control",level:2},{value:"Integration with Cobots and CNC Machines",id:"integration-with-cobots-and-cnc-machines",level:2}],u={toc:c},d="wrapper";function p(n){let{components:t,...e}=n;return(0,a.kt)(d,(0,i.Z)({},u,e,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"industrial-and-manufacturing-applications"},"Industrial and Manufacturing Applications"),(0,a.kt)("p",null,"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control."),(0,a.kt)("h2",{id:"machine-tending"},"Machine Tending"),(0,a.kt)("p",null,"Groundlight's computer vision technology can assist in automating machine-tending tasks, such as loading and unloading materials in CNC machines, milling centers, or injection molding equipment. By enabling robots to recognize parts and tools using natural language, complex machine-tending tasks become more accessible and efficient."),(0,a.kt)("h2",{id:"process-automation"},"Process Automation"),(0,a.kt)("p",null,"Integrating Groundlight's computer vision into your process automation systems can help identify bottlenecks, optimize workflows, and reduce manual intervention. Our technology can work hand-in-hand with robotic systems to perform tasks like sorting, assembly, all while interpreting natural language commands to streamline operations."),(0,a.kt)("h2",{id:"quality-control"},"Quality Control"),(0,a.kt)("p",null,"Groundlight's computer vision technology can play a vital role in ensuring the highest quality standards in your manufacturing processes. By identifying defects or irregularities in products, our computer vision system can help maintain strict quality control, reducing the need for manual inspections and increasing overall product quality."),(0,a.kt)("h2",{id:"integration-with-cobots-and-cnc-machines"},"Integration with Cobots and CNC Machines"),(0,a.kt)("p",null,"Groundlight's computer vision technology can be easily integrated with popular cobot robotic arms, such as Universal Robots, to enhance their capabilities and improve collaboration between humans and robots. Additionally, our technology can be integrated into existing CNC machines or other devices using the Modbus interface, allowing for seamless communication and control within your manufacturing environment."),(0,a.kt)("h1",{id:"contact-sales"},"Contact Sales"),(0,a.kt)("p",null,"To learn more about how Groundlight's natural language computer vision technology can revolutionize your industrial and manufacturing processes, please reach out to us at ",(0,a.kt)("a",{parentName:"p",href:"mailto:info@groundlight.ai"},"info@groundlight.ai"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[518],{3905:(n,t,e)=>{e.d(t,{Zo:()=>u,kt:()=>m});var i=e(7294);function a(n,t,e){return t in n?Object.defineProperty(n,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[t]=e,n}function o(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),e.push.apply(e,i)}return e}function r(n){for(var t=1;t=0||(a[e]=n[e]);return a}(n,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(n,e)&&(a[e]=n[e])}return a}var l=i.createContext({}),c=function(n){var t=i.useContext(l),e=t;return n&&(e="function"==typeof n?n(t):r(r({},t),n)),e},u=function(n){var t=c(n.components);return i.createElement(l.Provider,{value:t},n.children)},d="mdxType",p={inlineCode:"code",wrapper:function(n){var t=n.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(n,t){var e=n.components,a=n.mdxType,o=n.originalType,l=n.parentName,u=s(n,["components","mdxType","originalType","parentName"]),d=c(e),g=a,m=d["".concat(l,".").concat(g)]||d[g]||p[g]||o;return e?i.createElement(m,r(r({ref:t},u),{},{components:e})):i.createElement(m,r({ref:t},u))}));function m(n,t){var e=arguments,a=t&&t.mdxType;if("string"==typeof n||a){var o=e.length,r=new Array(o);r[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=n,s[d]="string"==typeof n?n:a,r[1]=s;for(var c=2;c{e.r(t),e.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=e(7462),a=(e(7294),e(3905));const o={sidebar_position:7},r="Industrial and Manufacturing Applications",s={unversionedId:"building-applications/industrial",id:"building-applications/industrial",title:"Industrial and Manufacturing Applications",description:"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.",source:"@site/docs/building-applications/8-industrial.md",sourceDirName:"building-applications",slug:"/building-applications/industrial",permalink:"/python-sdk/docs/building-applications/industrial",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/8-industrial.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Using Groundlight on the Edge",permalink:"/python-sdk/docs/building-applications/edge"},next:{title:"Installation",permalink:"/python-sdk/docs/installation/"}},l={},c=[{value:"Machine Tending",id:"machine-tending",level:2},{value:"Process Automation",id:"process-automation",level:2},{value:"Quality Control",id:"quality-control",level:2},{value:"Integration with Cobots and CNC Machines",id:"integration-with-cobots-and-cnc-machines",level:2}],u={toc:c},d="wrapper";function p(n){let{components:t,...e}=n;return(0,a.kt)(d,(0,i.Z)({},u,e,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"industrial-and-manufacturing-applications"},"Industrial and Manufacturing Applications"),(0,a.kt)("p",null,"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control."),(0,a.kt)("h2",{id:"machine-tending"},"Machine Tending"),(0,a.kt)("p",null,"Groundlight's computer vision technology can assist in automating machine-tending tasks, such as loading and unloading materials in CNC machines, milling centers, or injection molding equipment. By enabling robots to recognize parts and tools using natural language, complex machine-tending tasks become more accessible and efficient."),(0,a.kt)("h2",{id:"process-automation"},"Process Automation"),(0,a.kt)("p",null,"Integrating Groundlight's computer vision into your process automation systems can help identify bottlenecks, optimize workflows, and reduce manual intervention. Our technology can work hand-in-hand with robotic systems to perform tasks like sorting, assembly, all while interpreting natural language commands to streamline operations."),(0,a.kt)("h2",{id:"quality-control"},"Quality Control"),(0,a.kt)("p",null,"Groundlight's computer vision technology can play a vital role in ensuring the highest quality standards in your manufacturing processes. By identifying defects or irregularities in products, our computer vision system can help maintain strict quality control, reducing the need for manual inspections and increasing overall product quality."),(0,a.kt)("h2",{id:"integration-with-cobots-and-cnc-machines"},"Integration with Cobots and CNC Machines"),(0,a.kt)("p",null,"Groundlight's computer vision technology can be easily integrated with popular cobot robotic arms, such as Universal Robots, to enhance their capabilities and improve collaboration between humans and robots. Additionally, our technology can be integrated into existing CNC machines or other devices using the Modbus interface, allowing for seamless communication and control within your manufacturing environment."),(0,a.kt)("h1",{id:"contact-sales"},"Contact Sales"),(0,a.kt)("p",null,"To learn more about how Groundlight's natural language computer vision technology can revolutionize your industrial and manufacturing processes, please reach out to us at ",(0,a.kt)("a",{parentName:"p",href:"mailto:info@groundlight.ai"},"info@groundlight.ai"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/37fce620.13652601.js b/assets/js/37fce620.13652601.js new file mode 100644 index 00000000..3e572456 --- /dev/null +++ b/assets/js/37fce620.13652601.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[871],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>g});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),l=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(r),m=n,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||i;return r?a.createElement(g,o(o({ref:t},c),{},{components:r})):a.createElement(g,o({ref:t},c))}));function g(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[u]="string"==typeof e?e:n,o[1]=p;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>l});var a=r(7462),n=(r(7294),r(3905));const i={},o="Sample Applications",p={unversionedId:"building-applications/sample-applications",id:"building-applications/sample-applications",title:"Sample Applications",description:"Explore these GitHub repositories to see examples of Groundlight-powered applications:",source:"@site/docs/building-applications/1-sample-applications.md",sourceDirName:"building-applications",slug:"/building-applications/sample-applications",permalink:"/python-sdk/docs/building-applications/sample-applications",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/1-sample-applications.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Building Applications",permalink:"/python-sdk/docs/building-applications/"},next:{title:"Grabbing Images",permalink:"/python-sdk/docs/building-applications/grabbing-images"}},s={},l=[{value:"Groundlight Stream Processor",id:"groundlight-stream-processor",level:2},{value:"Arduino ESP32 Camera Sample App",id:"arduino-esp32-camera-sample-app",level:2},{value:"Raspberry Pi",id:"raspberry-pi",level:2},{value:"Industrial and Manufacturing Applications",id:"industrial-and-manufacturing-applications",level:2}],c={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"sample-applications"},"Sample Applications"),(0,n.kt)("p",null,"Explore these GitHub repositories to see examples of Groundlight-powered applications:"),(0,n.kt)("h2",{id:"groundlight-stream-processor"},"Groundlight Stream Processor"),(0,n.kt)("p",null,"Repository: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/groundlight/stream"},"https://github.com/groundlight/stream")),(0,n.kt)("p",null,"The Groundlight Stream Processor is an easy-to-use Docker container for analyzing RTSP streams or common USB-based cameras. You can run it with a single Docker command, such as:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"docker run stream:local --help\n")),(0,n.kt)("h2",{id:"arduino-esp32-camera-sample-app"},"Arduino ESP32 Camera Sample App"),(0,n.kt)("p",null,"Repository: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/groundlight/esp32cam"},"https://github.com/groundlight/esp32cam")),(0,n.kt)("p",null,"This sample application allows you to build a working AI vision detector using an inexpensive WiFi camera. With a cost of under $10, you can create a powerful and affordable AI vision system."),(0,n.kt)("h2",{id:"raspberry-pi"},"Raspberry Pi"),(0,n.kt)("p",null,"Repository: ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/groundlight/raspberry-pi-door-lock"},"https://github.com/groundlight/raspberry-pi-door-lock")),(0,n.kt)("p",null,"This sample application demonstrates how to set up a Raspberry Pi-based door lock system. The application monitors a door and sends a notification if the door is observed to be unlocked during non-standard business hours."),(0,n.kt)("h2",{id:"industrial-and-manufacturing-applications"},"Industrial and Manufacturing Applications"),(0,n.kt)("p",null,"Groundlight can be used to ",(0,n.kt)("a",{parentName:"p",href:"/docs/building-applications/industrial"},"apply modern natural-language-based computer vision to industrial and manufacturing applications"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/530c8fc0.071275c4.js b/assets/js/530c8fc0.071275c4.js deleted file mode 100644 index 1e0d790b..00000000 --- a/assets/js/530c8fc0.071275c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[642],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),g=i,m=c["".concat(s,".").concat(g)]||c[g]||d[g]||r;return n?a.createElement(m,o(o({ref:t},u),{},{components:n})):a.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const r={},o="Building Applications",l={unversionedId:"building-applications/building-applications",id:"building-applications/building-applications",title:"Building Applications",description:'Groundlight provides a powerful "computer vision powered by natural language" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis.',source:"@site/docs/building-applications/building-applications.md",sourceDirName:"building-applications",slug:"/building-applications/",permalink:"/python-sdk/docs/building-applications/",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/building-applications.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"A Fun Example: Dog-on-Couch Detector",permalink:"/python-sdk/docs/getting-started/dog-on-couch"},next:{title:"Grabbing Images",permalink:"/python-sdk/docs/building-applications/grabbing-images"}},s={},p=[{value:"Sample Applications",id:"sample-applications",level:2},{value:"Groundlight Stream Processor",id:"groundlight-stream-processor",level:3},{value:"Arduino ESP32 Camera Sample App",id:"arduino-esp32-camera-sample-app",level:3},{value:"Raspberry Pi",id:"raspberry-pi",level:3},{value:"Industrial and Manufacturing Applications",id:"industrial-and-manufacturing-applications",level:3},{value:"Further Reading",id:"further-reading",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(c,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"building-applications"},"Building Applications"),(0,i.kt)("p",null,'Groundlight provides a powerful "computer vision powered by natural language" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis.'),(0,i.kt)("p",null,"In this page, we'll introduce you to some sample applications built using Groundlight and provide links to more detailed guides on various topics."),(0,i.kt)("h2",{id:"sample-applications"},"Sample Applications"),(0,i.kt)("p",null,"Explore these GitHub repositories to see examples of Groundlight-powered applications:"),(0,i.kt)("h3",{id:"groundlight-stream-processor"},"Groundlight Stream Processor"),(0,i.kt)("p",null,"Repository: ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/groundlight/stream"},"https://github.com/groundlight/stream")),(0,i.kt)("p",null,"The Groundlight Stream Processor is an easy-to-use Docker container for analyzing RTSP streams or common USB-based cameras. You can run it with a single Docker command, such as:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"docker run stream:local --help\n")),(0,i.kt)("h3",{id:"arduino-esp32-camera-sample-app"},"Arduino ESP32 Camera Sample App"),(0,i.kt)("p",null,"Repository: ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/groundlight/esp32cam"},"https://github.com/groundlight/esp32cam")),(0,i.kt)("p",null,"This sample application allows you to build a working AI vision detector using an inexpensive WiFi camera. With a cost of under $10, you can create a powerful and affordable AI vision system."),(0,i.kt)("h3",{id:"raspberry-pi"},"Raspberry Pi"),(0,i.kt)("p",null,"Repository: ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/groundlight/raspberry-pi-door-lock"},"https://github.com/groundlight/raspberry-pi-door-lock")),(0,i.kt)("p",null,"This sample application demonstrates how to set up a Raspberry Pi-based door lock system. The application monitors a door and sends a notification if the door is observed to be unlocked during non-standard business hours."),(0,i.kt)("h3",{id:"industrial-and-manufacturing-applications"},"Industrial and Manufacturing Applications"),(0,i.kt)("p",null,"Groundlight can be used to ",(0,i.kt)("a",{parentName:"p",href:"/docs/building-applications/industrial"},"apply modern natural-language-based computer vision to industrial and manufacturing applications"),"."),(0,i.kt)("h2",{id:"further-reading"},"Further Reading"),(0,i.kt)("p",null,"For more in-depth guides on various aspects of building applications with Groundlight, check out the following pages:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/grabbing-images"},"Grabbing images")),": Understand the intricacies of how to submit images from various input sources to Groundlight."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/working-with-detectors"},"Working with detectors")),": Learn how to create, configure, and use detectors in your Groundlight-powered applications."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/managing-confidence"},"Confidence levels")),": Master how to control the trade-off of latency against accuracy by configuring the desired confidence level for your detectors."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/handling-errors"},"Handling server errors")),": Understand how to handle and troubleshoot HTTP errors that may occur while using Groundlight."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/async-queries"},"Asynchronous queries")),": Groundlight makes it easy to submit asynchronous queries. Learn how to submit queries asynchronously and retrieve the results later."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/edge"},"Using Groundlight on the edge")),": Discover how to deploy Groundlight in edge computing environments for improved performance and reduced latency."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},(0,i.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/industrial"},"Industrial applications")),": Learn how to apply modern natural-language-based computer vision to your industrial and manufacturing applications.")),(0,i.kt)("p",null,"By exploring these resources and sample applications, you'll be well on your way to building powerful visual applications using Groundlight's computer vision and natural language capabilities."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/530c8fc0.aa2ba198.js b/assets/js/530c8fc0.aa2ba198.js new file mode 100644 index 00000000..5f7c4a55 --- /dev/null +++ b/assets/js/530c8fc0.aa2ba198.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[642],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=i.createContext({}),p=function(e){var t=i.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return i.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),g=a,m=c["".concat(s,".").concat(g)]||c[g]||d[g]||r;return n?i.createElement(m,o(o({ref:t},u),{},{components:n})):i.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var i=n(7462),a=(n(7294),n(3905));const r={},o="Building Applications",l={unversionedId:"building-applications/building-applications",id:"building-applications/building-applications",title:"Building Applications",description:'Groundlight provides a powerful "computer vision powered by natural language" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis.',source:"@site/docs/building-applications/building-applications.md",sourceDirName:"building-applications",slug:"/building-applications/",permalink:"/python-sdk/docs/building-applications/",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/building-applications.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"A Quick Example: Live Stream Alert",permalink:"/python-sdk/docs/getting-started/streaming"},next:{title:"Sample Applications",permalink:"/python-sdk/docs/building-applications/sample-applications"}},s={},p=[{value:"Sample Applications",id:"sample-applications",level:2},{value:"Further Reading",id:"further-reading",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"building-applications"},"Building Applications"),(0,a.kt)("p",null,'Groundlight provides a powerful "computer vision powered by natural language" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis.'),(0,a.kt)("p",null,"In this page, we'll introduce you to some sample applications built using Groundlight and provide links to more detailed guides on various topics."),(0,a.kt)("h2",{id:"sample-applications"},"Sample Applications"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/sample-applications"},"Sample Applications")),": Find repositories with examples of applications built with Groundlight")),(0,a.kt)("h2",{id:"further-reading"},"Further Reading"),(0,a.kt)("p",null,"For more in-depth guides on various aspects of building applications with Groundlight, check out the following pages:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/grabbing-images"},"Grabbing images")),": Understand the intricacies of how to submit images from various input sources to Groundlight."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/working-with-detectors"},"Working with detectors")),": Learn how to create, configure, and use detectors in your Groundlight-powered applications."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/managing-confidence"},"Confidence levels")),": Master how to control the trade-off of latency against accuracy by configuring the desired confidence level for your detectors."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/handling-errors"},"Handling server errors")),": Understand how to handle and troubleshoot HTTP errors that may occur while using Groundlight."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/async-queries"},"Asynchronous queries")),": Groundlight makes it easy to submit asynchronous queries. Learn how to submit queries asynchronously and retrieve the results later."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/edge"},"Using Groundlight on the edge")),": Discover how to deploy Groundlight in edge computing environments for improved performance and reduced latency."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},(0,a.kt)("a",{parentName:"strong",href:"/python-sdk/docs/building-applications/industrial"},"Industrial applications")),": Learn how to apply modern natural-language-based computer vision to your industrial and manufacturing applications.")),(0,a.kt)("p",null,"By exploring these resources and sample applications, you'll be well on your way to building powerful visual applications using Groundlight's computer vision and natural language capabilities."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b559ef3e.f8c70ffd.js b/assets/js/5747eae1.78b4d94a.js similarity index 96% rename from assets/js/b559ef3e.f8c70ffd.js rename to assets/js/5747eae1.78b4d94a.js index a340f786..fee6514f 100644 --- a/assets/js/b559ef3e.f8c70ffd.js +++ b/assets/js/5747eae1.78b4d94a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[602],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,g=d["".concat(l,".").concat(m)]||d[m]||p[m]||i;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const i={sidebar_position:3},o="Confidence Levels",s={unversionedId:"building-applications/managing-confidence",id:"building-applications/managing-confidence",title:"Confidence Levels",description:"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster.",source:"@site/docs/building-applications/3-managing-confidence.md",sourceDirName:"building-applications",slug:"/building-applications/managing-confidence",permalink:"/python-sdk/docs/building-applications/managing-confidence",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/3-managing-confidence.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Working with Detectors",permalink:"/python-sdk/docs/building-applications/working-with-detectors"},next:{title:"Handling Server Errors",permalink:"/python-sdk/docs/building-applications/handling-errors"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"confidence-levels"},"Confidence Levels"),(0,a.kt)("p",null,"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster."),(0,a.kt)("p",null,"The desired confidence level is set as the escalation threshold on your detector. This determines the minimum confidence score for the ML system to provide before the image query is escalated."),(0,a.kt)("p",null,"For example, say you want to set your desired confidence level to 0.95, but that you're willing to wait up to 60 seconds to get a confident response."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\nfrom PIL import Image\nimport requests\n\ngl = Groundlight()\nimage_url = "https://www.photos-public-domain.com/wp-content/uploads/2010/11/over_flowing_garbage_can.jpg"\nimage = Image.open(requests.get(image_url, stream=True).raw)\n\n# highlight-start\nd = gl.get_or_create_detector(name="trash", query="Is the trash can full?", confidence_threshold=0.95)\n\n# This will wait until either 60 seconds have passed or the confidence reaches 0.95\nimage_query = gl.submit_image_query(detector=d, image=image, wait=60)\n# highlight-end\n\nprint(f"The answer is {image_query.result}")\n')),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Tuning confidence lets you balance accuracy against latency.\nHigher confidence will get higher accuracy, but will generally require higher latency.\nHigher confidence also requires more labels, which increases labor costs.")),(0,a.kt)("p",null,"Or if you want to execute ",(0,a.kt)("inlineCode",{parentName:"p"},"submit_image_query")," as fast as possible, set ",(0,a.kt)("inlineCode",{parentName:"p"},"wait=0"),". You will either get the ML results or a placeholder response if the ML model hasn't finished executing. Image queries which are below the desired confidence level will still be escalated for further analysis, and the results are incorporated as training data to improve your ML model, but your code will not wait for that to happen."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest continuation",notest:!0,continuation:!0},"image_query = gl.submit_image_query(detector=d, image=image, wait=0)\n")),(0,a.kt)("p",null,"If the returned result was generated from an ML model, you can see the confidence score returned for the image query:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest continuation",notest:!0,continuation:!0},'print(f"The confidence is {image_query.result.confidence}")\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[571],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,g=d["".concat(l,".").concat(m)]||d[m]||p[m]||i;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,o({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const i={sidebar_position:3},o="Confidence Levels",s={unversionedId:"building-applications/managing-confidence",id:"building-applications/managing-confidence",title:"Confidence Levels",description:"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster.",source:"@site/docs/building-applications/4-managing-confidence.md",sourceDirName:"building-applications",slug:"/building-applications/managing-confidence",permalink:"/python-sdk/docs/building-applications/managing-confidence",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/4-managing-confidence.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Working with Detectors",permalink:"/python-sdk/docs/building-applications/working-with-detectors"},next:{title:"Handling Server Errors",permalink:"/python-sdk/docs/building-applications/handling-errors"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"confidence-levels"},"Confidence Levels"),(0,a.kt)("p",null,"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster."),(0,a.kt)("p",null,"The desired confidence level is set as the escalation threshold on your detector. This determines the minimum confidence score for the ML system to provide before the image query is escalated."),(0,a.kt)("p",null,"For example, say you want to set your desired confidence level to 0.95, but that you're willing to wait up to 60 seconds to get a confident response."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\nfrom PIL import Image\nimport requests\n\ngl = Groundlight()\nimage_url = "https://www.photos-public-domain.com/wp-content/uploads/2010/11/over_flowing_garbage_can.jpg"\nimage = Image.open(requests.get(image_url, stream=True).raw)\n\n# highlight-start\nd = gl.get_or_create_detector(name="trash", query="Is the trash can full?", confidence_threshold=0.95)\n\n# This will wait until either 60 seconds have passed or the confidence reaches 0.95\nimage_query = gl.submit_image_query(detector=d, image=image, wait=60)\n# highlight-end\n\nprint(f"The answer is {image_query.result}")\n')),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Tuning confidence lets you balance accuracy against latency.\nHigher confidence will get higher accuracy, but will generally require higher latency.\nHigher confidence also requires more labels, which increases labor costs.")),(0,a.kt)("p",null,"Or if you want to execute ",(0,a.kt)("inlineCode",{parentName:"p"},"submit_image_query")," as fast as possible, set ",(0,a.kt)("inlineCode",{parentName:"p"},"wait=0"),". You will either get the ML results or a placeholder response if the ML model hasn't finished executing. Image queries which are below the desired confidence level will still be escalated for further analysis, and the results are incorporated as training data to improve your ML model, but your code will not wait for that to happen."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest continuation",notest:!0,continuation:!0},"image_query = gl.submit_image_query(detector=d, image=image, wait=0)\n")),(0,a.kt)("p",null,"If the returned result was generated from an ML model, you can see the confidence score returned for the image query:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest continuation",notest:!0,continuation:!0},'print(f"The confidence is {image_query.result.confidence}")\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7aefb68d.6eb5ec2f.js b/assets/js/7aefb68d.6eb5ec2f.js new file mode 100644 index 00000000..15185fcc --- /dev/null +++ b/assets/js/7aefb68d.6eb5ec2f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[201],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,g=m["".concat(s,".").concat(d)]||m[d]||c[d]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={},i="A Quick Example: Live Stream Alert",l={unversionedId:"getting-started/streaming",id:"getting-started/streaming",title:"A Quick Example: Live Stream Alert",description:"A quick example to get used to setting up detectors and asking good questions: set up a monitor on a live stream.",source:"@site/docs/getting-started/5-streaming.md",sourceDirName:"getting-started",slug:"/getting-started/streaming",permalink:"/python-sdk/docs/getting-started/streaming",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/getting-started/5-streaming.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"A Fun Example: Dog-on-Couch Detector",permalink:"/python-sdk/docs/getting-started/dog-on-couch"},next:{title:"Building Applications",permalink:"/python-sdk/docs/building-applications/"}},s={},p=[{value:"Requirements",id:"requirements",level:2},{value:"Installation",id:"installation",level:2},{value:"Creating the Application",id:"creating-the-application",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"a-quick-example-live-stream-alert"},"A Quick Example: Live Stream Alert"),(0,a.kt)("p",null,"A quick example to get used to setting up detectors and asking good questions: set up a monitor on a live stream. "),(0,a.kt)("h2",{id:"requirements"},"Requirements"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/installation/"},"Groundlight SDK")," with Python 3.7 or higher"),(0,a.kt)("li",{parentName:"ul"},"The video ID of a YouTube live stream you'd like to monitor")),(0,a.kt)("h2",{id:"installation"},"Installation"),(0,a.kt)("p",null,"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"pip install groundlight pillow ffmpeg yt-dlp typer\n")),(0,a.kt)("h2",{id:"creating-the-application"},"Creating the Application"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Save this command as a shell script ",(0,a.kt)("inlineCode",{parentName:"li"},"get_latest_frame.sh"),":")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'#!/bin/bash\n\nffmpeg -i "$(yt-dlp -g $1 | head -n 1)" -vframes 1 last.jpg -y\n')),(0,a.kt)("p",null,"This will download the most recent frame from a YouTube live stream and save it to a local file ",(0,a.kt)("inlineCode",{parentName:"p"},"last.jpg"),". "),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Log in to the ",(0,a.kt)("a",{parentName:"p",href:"https://app.groundlight.ai"},"Groundlight application")," and get an ",(0,a.kt)("a",{parentName:"p",href:"api-tokens"},"API Token"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Next, we'll write the Python script for the application."))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'import os\nimport subprocess\nimport typer\nfrom groundlight import Groundlight\nfrom PIL import Image\n\n\ndef main(*, video_id: str = None, detector_name: str = None, query: str = None, confidence: float = 0.75, wait: int = 60):\n """\n Run the script to get the stream\'s last frame as a subprocess, and submit result as an image query to a Groundlight detector\n :param video_id: Video ID of the YouTube live stream (the URLs have the form https://www.youtube.com/watch?v=)\n :param detector_name: Name for your Groundlight detector\n :param query: Question you want to ask of the stream (we will alert on the answer of NO)\n """\n gl = Groundlight()\n detector = gl.create_detector(name=detector_name, query=query, confidence_threshold=confidence)\n\n while True:\n p = subprocess.run(["./get_latest_frame.sh", video_id])\n if p.returncode != 0:\n raise RuntimeError(f"Could not get image from video ID: {video_id}. Process exited with return code {p.returncode}.")\n \n image = Image.open("last.jpg").convert("RGB")\n response = gl.submit_image_query(detector=detector, image=image, wait=wait)\n\n if response.result.label == "NO":\n os.system("say \'Alert!\'") # this may not work on all operating systems\n\n\nif __name__ == "__main__":\n typer.run(main)\n\n')),(0,a.kt)("ol",{start:4},(0,a.kt)("li",{parentName:"ol"},"Save the script as ",(0,a.kt)("inlineCode",{parentName:"li"},"streaming_alert.py")," in the same directory as ",(0,a.kt)("inlineCode",{parentName:"li"},"get_latest_frame.sh")," above and run it:")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"python streaming_alert.py --detector_name --query \n")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/92cdcdf9.42ff37df.js b/assets/js/8c48aa69.7a2eb4e0.js similarity index 95% rename from assets/js/92cdcdf9.42ff37df.js rename to assets/js/8c48aa69.7a2eb4e0.js index 3981e5b0..cf07ac95 100644 --- a/assets/js/92cdcdf9.42ff37df.js +++ b/assets/js/8c48aa69.7a2eb4e0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[974],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>h});var o=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function a(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=o.createContext({}),s=function(e){var n=o.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=s(e.components);return o.createElement(l.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},g=o.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,p=d(e,["components","mdxType","originalType","parentName"]),c=s(t),g=r,h=c["".concat(l,".").concat(g)]||c[g]||u[g]||i;return t?o.createElement(h,a(a({ref:n},p),{},{components:t})):o.createElement(h,a({ref:n},p))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,a=new Array(i);a[0]=g;var d={};for(var l in n)hasOwnProperty.call(n,l)&&(d[l]=n[l]);d.originalType=e,d[c]="string"==typeof e?e:r,a[1]=d;for(var s=2;s{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>s});var o=t(7462),r=(t(7294),t(3905));const i={sidebar_position:6},a="Using Groundlight on the Edge",d={unversionedId:"building-applications/edge",id:"building-applications/edge",title:"Using Groundlight on the Edge",description:"If your account has access to edge models, you can download and install them to your edge devices.",source:"@site/docs/building-applications/6-edge.md",sourceDirName:"building-applications",slug:"/building-applications/edge",permalink:"/python-sdk/docs/building-applications/edge",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/6-edge.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Asynchronous Queries",permalink:"/python-sdk/docs/building-applications/async-queries"},next:{title:"Industrial and Manufacturing Applications",permalink:"/python-sdk/docs/building-applications/industrial"}},l={},s=[{value:"How the Edge Endpoint works",id:"how-the-edge-endpoint-works",level:2},{value:"Configuring the Edge Endpoint",id:"configuring-the-edge-endpoint",level:2}],p={toc:s},c="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(c,(0,o.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"using-groundlight-on-the-edge"},"Using Groundlight on the Edge"),(0,r.kt)("p",null,"If your account has access to edge models, you can download and install them to your edge devices.",(0,r.kt)("br",{parentName:"p"}),"\n","This allows you to run your model evaluations on the edge, reducing latency, cost, network bandwidth, and energy."),(0,r.kt)("h2",{id:"how-the-edge-endpoint-works"},"How the Edge Endpoint works"),(0,r.kt)("p",null,'The Edge Endpoint runs as a set of docker containers on an "edge device". This edge device can be an NVIDIA Jetson device, rack-mounted server, or even a Raspberry Pi. The Edge Endpoint is responsible for downloading and running the models,\nand for communicating with the Groundlight cloud service.'),(0,r.kt)("p",null,"To use the edge endpoint, simply configure the Groundlight SDK to use the edge endpoint's URL instead of the cloud endpoint.\nAll application logic will work seamlessly and unchanged with the Groundlight Edge Endpoint, except some ML answers will\nreturn much faster locally. The only visible difference is that image queries answered at the edge endpoint will have the prefix ",(0,r.kt)("inlineCode",{parentName:"p"},"iqe_")," instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"iq_")," for image queries answered in the cloud. ",(0,r.kt)("inlineCode",{parentName:"p"},"iqe_"),' stands for "image query edge". Edge-originated\nimage queries will not appear in the cloud dashboard.'),(0,r.kt)("h2",{id:"configuring-the-edge-endpoint"},"Configuring the Edge Endpoint"),(0,r.kt)("p",null,"To configure the Groundlight SDK to use the edge endpoint, you can either pass the endpoint URL to the Groundlight constructor like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},'from groundlight import Groundlight\ngl = Groundlight(endpoint="http://localhost:6717")\n')),(0,r.kt)("p",null,"or by setting the ",(0,r.kt)("inlineCode",{parentName:"p"},"GROUNDLIGHT_ENDPOINT")," environment variable like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"export GROUNDLIGHT_ENDPOINT=http://localhost:6717\npython your_app.py\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[502],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>h});var o=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function a(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=o.createContext({}),s=function(e){var n=o.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=s(e.components);return o.createElement(l.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},g=o.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,p=d(e,["components","mdxType","originalType","parentName"]),c=s(t),g=r,h=c["".concat(l,".").concat(g)]||c[g]||u[g]||i;return t?o.createElement(h,a(a({ref:n},p),{},{components:t})):o.createElement(h,a({ref:n},p))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,a=new Array(i);a[0]=g;var d={};for(var l in n)hasOwnProperty.call(n,l)&&(d[l]=n[l]);d.originalType=e,d[c]="string"==typeof e?e:r,a[1]=d;for(var s=2;s{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>s});var o=t(7462),r=(t(7294),t(3905));const i={sidebar_position:6},a="Using Groundlight on the Edge",d={unversionedId:"building-applications/edge",id:"building-applications/edge",title:"Using Groundlight on the Edge",description:"If your account has access to edge models, you can download and install them to your edge devices.",source:"@site/docs/building-applications/7-edge.md",sourceDirName:"building-applications",slug:"/building-applications/edge",permalink:"/python-sdk/docs/building-applications/edge",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/7-edge.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"Asynchronous Queries",permalink:"/python-sdk/docs/building-applications/async-queries"},next:{title:"Industrial and Manufacturing Applications",permalink:"/python-sdk/docs/building-applications/industrial"}},l={},s=[{value:"How the Edge Endpoint works",id:"how-the-edge-endpoint-works",level:2},{value:"Configuring the Edge Endpoint",id:"configuring-the-edge-endpoint",level:2}],p={toc:s},c="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(c,(0,o.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"using-groundlight-on-the-edge"},"Using Groundlight on the Edge"),(0,r.kt)("p",null,"If your account has access to edge models, you can download and install them to your edge devices.",(0,r.kt)("br",{parentName:"p"}),"\n","This allows you to run your model evaluations on the edge, reducing latency, cost, network bandwidth, and energy."),(0,r.kt)("h2",{id:"how-the-edge-endpoint-works"},"How the Edge Endpoint works"),(0,r.kt)("p",null,'The Edge Endpoint runs as a set of docker containers on an "edge device". This edge device can be an NVIDIA Jetson device, rack-mounted server, or even a Raspberry Pi. The Edge Endpoint is responsible for downloading and running the models,\nand for communicating with the Groundlight cloud service.'),(0,r.kt)("p",null,"To use the edge endpoint, simply configure the Groundlight SDK to use the edge endpoint's URL instead of the cloud endpoint.\nAll application logic will work seamlessly and unchanged with the Groundlight Edge Endpoint, except some ML answers will\nreturn much faster locally. The only visible difference is that image queries answered at the edge endpoint will have the prefix ",(0,r.kt)("inlineCode",{parentName:"p"},"iqe_")," instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"iq_")," for image queries answered in the cloud. ",(0,r.kt)("inlineCode",{parentName:"p"},"iqe_"),' stands for "image query edge". Edge-originated\nimage queries will not appear in the cloud dashboard.'),(0,r.kt)("h2",{id:"configuring-the-edge-endpoint"},"Configuring the Edge Endpoint"),(0,r.kt)("p",null,"To configure the Groundlight SDK to use the edge endpoint, you can either pass the endpoint URL to the Groundlight constructor like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},'from groundlight import Groundlight\ngl = Groundlight(endpoint="http://localhost:6717")\n')),(0,r.kt)("p",null,"or by setting the ",(0,r.kt)("inlineCode",{parentName:"p"},"GROUNDLIGHT_ENDPOINT")," environment variable like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"export GROUNDLIGHT_ENDPOINT=http://localhost:6717\npython your_app.py\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.421dec64.js b/assets/js/935f2afb.421dec64.js new file mode 100644 index 00000000..970ee016 --- /dev/null +++ b/assets/js/935f2afb.421dec64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[53],{1109:i=>{i.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"API Tokens","href":"/python-sdk/docs/getting-started/api-tokens","docId":"getting-started/api-tokens"},{"type":"link","label":"Writing Queries","href":"/python-sdk/docs/getting-started/writing-queries","docId":"getting-started/writing-queries"},{"type":"link","label":"A Serious Example: Retail Analytics","href":"/python-sdk/docs/getting-started/retail-analytics","docId":"getting-started/retail-analytics"},{"type":"link","label":"A Fun Example: Dog-on-Couch Detector","href":"/python-sdk/docs/getting-started/dog-on-couch","docId":"getting-started/dog-on-couch"},{"type":"link","label":"A Quick Example: Live Stream Alert","href":"/python-sdk/docs/getting-started/streaming","docId":"getting-started/streaming"}],"href":"/python-sdk/docs/getting-started/"},{"type":"category","label":"Building Applications","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Sample Applications","href":"/python-sdk/docs/building-applications/sample-applications","docId":"building-applications/sample-applications"},{"type":"link","label":"Grabbing Images","href":"/python-sdk/docs/building-applications/grabbing-images","docId":"building-applications/grabbing-images"},{"type":"link","label":"Working with Detectors","href":"/python-sdk/docs/building-applications/working-with-detectors","docId":"building-applications/working-with-detectors"},{"type":"link","label":"Confidence Levels","href":"/python-sdk/docs/building-applications/managing-confidence","docId":"building-applications/managing-confidence"},{"type":"link","label":"Handling Server Errors","href":"/python-sdk/docs/building-applications/handling-errors","docId":"building-applications/handling-errors"},{"type":"link","label":"Asynchronous Queries","href":"/python-sdk/docs/building-applications/async-queries","docId":"building-applications/async-queries"},{"type":"link","label":"Using Groundlight on the Edge","href":"/python-sdk/docs/building-applications/edge","docId":"building-applications/edge"},{"type":"link","label":"Industrial and Manufacturing Applications","href":"/python-sdk/docs/building-applications/industrial","docId":"building-applications/industrial"}],"href":"/python-sdk/docs/building-applications/"},{"type":"category","label":"Installation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installing on Linux","href":"/python-sdk/docs/installation/linux","docId":"installation/linux"},{"type":"link","label":"Installing on macOS","href":"/python-sdk/docs/installation/macos","docId":"installation/macos"},{"type":"link","label":"Installing on Windows","href":"/python-sdk/docs/installation/windows","docId":"installation/windows"},{"type":"link","label":"Installing on Raspberry Pi","href":"/python-sdk/docs/installation/raspberry-pi","docId":"installation/raspberry-pi"},{"type":"link","label":"Installing on NVIDIA Jetson","href":"/python-sdk/docs/installation/nvidia-jetson","docId":"installation/nvidia-jetson"},{"type":"link","label":"Optional libraries","href":"/python-sdk/docs/installation/optional-libraries","docId":"installation/optional-libraries"},{"type":"link","label":"Monitoring Notification Server","href":"/python-sdk/docs/installation/monitoring-notification-server","docId":"installation/monitoring-notification-server"}],"href":"/python-sdk/docs/installation/"},{"type":"link","label":"IoT","href":"/python-sdk/docs/iot/","docId":"iot/esp32cam"},{"type":"link","label":"API Reference","href":"/python-sdk/docs/api-reference/","docId":"api-reference/redirect"}]},"docs":{"api-reference/redirect":{"id":"api-reference/redirect","title":"API Reference","description":"","sidebar":"tutorialSidebar"},"building-applications/async-queries":{"id":"building-applications/async-queries","title":"Asynchronous Queries","description":"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.","sidebar":"tutorialSidebar"},"building-applications/building-applications":{"id":"building-applications/building-applications","title":"Building Applications","description":"Groundlight provides a powerful \\"computer vision powered by natural language\\" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis.","sidebar":"tutorialSidebar"},"building-applications/edge":{"id":"building-applications/edge","title":"Using Groundlight on the Edge","description":"If your account has access to edge models, you can download and install them to your edge devices.","sidebar":"tutorialSidebar"},"building-applications/grabbing-images":{"id":"building-applications/grabbing-images","title":"Grabbing Images","description":"Groundlight\'s SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.","sidebar":"tutorialSidebar"},"building-applications/handling-errors":{"id":"building-applications/handling-errors","title":"Handling Server Errors","description":"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.","sidebar":"tutorialSidebar"},"building-applications/industrial":{"id":"building-applications/industrial","title":"Industrial and Manufacturing Applications","description":"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.","sidebar":"tutorialSidebar"},"building-applications/managing-confidence":{"id":"building-applications/managing-confidence","title":"Confidence Levels","description":"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster.","sidebar":"tutorialSidebar"},"building-applications/sample-applications":{"id":"building-applications/sample-applications","title":"Sample Applications","description":"Explore these GitHub repositories to see examples of Groundlight-powered applications:","sidebar":"tutorialSidebar"},"building-applications/working-with-detectors":{"id":"building-applications/working-with-detectors","title":"Working with Detectors","description":"Explicitly create a new detector","sidebar":"tutorialSidebar"},"getting-started/api-tokens":{"id":"getting-started/api-tokens","title":"API Tokens","description":"About API Tokens","sidebar":"tutorialSidebar"},"getting-started/dog-on-couch":{"id":"getting-started/dog-on-couch","title":"A Fun Example: Dog-on-Couch Detector","description":"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer\'s speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.","sidebar":"tutorialSidebar"},"getting-started/getting-started":{"id":"getting-started/getting-started","title":"Getting Started","description":"Computer Vision powered by Natural Language","sidebar":"tutorialSidebar"},"getting-started/retail-analytics":{"id":"getting-started/retail-analytics","title":"A Serious Example: Retail Analytics","description":"Tracking utilization of a customer service counter","sidebar":"tutorialSidebar"},"getting-started/streaming":{"id":"getting-started/streaming","title":"A Quick Example: Live Stream Alert","description":"A quick example to get used to setting up detectors and asking good questions: set up a monitor on a live stream.","sidebar":"tutorialSidebar"},"getting-started/writing-queries":{"id":"getting-started/writing-queries","title":"Writing Queries","description":"Introduction","sidebar":"tutorialSidebar"},"installation/installation":{"id":"installation/installation","title":"Installation","description":"Welcome to the Groundlight SDK installation guide. In this guide, you\'ll find step-by-step instructions on how to install and set up the Groundlight SDK on various platforms.","sidebar":"tutorialSidebar"},"installation/linux":{"id":"installation/linux","title":"Installing on Linux","description":"This guide will help you install the Groundlight SDK on Linux. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/macos":{"id":"installation/macos","title":"Installing on macOS","description":"This guide will help you install the Groundlight SDK on macOS. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/monitoring-notification-server":{"id":"installation/monitoring-notification-server","title":"Monitoring Notification Server","description":"This is the easiest way to deploy your Groundlight detectors on a linux computer. All configuration is done through a web user interface, and no code development is required.","sidebar":"tutorialSidebar"},"installation/nvidia-jetson":{"id":"installation/nvidia-jetson","title":"Installing on NVIDIA Jetson","description":"This guide will help you install the Groundlight SDK on NVIDIA Jetson devices. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/optional-libraries":{"id":"installation/optional-libraries","title":"Optional libraries","description":"Smaller is better!","sidebar":"tutorialSidebar"},"installation/raspberry-pi":{"id":"installation/raspberry-pi","title":"Installing on Raspberry Pi","description":"This guide will help you install the Groundlight SDK on Raspberry Pi. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/windows":{"id":"installation/windows","title":"Installing on Windows","description":"This guide will help you install the Groundlight SDK on Windows. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"iot/esp32cam":{"id":"iot/esp32cam","title":"Setting up an ESP32 Camera Board","description":"Groundlight supplies a tool for no-code deployment of a detector to an ESP32 Camera board. You can find it at https://iot.groundlight.ai/espcam.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.7141e4be.js b/assets/js/935f2afb.7141e4be.js deleted file mode 100644 index 6c806d46..00000000 --- a/assets/js/935f2afb.7141e4be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[53],{1109:i=>{i.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"API Tokens","href":"/python-sdk/docs/getting-started/api-tokens","docId":"getting-started/api-tokens"},{"type":"link","label":"Writing Queries","href":"/python-sdk/docs/getting-started/writing-queries","docId":"getting-started/writing-queries"},{"type":"link","label":"A Serious Example: Retail Analytics","href":"/python-sdk/docs/getting-started/retail-analytics","docId":"getting-started/retail-analytics"},{"type":"link","label":"A Fun Example: Dog-on-Couch Detector","href":"/python-sdk/docs/getting-started/dog-on-couch","docId":"getting-started/dog-on-couch"}],"href":"/python-sdk/docs/getting-started/"},{"type":"category","label":"Building Applications","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Grabbing Images","href":"/python-sdk/docs/building-applications/grabbing-images","docId":"building-applications/grabbing-images"},{"type":"link","label":"Working with Detectors","href":"/python-sdk/docs/building-applications/working-with-detectors","docId":"building-applications/working-with-detectors"},{"type":"link","label":"Confidence Levels","href":"/python-sdk/docs/building-applications/managing-confidence","docId":"building-applications/managing-confidence"},{"type":"link","label":"Handling Server Errors","href":"/python-sdk/docs/building-applications/handling-errors","docId":"building-applications/handling-errors"},{"type":"link","label":"Asynchronous Queries","href":"/python-sdk/docs/building-applications/async-queries","docId":"building-applications/async-queries"},{"type":"link","label":"Using Groundlight on the Edge","href":"/python-sdk/docs/building-applications/edge","docId":"building-applications/edge"},{"type":"link","label":"Industrial and Manufacturing Applications","href":"/python-sdk/docs/building-applications/industrial","docId":"building-applications/industrial"}],"href":"/python-sdk/docs/building-applications/"},{"type":"category","label":"Installation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installing on Linux","href":"/python-sdk/docs/installation/linux","docId":"installation/linux"},{"type":"link","label":"Installing on macOS","href":"/python-sdk/docs/installation/macos","docId":"installation/macos"},{"type":"link","label":"Installing on Windows","href":"/python-sdk/docs/installation/windows","docId":"installation/windows"},{"type":"link","label":"Installing on Raspberry Pi","href":"/python-sdk/docs/installation/raspberry-pi","docId":"installation/raspberry-pi"},{"type":"link","label":"Installing on NVIDIA Jetson","href":"/python-sdk/docs/installation/nvidia-jetson","docId":"installation/nvidia-jetson"},{"type":"link","label":"Optional libraries","href":"/python-sdk/docs/installation/optional-libraries","docId":"installation/optional-libraries"},{"type":"link","label":"Monitoring Notification Server","href":"/python-sdk/docs/installation/monitoring-notification-server","docId":"installation/monitoring-notification-server"}],"href":"/python-sdk/docs/installation/"},{"type":"link","label":"IoT","href":"/python-sdk/docs/iot/","docId":"iot/esp32cam"},{"type":"link","label":"API Reference","href":"/python-sdk/docs/api-reference/","docId":"api-reference/redirect"}]},"docs":{"api-reference/redirect":{"id":"api-reference/redirect","title":"API Reference","description":"","sidebar":"tutorialSidebar"},"building-applications/async-queries":{"id":"building-applications/async-queries","title":"Asynchronous Queries","description":"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.","sidebar":"tutorialSidebar"},"building-applications/building-applications":{"id":"building-applications/building-applications","title":"Building Applications","description":"Groundlight provides a powerful \\"computer vision powered by natural language\\" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis.","sidebar":"tutorialSidebar"},"building-applications/edge":{"id":"building-applications/edge","title":"Using Groundlight on the Edge","description":"If your account has access to edge models, you can download and install them to your edge devices.","sidebar":"tutorialSidebar"},"building-applications/grabbing-images":{"id":"building-applications/grabbing-images","title":"Grabbing Images","description":"Groundlight\'s SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.","sidebar":"tutorialSidebar"},"building-applications/handling-errors":{"id":"building-applications/handling-errors","title":"Handling Server Errors","description":"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.","sidebar":"tutorialSidebar"},"building-applications/industrial":{"id":"building-applications/industrial","title":"Industrial and Manufacturing Applications","description":"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.","sidebar":"tutorialSidebar"},"building-applications/managing-confidence":{"id":"building-applications/managing-confidence","title":"Confidence Levels","description":"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster.","sidebar":"tutorialSidebar"},"building-applications/working-with-detectors":{"id":"building-applications/working-with-detectors","title":"Working with Detectors","description":"Explicitly create a new detector","sidebar":"tutorialSidebar"},"getting-started/api-tokens":{"id":"getting-started/api-tokens","title":"API Tokens","description":"About API Tokens","sidebar":"tutorialSidebar"},"getting-started/dog-on-couch":{"id":"getting-started/dog-on-couch","title":"A Fun Example: Dog-on-Couch Detector","description":"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer\'s speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.","sidebar":"tutorialSidebar"},"getting-started/getting-started":{"id":"getting-started/getting-started","title":"Getting Started","description":"Computer Vision powered by Natural Language","sidebar":"tutorialSidebar"},"getting-started/retail-analytics":{"id":"getting-started/retail-analytics","title":"A Serious Example: Retail Analytics","description":"Tracking utilization of a customer service counter","sidebar":"tutorialSidebar"},"getting-started/writing-queries":{"id":"getting-started/writing-queries","title":"Writing Queries","description":"Introduction","sidebar":"tutorialSidebar"},"installation/installation":{"id":"installation/installation","title":"Installation","description":"Welcome to the Groundlight SDK installation guide. In this guide, you\'ll find step-by-step instructions on how to install and set up the Groundlight SDK on various platforms.","sidebar":"tutorialSidebar"},"installation/linux":{"id":"installation/linux","title":"Installing on Linux","description":"This guide will help you install the Groundlight SDK on Linux. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/macos":{"id":"installation/macos","title":"Installing on macOS","description":"This guide will help you install the Groundlight SDK on macOS. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/monitoring-notification-server":{"id":"installation/monitoring-notification-server","title":"Monitoring Notification Server","description":"This is the easiest way to deploy your Groundlight detectors on a linux computer. All configuration is done through a web user interface, and no code development is required.","sidebar":"tutorialSidebar"},"installation/nvidia-jetson":{"id":"installation/nvidia-jetson","title":"Installing on NVIDIA Jetson","description":"This guide will help you install the Groundlight SDK on NVIDIA Jetson devices. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/optional-libraries":{"id":"installation/optional-libraries","title":"Optional libraries","description":"Smaller is better!","sidebar":"tutorialSidebar"},"installation/raspberry-pi":{"id":"installation/raspberry-pi","title":"Installing on Raspberry Pi","description":"This guide will help you install the Groundlight SDK on Raspberry Pi. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"installation/windows":{"id":"installation/windows","title":"Installing on Windows","description":"This guide will help you install the Groundlight SDK on Windows. The Groundlight SDK requires Python 3.7 or higher.","sidebar":"tutorialSidebar"},"iot/esp32cam":{"id":"iot/esp32cam","title":"Setting up an ESP32 Camera Board","description":"Groundlight supplies a tool for no-code deployment of a detector to an ESP32 Camera board. You can find it at https://iot.groundlight.ai/espcam.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/a30c3fca.5cdf1401.js b/assets/js/a30c3fca.5cdf1401.js deleted file mode 100644 index f8f12dd4..00000000 --- a/assets/js/a30c3fca.5cdf1401.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[557],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>u});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=p(n),g=a,u=m["".concat(l,".").concat(g)]||m[g]||d[g]||i;return n?r.createElement(u,o(o({ref:t},c),{},{components:n})):r.createElement(u,o({ref:t},c))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={sidebar_position:1},o="Grabbing Images",s={unversionedId:"building-applications/grabbing-images",id:"building-applications/grabbing-images",title:"Grabbing Images",description:"Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.",source:"@site/docs/building-applications/1-grabbing-images.md",sourceDirName:"building-applications",slug:"/building-applications/grabbing-images",permalink:"/python-sdk/docs/building-applications/grabbing-images",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/1-grabbing-images.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Building Applications",permalink:"/python-sdk/docs/building-applications/"},next:{title:"Working with Detectors",permalink:"/python-sdk/docs/building-applications/working-with-detectors"}},l={},p=[{value:"PIL",id:"pil",level:2},{value:"OpenCV",id:"opencv",level:2},{value:"Numpy",id:"numpy",level:2},{value:"Channel order: BGR vs RGB",id:"channel-order-bgr-vs-rgb",level:3},{value:"Framegrab",id:"framegrab",level:2}],c={toc:p},m="wrapper";function d(e){let{components:t,...i}=e;return(0,a.kt)(m,(0,r.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"grabbing-images"},"Grabbing Images"),(0,a.kt)("p",null,"Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays. "),(0,a.kt)("h2",{id:"pil"},"PIL"),(0,a.kt)("p",null,"The Groundlight SDK can accept PIL images directly in ",(0,a.kt)("inlineCode",{parentName:"p"},"submit_image_query"),". Here's an example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python"},'from groundlight import Groundlight\nfrom PIL import Image\n\ngl = Groundlight()\ndet = gl.get_or_create_detector(name="path-clear", query="Is the path clear?")\npil_img = Image.open("./docs/static/img/doorway.jpg")\ngl.submit_image_query(det, pil_img)\n')),(0,a.kt)("h2",{id:"opencv"},"OpenCV"),(0,a.kt)("p",null,"OpenCV is a popular image processing library, with many utilities for working with images.\nOpenCV images are stored as numpy arrays. (Note they are stored in BGR order, not RGB order, but as of Groundlight SDK v0.8 this is the expected order.)\nOpenCV's images can be send directly to ",(0,a.kt)("inlineCode",{parentName:"p"},"submit_image_query")," as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"import cv2\n\ncam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)\n\n_, frame = cam.read() # Capture one frame\ngl.submit_image_query(detector, frame) # Send the frame to Groundlight\ncam.release() # Release the camera\n")),(0,a.kt)("h2",{id:"numpy"},"Numpy"),(0,a.kt)("p",null,"The Groundlight SDK can accept images as ",(0,a.kt)("inlineCode",{parentName:"p"},"numpy")," arrays. They should be in the standard HWN format in BGR color order, matching OpenCV standards.\nPixel values should be from 0-255 (not 0.0-1.0 as floats). So ",(0,a.kt)("inlineCode",{parentName:"p"},"uint8")," data type is preferable since it saves memory."),(0,a.kt)("p",null,"Here's sample code to create an 800x600 random image in numpy:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"import numpy as np\n\nnp_img = np.random.uniform(low=0, high=255, size=(600, 800, 3)).astype(np.uint8)\n# Note: channel order is interpretted as BGR not RGB\ngl.submit_image_query(detector, np_img)\n")),(0,a.kt)("h3",{id:"channel-order-bgr-vs-rgb"},"Channel order: BGR vs RGB"),(0,a.kt)("p",null,"Groundlight expects images in BGR order, because this is standard for OpenCV, which uses numpy arrays as image storage.\n(OpenCV uses BGR because it was originally developed decades ago for compatibility with the BGR color format used by many cameras and image processing hardware at the time of its creation.)\nMost other image libraries use RGB order, so if you are using images as numpy arrays which did not originate from OpenCV you likely need to reverse the channel order before sending the images to Groundlight.\nNote this change was made in v0.8 of the Groundlight SDK - in previous versions, RGB order was expected. "),(0,a.kt)("p",null,"If you have an RGB array, you must reverse the channel order before sending it to Groundlight, like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"# Convert numpy image in RGB channel order to BGR order\nbgr_img = rgb_img[:, :, ::-1]\n")),(0,a.kt)("p",null,"The difference can be surprisingly subtle when red and blue get swapped. Often images just look a little off, but sometimes they look very wrong."),(0,a.kt)("p",null,"Here's an example of a natural-scene image where you might think the color balance is just off:\n",(0,a.kt)("img",{alt:"Correct color order",src:n(2e3).Z,width:"800",height:"600"}),"\n",(0,a.kt)("img",{alt:"Swapped color channels",src:n(9337).Z,width:"800",height:"600"})),(0,a.kt)("p",null,"In industrial settings, the difference can be almost impossible to detect without prior knowledge of the scene:\n",(0,a.kt)("img",{alt:"Correct color order",src:n(6033).Z,width:"1418",height:"979"}),"\n",(0,a.kt)("img",{alt:"Swapped color channels",src:n(2239).Z,width:"1418",height:"979"})),(0,a.kt)("h2",{id:"framegrab"},"Framegrab"),(0,a.kt)("p",null,"For a unified interface to many different kinds of image sources, see the ",(0,a.kt)("a",{parentName:"p",href:"https://pypi.org/project/framegrab/"},"framegrab library"),".\nFramegrab is still an early work in progress, but has many useful features for working with cameras and other image sources. Framegrab provides a single interface for many different kinds of image sources, including:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"USB cameras"),(0,a.kt)("li",{parentName:"ul"},"IP cameras"),(0,a.kt)("li",{parentName:"ul"},"Video files"),(0,a.kt)("li",{parentName:"ul"},"Image files")))}d.isMDXComponent=!0},2239:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/cnc-gripper-bgr-3f62a203a84000db8dffb8b542aa8706.jpg"},6033:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/cnc-gripper-4e667290978a62db9edcb5859e42da1b.jpg"},9337:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/michonne-bgr-b7e5ce1b0ea7a8fad1386bb13f0b13cb.jpg"},2e3:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/michonne-d62a9f110b7dab2a04b1dca75c5cf39c.jpg"}}]); \ No newline at end of file diff --git a/assets/js/74503641.31044ac1.js b/assets/js/cb33c72e.9272a0ab.js similarity index 97% rename from assets/js/74503641.31044ac1.js rename to assets/js/cb33c72e.9272a0ab.js index b43058fb..3da82d8f 100644 --- a/assets/js/74503641.31044ac1.js +++ b/assets/js/cb33c72e.9272a0ab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[710],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(n),c=i,h=p["".concat(u,".").concat(c)]||p[c]||d[c]||a;return n?r.createElement(h,o(o({ref:t},m),{},{components:n})):r.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=c;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=n(7462),i=(n(7294),n(3905));const a={sidebar_position:5},o="Asynchronous Queries",s={unversionedId:"building-applications/async-queries",id:"building-applications/async-queries",title:"Asynchronous Queries",description:"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.",source:"@site/docs/building-applications/5-async-queries.md",sourceDirName:"building-applications",slug:"/building-applications/async-queries",permalink:"/python-sdk/docs/building-applications/async-queries",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/5-async-queries.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Handling Server Errors",permalink:"/python-sdk/docs/building-applications/handling-errors"},next:{title:"Using Groundlight on the Edge",permalink:"/python-sdk/docs/building-applications/edge"}},u={},l=[{value:"Setup Submitting Machine",id:"setup-submitting-machine",level:2},{value:"Setup Retrieving Machine",id:"setup-retrieving-machine",level:2},{value:"Important Considerations",id:"important-considerations",level:2}],m={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"asynchronous-queries"},"Asynchronous Queries"),(0,i.kt)("p",null,"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine")," and the ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine"),"."),(0,i.kt)("h2",{id:"setup-submitting-machine"},"Setup Submitting Machine"),(0,i.kt)("p",null,"On the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine"),", you will need to install the Groundlight Python SDK. Then you can submit image queries asynchronously using the ",(0,i.kt)("inlineCode",{parentName:"p"},"ask_async")," interface (read the full documentation ",(0,i.kt)("a",{parentName:"p",href:"pathname:///python-sdk/api-reference-docs/#groundlight.client.Groundlight.ask_async"},"here"),"). ",(0,i.kt)("inlineCode",{parentName:"p"},"ask_async")," submits your query and returns as soon as the query is submitted. It does not wait for an answer to be available prior to returning to minimize the time your program spends interacting with Groundlight. As a result, the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery")," object ",(0,i.kt)("inlineCode",{parentName:"p"},"ask_async")," returns lacks a ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," (the ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," field will be ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"). This is acceptable for this use case as the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine")," is not interested in the result. Instead, the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine")," just needs to communicate the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery.id"),"s to the ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine")," - this might be done via a database, a message queue, or some other mechanism. For this example, we assume you are using a database where you save the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery.id")," to it via ",(0,i.kt)("inlineCode",{parentName:"p"},"db.save(image_query.id)"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\nimport cv2\nfrom time import sleep\n\ndetector = gl.get_or_create_detector(name="your_detector_name", query="your_query")\n\ncam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)\n\nwhile True:\n _, image = cam.read() # Capture one frame from the camera\n image_query = gl.ask_async(detector=detector, image=image) # Submit the frame to Groundlight\n db.save(image_query.id) # Save the image_query.id to a database for the retrieving machine to use\n sleep(10) # Sleep for 10 seconds before submitting the next query\n\ncam.release() # Release the camera\n\n')),(0,i.kt)("h2",{id:"setup-retrieving-machine"},"Setup Retrieving Machine"),(0,i.kt)("p",null,"On the ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine")," you will need to install the Groundlight Python SDK. Then you can retrieve the results of the image queries submitted by another machine using ",(0,i.kt)("inlineCode",{parentName:"p"},"get_image_query"),". The ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine")," can then use the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery.result")," to take action based on the result for whatever application you are building. For this example, we assume your application looks up the next image query to process from a database via ",(0,i.kt)("inlineCode",{parentName:"p"},"db.get_next_image_query_id()")," and that this function returns ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," once all ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery"),"s are processed."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"from groundlight import Groundlight\n\ndetector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\")\n\nimage_query_id = db.get_next_image_query_id()\n\nwhile image_query_id is not None:\n image_query = gl.get_image_query(id=image_query_id) # retrieve the image query from Groundlight\n result = image_query.result\n\n # take action based on the result of the image query\n if result.label == 'YES':\n pass # TODO: do something based on your application\n elif result.label == 'NO':\n pass # TODO: do something based on your application\n elif result.label == 'UNCLEAR':\n pass # TODO: do something based on your application\n\n # update image_query_id for next iteration of the loop\n image_query_id = db.get_next_image_query_id()\n")),(0,i.kt)("h2",{id:"important-considerations"},"Important Considerations"),(0,i.kt)("p",null,"When you submit an image query asynchronously, ML prediction on your query is ",(0,i.kt)("strong",{parentName:"p"},"not")," instant. So attempting to retrieve the result immediately after submitting an async query will likely result in an ",(0,i.kt)("inlineCode",{parentName:"p"},"UNCLEAR")," result as Groundlight is still processing your query. Instead, if your code needs a ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," synchronously we recommend using one of our methods with a polling mechanism to retrieve the result. You can see all of the interfaces available in the documentation ",(0,i.kt)("a",{parentName:"p",href:"pathname:///python-sdk/api-reference-docs/#groundlight.client.Groundlight"},"here"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\nfrom PIL import Image\n\ndetector = gl.get_or_create_detector(name="your_detector_name", query="your_query")\nimage = Image.open("/path/to/your/image.jpg")\nimage_query = gl.ask_async(detector=detector, image=image) # Submit async query to Groundlight\nresult = image_query.result # This will always be \'None\' as you asked asynchronously\n\nimage_query = gl.get_image_query(id=image_query.id) # Immediately retrieve the image query from Groundlight\nresult = image_query.result # This will likely be \'UNCLEAR\' as Groundlight is still processing your query\n\nimage_query = gl.wait_for_confident_result(id=image_query.id) # Poll for a confident result from Groundlight\nresult = image_query.result\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[855],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(n),c=i,h=p["".concat(u,".").concat(c)]||p[c]||d[c]||a;return n?r.createElement(h,o(o({ref:t},m),{},{components:n})):r.createElement(h,o({ref:t},m))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=c;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=n(7462),i=(n(7294),n(3905));const a={sidebar_position:5},o="Asynchronous Queries",s={unversionedId:"building-applications/async-queries",id:"building-applications/async-queries",title:"Asynchronous Queries",description:"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.",source:"@site/docs/building-applications/6-async-queries.md",sourceDirName:"building-applications",slug:"/building-applications/async-queries",permalink:"/python-sdk/docs/building-applications/async-queries",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/6-async-queries.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Handling Server Errors",permalink:"/python-sdk/docs/building-applications/handling-errors"},next:{title:"Using Groundlight on the Edge",permalink:"/python-sdk/docs/building-applications/edge"}},u={},l=[{value:"Setup Submitting Machine",id:"setup-submitting-machine",level:2},{value:"Setup Retrieving Machine",id:"setup-retrieving-machine",level:2},{value:"Important Considerations",id:"important-considerations",level:2}],m={toc:l},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"asynchronous-queries"},"Asynchronous Queries"),(0,i.kt)("p",null,"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine")," and the ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine"),"."),(0,i.kt)("h2",{id:"setup-submitting-machine"},"Setup Submitting Machine"),(0,i.kt)("p",null,"On the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine"),", you will need to install the Groundlight Python SDK. Then you can submit image queries asynchronously using the ",(0,i.kt)("inlineCode",{parentName:"p"},"ask_async")," interface (read the full documentation ",(0,i.kt)("a",{parentName:"p",href:"pathname:///python-sdk/api-reference-docs/#groundlight.client.Groundlight.ask_async"},"here"),"). ",(0,i.kt)("inlineCode",{parentName:"p"},"ask_async")," submits your query and returns as soon as the query is submitted. It does not wait for an answer to be available prior to returning to minimize the time your program spends interacting with Groundlight. As a result, the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery")," object ",(0,i.kt)("inlineCode",{parentName:"p"},"ask_async")," returns lacks a ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," (the ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," field will be ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"). This is acceptable for this use case as the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine")," is not interested in the result. Instead, the ",(0,i.kt)("strong",{parentName:"p"},"submitting machine")," just needs to communicate the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery.id"),"s to the ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine")," - this might be done via a database, a message queue, or some other mechanism. For this example, we assume you are using a database where you save the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery.id")," to it via ",(0,i.kt)("inlineCode",{parentName:"p"},"db.save(image_query.id)"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\nimport cv2\nfrom time import sleep\n\ndetector = gl.get_or_create_detector(name="your_detector_name", query="your_query")\n\ncam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)\n\nwhile True:\n _, image = cam.read() # Capture one frame from the camera\n image_query = gl.ask_async(detector=detector, image=image) # Submit the frame to Groundlight\n db.save(image_query.id) # Save the image_query.id to a database for the retrieving machine to use\n sleep(10) # Sleep for 10 seconds before submitting the next query\n\ncam.release() # Release the camera\n\n')),(0,i.kt)("h2",{id:"setup-retrieving-machine"},"Setup Retrieving Machine"),(0,i.kt)("p",null,"On the ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine")," you will need to install the Groundlight Python SDK. Then you can retrieve the results of the image queries submitted by another machine using ",(0,i.kt)("inlineCode",{parentName:"p"},"get_image_query"),". The ",(0,i.kt)("strong",{parentName:"p"},"retrieving machine")," can then use the ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery.result")," to take action based on the result for whatever application you are building. For this example, we assume your application looks up the next image query to process from a database via ",(0,i.kt)("inlineCode",{parentName:"p"},"db.get_next_image_query_id()")," and that this function returns ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," once all ",(0,i.kt)("inlineCode",{parentName:"p"},"ImageQuery"),"s are processed."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"from groundlight import Groundlight\n\ndetector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\")\n\nimage_query_id = db.get_next_image_query_id()\n\nwhile image_query_id is not None:\n image_query = gl.get_image_query(id=image_query_id) # retrieve the image query from Groundlight\n result = image_query.result\n\n # take action based on the result of the image query\n if result.label == 'YES':\n pass # TODO: do something based on your application\n elif result.label == 'NO':\n pass # TODO: do something based on your application\n elif result.label == 'UNCLEAR':\n pass # TODO: do something based on your application\n\n # update image_query_id for next iteration of the loop\n image_query_id = db.get_next_image_query_id()\n")),(0,i.kt)("h2",{id:"important-considerations"},"Important Considerations"),(0,i.kt)("p",null,"When you submit an image query asynchronously, ML prediction on your query is ",(0,i.kt)("strong",{parentName:"p"},"not")," instant. So attempting to retrieve the result immediately after submitting an async query will likely result in an ",(0,i.kt)("inlineCode",{parentName:"p"},"UNCLEAR")," result as Groundlight is still processing your query. Instead, if your code needs a ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," synchronously we recommend using one of our methods with a polling mechanism to retrieve the result. You can see all of the interfaces available in the documentation ",(0,i.kt)("a",{parentName:"p",href:"pathname:///python-sdk/api-reference-docs/#groundlight.client.Groundlight"},"here"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'from groundlight import Groundlight\nfrom PIL import Image\n\ndetector = gl.get_or_create_detector(name="your_detector_name", query="your_query")\nimage = Image.open("/path/to/your/image.jpg")\nimage_query = gl.ask_async(detector=detector, image=image) # Submit async query to Groundlight\nresult = image_query.result # This will always be \'None\' as you asked asynchronously\n\nimage_query = gl.get_image_query(id=image_query.id) # Immediately retrieve the image query from Groundlight\nresult = image_query.result # This will likely be \'UNCLEAR\' as Groundlight is still processing your query\n\nimage_query = gl.wait_for_confident_result(id=image_query.id) # Poll for a confident result from Groundlight\nresult = image_query.result\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddfecd50.6fc55471.js b/assets/js/ddfecd50.6fc55471.js deleted file mode 100644 index bd540cae..00000000 --- a/assets/js/ddfecd50.6fc55471.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[609],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),c=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=c(n),m=o,g=s["".concat(p,".").concat(m)]||s[m]||d[m]||a;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={},i="A Fun Example: Dog-on-Couch Detector",l={unversionedId:"getting-started/dog-on-couch",id:"getting-started/dog-on-couch",title:"A Fun Example: Dog-on-Couch Detector",description:"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.",source:"@site/docs/getting-started/4-dog-on-couch.md",sourceDirName:"getting-started",slug:"/getting-started/dog-on-couch",permalink:"/python-sdk/docs/getting-started/dog-on-couch",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/getting-started/4-dog-on-couch.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"A Serious Example: Retail Analytics",permalink:"/python-sdk/docs/getting-started/retail-analytics"},next:{title:"Building Applications",permalink:"/python-sdk/docs/building-applications/"}},p={},c=[{value:"Requirements",id:"requirements",level:2},{value:"Installation",id:"installation",level:2},{value:"Creating the Application",id:"creating-the-application",level:2}],u={toc:c},s="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(s,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"a-fun-example-dog-on-couch-detector"},"A Fun Example: Dog-on-Couch Detector"),(0,o.kt)("p",null,"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you."),(0,o.kt)("h2",{id:"requirements"},"Requirements"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/installation/"},"Groundlight SDK")," with Python 3.7 or higher"),(0,o.kt)("li",{parentName:"ul"},"A supported USB or network-connected camera"),(0,o.kt)("li",{parentName:"ul"},"A pre-recorded sound file (e.g., ",(0,o.kt)("inlineCode",{parentName:"li"},"get_off_couch.mp3"),")"),(0,o.kt)("li",{parentName:"ul"},"A couch and a dog are recommended for proper end-to-end testing.")),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("p",null,"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"pip install groundlight opencv-python pillow pyaudio\n")),(0,o.kt)("h2",{id:"creating-the-application"},"Creating the Application"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"First, log in to the ",(0,o.kt)("a",{parentName:"p",href:"https://app.groundlight.ai"},"Groundlight application")," and get an ",(0,o.kt)("a",{parentName:"p",href:"api-tokens"},"API Token"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Next, we'll write the Python script for the application. Import the required libraries:"))),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"import time\nimport cv2\nfrom groundlight import Groundlight\nfrom PIL import Image\nimport pyaudio\nimport wave\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Define a function to capture an image from the camera using OpenCV:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python"},"def capture_image():\n cap = cv2.VideoCapture(0)\n\n ret, frame = cap.read()\n cap.release()\n\n if ret:\n # Convert to PIL image\n return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))\n else:\n return None\n")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Define a function to play the pre-recorded sound:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python"},"def play_sound(file_path):\n CHUNK = 1024\n wf = wave.open(file_path, 'rb')\n\n p = pyaudio.PyAudio()\n\n stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),\n channels=wf.getnchannels(),\n rate=wf.getframerate(),\n output=True)\n\n data = wf.readframes(CHUNK)\n\n while data:\n stream.write(data)\n data = wf.readframes(CHUNK)\n\n stream.stop_stream()\n stream.close()\n\n p.terminate()\n")),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Write the main application loop:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'gl = Groundlight()\n\ndetector = gl.get_detector("Dog on Couch Detector")\n\nwhile True:\n image = capture_image()\n if image:\n try:\n iq = gl.submit_image_query(image=image, detector=detector, wait=60)\n answer = iq.result.label\n if answer == "YES":\n print("Dog detected on the couch!")\n play_sound("get_off_couch.mp3")\n except Exception as e:\n print(f"Error submitting image query: {e}")\n else:\n print("Failed to capture image")\n\n # Sleep for a minute before checking again\n time.sleep(60)\n')),(0,o.kt)("p",null,"This application captures an image using the ",(0,o.kt)("inlineCode",{parentName:"p"},"capture_image")," function, then submits it to the Groundlight API for analysis. If the dog is detected on the couch, it plays the pre-recorded sound using the ",(0,o.kt)("inlineCode",{parentName:"p"},"play_sound")," function."),(0,o.kt)("p",null,"Save the script as ",(0,o.kt)("inlineCode",{parentName:"p"},"dog_on_couch_detector.py")," and run it:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"python dog_on_couch_detector.py\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddfecd50.fa9adc48.js b/assets/js/ddfecd50.fa9adc48.js new file mode 100644 index 00000000..afd638e3 --- /dev/null +++ b/assets/js/ddfecd50.fa9adc48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[609],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),c=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=c(n),m=o,g=s["".concat(p,".").concat(m)]||s[m]||d[m]||a;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[s]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={},i="A Fun Example: Dog-on-Couch Detector",l={unversionedId:"getting-started/dog-on-couch",id:"getting-started/dog-on-couch",title:"A Fun Example: Dog-on-Couch Detector",description:"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.",source:"@site/docs/getting-started/4-dog-on-couch.md",sourceDirName:"getting-started",slug:"/getting-started/dog-on-couch",permalink:"/python-sdk/docs/getting-started/dog-on-couch",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/getting-started/4-dog-on-couch.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"A Serious Example: Retail Analytics",permalink:"/python-sdk/docs/getting-started/retail-analytics"},next:{title:"A Quick Example: Live Stream Alert",permalink:"/python-sdk/docs/getting-started/streaming"}},p={},c=[{value:"Requirements",id:"requirements",level:2},{value:"Installation",id:"installation",level:2},{value:"Creating the Application",id:"creating-the-application",level:2}],u={toc:c},s="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(s,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"a-fun-example-dog-on-couch-detector"},"A Fun Example: Dog-on-Couch Detector"),(0,o.kt)("p",null,"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you."),(0,o.kt)("h2",{id:"requirements"},"Requirements"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/installation/"},"Groundlight SDK")," with Python 3.7 or higher"),(0,o.kt)("li",{parentName:"ul"},"A supported USB or network-connected camera"),(0,o.kt)("li",{parentName:"ul"},"A pre-recorded sound file (e.g., ",(0,o.kt)("inlineCode",{parentName:"li"},"get_off_couch.mp3"),")"),(0,o.kt)("li",{parentName:"ul"},"A couch and a dog are recommended for proper end-to-end testing.")),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("p",null,"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"pip install groundlight opencv-python pillow pyaudio\n")),(0,o.kt)("h2",{id:"creating-the-application"},"Creating the Application"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"First, log in to the ",(0,o.kt)("a",{parentName:"p",href:"https://app.groundlight.ai"},"Groundlight application")," and get an ",(0,o.kt)("a",{parentName:"p",href:"api-tokens"},"API Token"),".")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Next, we'll write the Python script for the application. Import the required libraries:"))),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},"import time\nimport cv2\nfrom groundlight import Groundlight\nfrom PIL import Image\nimport pyaudio\nimport wave\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Define a function to capture an image from the camera using OpenCV:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python"},"def capture_image():\n cap = cv2.VideoCapture(0)\n\n ret, frame = cap.read()\n cap.release()\n\n if ret:\n # Convert to PIL image\n return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))\n else:\n return None\n")),(0,o.kt)("ol",{start:4},(0,o.kt)("li",{parentName:"ol"},"Define a function to play the pre-recorded sound:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python"},"def play_sound(file_path):\n CHUNK = 1024\n wf = wave.open(file_path, 'rb')\n\n p = pyaudio.PyAudio()\n\n stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),\n channels=wf.getnchannels(),\n rate=wf.getframerate(),\n output=True)\n\n data = wf.readframes(CHUNK)\n\n while data:\n stream.write(data)\n data = wf.readframes(CHUNK)\n\n stream.stop_stream()\n stream.close()\n\n p.terminate()\n")),(0,o.kt)("ol",{start:5},(0,o.kt)("li",{parentName:"ol"},"Write the main application loop:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'gl = Groundlight()\n\ndetector = gl.get_detector("Dog on Couch Detector")\n\nwhile True:\n image = capture_image()\n if image:\n try:\n iq = gl.submit_image_query(image=image, detector=detector, wait=60)\n answer = iq.result.label\n if answer == "YES":\n print("Dog detected on the couch!")\n play_sound("get_off_couch.mp3")\n except Exception as e:\n print(f"Error submitting image query: {e}")\n else:\n print("Failed to capture image")\n\n # Sleep for a minute before checking again\n time.sleep(60)\n')),(0,o.kt)("p",null,"This application captures an image using the ",(0,o.kt)("inlineCode",{parentName:"p"},"capture_image")," function, then submits it to the Groundlight API for analysis. If the dog is detected on the couch, it plays the pre-recorded sound using the ",(0,o.kt)("inlineCode",{parentName:"p"},"play_sound")," function."),(0,o.kt)("p",null,"Save the script as ",(0,o.kt)("inlineCode",{parentName:"p"},"dog_on_couch_detector.py")," and run it:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"python dog_on_couch_detector.py\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/85111300.6894d342.js b/assets/js/efd4b15a.d1dfa5ea.js similarity index 96% rename from assets/js/85111300.6894d342.js rename to assets/js/efd4b15a.d1dfa5ea.js index d31319c4..ed5603d1 100644 --- a/assets/js/85111300.6894d342.js +++ b/assets/js/efd4b15a.d1dfa5ea.js @@ -1 +1 @@ -"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[298],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var r=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=r.createContext({}),c=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(l.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},h=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),h=i,g=u["".concat(l,".").concat(h)]||u[h]||d[h]||o;return t?r.createElement(g,a(a({ref:n},p),{},{components:t})):r.createElement(g,a({ref:n},p))}));function g(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var o=t.length,a=new Array(o);a[0]=h;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=t(7462),i=(t(7294),t(3905));const o={sidebar_position:4},a="Handling Server Errors",s={unversionedId:"building-applications/handling-errors",id:"building-applications/handling-errors",title:"Handling Server Errors",description:"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.",source:"@site/docs/building-applications/4-handling-errors.md",sourceDirName:"building-applications",slug:"/building-applications/handling-errors",permalink:"/python-sdk/docs/building-applications/handling-errors",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/4-handling-errors.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Confidence Levels",permalink:"/python-sdk/docs/building-applications/managing-confidence"},next:{title:"Asynchronous Queries",permalink:"/python-sdk/docs/building-applications/async-queries"}},l={},c=[{value:"Handling ApiException",id:"handling-apiexception",level:2},{value:"Best Practices for Handling Exceptions",id:"best-practices-for-handling-exceptions",level:2},{value:"Catch Specific Exceptions",id:"catch-specific-exceptions",level:3},{value:"Use Custom Exception Classes",id:"use-custom-exception-classes",level:3},{value:"Log Exceptions",id:"log-exceptions",level:3},{value:"Implement Retry Logic",id:"implement-retry-logic",level:3},{value:"Handle Exceptions Gracefully",id:"handle-exceptions-gracefully",level:3},{value:"Test Your Error Handling",id:"test-your-error-handling",level:3}],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,i.kt)(u,(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"handling-server-errors"},"Handling Server Errors"),(0,i.kt)("p",null,"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions."),(0,i.kt)("h2",{id:"handling-apiexception"},"Handling ApiException"),(0,i.kt)("p",null,"If there is an HTTP error during an API call, the SDK will raise an ",(0,i.kt)("inlineCode",{parentName:"p"},"ApiException"),". You can access different metadata from that exception:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'import traceback\nfrom groundlight import ApiException, Groundlight\n\ngl = Groundlight()\ntry:\n d = gl.get_or_create_detector(\n "Road Checker", \n "Is the site access road blocked?")\n iq = gl.submit_image_query(d, get_image(), wait=60)\nexcept ApiException as e:\n # Print a traceback for debugging\n traceback.print_exc()\n\n # e.reason contains a textual description of the error\n print(f"Error reason: {e.reason}")\n\n # e.status contains the HTTP status code\n print(f"HTTP status code: {e.status}")\n\n # Common HTTP status codes:\n # 400 Bad Request: The request was invalid or malformed\n # 401 Unauthorized: Your GROUNDLIGHT_API_TOKEN is missing or invalid\n # 403 Forbidden: The request is not allowed due to insufficient permissions\n # 404 Not Found: The requested resource was not found\n # 429 Too Many Requests: The rate limit for the API has been exceeded\n # 500 Internal Server Error: An error occurred on the server side\n')),(0,i.kt)("h2",{id:"best-practices-for-handling-exceptions"},"Best Practices for Handling Exceptions"),(0,i.kt)("p",null,"When working with the Groundlight SDK, follow these best practices to handle exceptions and build robust code:"),(0,i.kt)("h3",{id:"catch-specific-exceptions"},"Catch Specific Exceptions"),(0,i.kt)("p",null,"Catch only the specific exceptions that you expect to be raised, such as ",(0,i.kt)("inlineCode",{parentName:"p"},"ApiException"),". Avoid catching broad exceptions like ",(0,i.kt)("inlineCode",{parentName:"p"},"Exception"),", as it may make debugging difficult and obscure other unrelated issues."),(0,i.kt)("h3",{id:"use-custom-exception-classes"},"Use Custom Exception Classes"),(0,i.kt)("p",null,"Consider creating custom exception classes for your application-specific errors. This can help you differentiate between errors originating from the Groundlight SDK and those from your application."),(0,i.kt)("h3",{id:"log-exceptions"},"Log Exceptions"),(0,i.kt)("p",null,"Log exceptions with appropriate log levels (e.g., error, warning, etc.) and include relevant context information. This will help you debug issues more effectively and monitor the health of your application."),(0,i.kt)("h3",{id:"implement-retry-logic"},"Implement Retry Logic"),(0,i.kt)("p",null,"When handling exceptions, implement retry logic with exponential backoff for transient errors, such as network issues or rate-limiting. This can help your application recover from temporary issues without manual intervention."),(0,i.kt)("h3",{id:"handle-exceptions-gracefully"},"Handle Exceptions Gracefully"),(0,i.kt)("p",null,"In addition to logging exceptions, handle them gracefully to ensure that your application remains functional despite errors. This might include displaying an error message to users or falling back to a default behavior."),(0,i.kt)("h3",{id:"test-your-error-handling"},"Test Your Error Handling"),(0,i.kt)("p",null,"Write tests to ensure that your error handling works as expected. This can help you catch issues early and ensure that your application can handle errors gracefully in production."),(0,i.kt)("p",null,"By following these best practices, you can create robust and resilient applications that can handle server errors and other exceptions when using the Groundlight SDK."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkweb=self.webpackChunkweb||[]).push([[891],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var r=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=r.createContext({}),c=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(l.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},h=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),h=i,g=u["".concat(l,".").concat(h)]||u[h]||d[h]||o;return t?r.createElement(g,a(a({ref:n},p),{},{components:t})):r.createElement(g,a({ref:n},p))}));function g(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var o=t.length,a=new Array(o);a[0]=h;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[u]="string"==typeof e?e:i,a[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=t(7462),i=(t(7294),t(3905));const o={sidebar_position:4},a="Handling Server Errors",s={unversionedId:"building-applications/handling-errors",id:"building-applications/handling-errors",title:"Handling Server Errors",description:"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.",source:"@site/docs/building-applications/5-handling-errors.md",sourceDirName:"building-applications",slug:"/building-applications/handling-errors",permalink:"/python-sdk/docs/building-applications/handling-errors",draft:!1,editUrl:"https://github.com/groundlight/python-sdk/tree/main/docs/docs/building-applications/5-handling-errors.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Confidence Levels",permalink:"/python-sdk/docs/building-applications/managing-confidence"},next:{title:"Asynchronous Queries",permalink:"/python-sdk/docs/building-applications/async-queries"}},l={},c=[{value:"Handling ApiException",id:"handling-apiexception",level:2},{value:"Best Practices for Handling Exceptions",id:"best-practices-for-handling-exceptions",level:2},{value:"Catch Specific Exceptions",id:"catch-specific-exceptions",level:3},{value:"Use Custom Exception Classes",id:"use-custom-exception-classes",level:3},{value:"Log Exceptions",id:"log-exceptions",level:3},{value:"Implement Retry Logic",id:"implement-retry-logic",level:3},{value:"Handle Exceptions Gracefully",id:"handle-exceptions-gracefully",level:3},{value:"Test Your Error Handling",id:"test-your-error-handling",level:3}],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,i.kt)(u,(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"handling-server-errors"},"Handling Server Errors"),(0,i.kt)("p",null,"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions."),(0,i.kt)("h2",{id:"handling-apiexception"},"Handling ApiException"),(0,i.kt)("p",null,"If there is an HTTP error during an API call, the SDK will raise an ",(0,i.kt)("inlineCode",{parentName:"p"},"ApiException"),". You can access different metadata from that exception:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:"notest",notest:!0},'import traceback\nfrom groundlight import ApiException, Groundlight\n\ngl = Groundlight()\ntry:\n d = gl.get_or_create_detector(\n "Road Checker", \n "Is the site access road blocked?")\n iq = gl.submit_image_query(d, get_image(), wait=60)\nexcept ApiException as e:\n # Print a traceback for debugging\n traceback.print_exc()\n\n # e.reason contains a textual description of the error\n print(f"Error reason: {e.reason}")\n\n # e.status contains the HTTP status code\n print(f"HTTP status code: {e.status}")\n\n # Common HTTP status codes:\n # 400 Bad Request: The request was invalid or malformed\n # 401 Unauthorized: Your GROUNDLIGHT_API_TOKEN is missing or invalid\n # 403 Forbidden: The request is not allowed due to insufficient permissions\n # 404 Not Found: The requested resource was not found\n # 429 Too Many Requests: The rate limit for the API has been exceeded\n # 500 Internal Server Error: An error occurred on the server side\n')),(0,i.kt)("h2",{id:"best-practices-for-handling-exceptions"},"Best Practices for Handling Exceptions"),(0,i.kt)("p",null,"When working with the Groundlight SDK, follow these best practices to handle exceptions and build robust code:"),(0,i.kt)("h3",{id:"catch-specific-exceptions"},"Catch Specific Exceptions"),(0,i.kt)("p",null,"Catch only the specific exceptions that you expect to be raised, such as ",(0,i.kt)("inlineCode",{parentName:"p"},"ApiException"),". Avoid catching broad exceptions like ",(0,i.kt)("inlineCode",{parentName:"p"},"Exception"),", as it may make debugging difficult and obscure other unrelated issues."),(0,i.kt)("h3",{id:"use-custom-exception-classes"},"Use Custom Exception Classes"),(0,i.kt)("p",null,"Consider creating custom exception classes for your application-specific errors. This can help you differentiate between errors originating from the Groundlight SDK and those from your application."),(0,i.kt)("h3",{id:"log-exceptions"},"Log Exceptions"),(0,i.kt)("p",null,"Log exceptions with appropriate log levels (e.g., error, warning, etc.) and include relevant context information. This will help you debug issues more effectively and monitor the health of your application."),(0,i.kt)("h3",{id:"implement-retry-logic"},"Implement Retry Logic"),(0,i.kt)("p",null,"When handling exceptions, implement retry logic with exponential backoff for transient errors, such as network issues or rate-limiting. This can help your application recover from temporary issues without manual intervention."),(0,i.kt)("h3",{id:"handle-exceptions-gracefully"},"Handle Exceptions Gracefully"),(0,i.kt)("p",null,"In addition to logging exceptions, handle them gracefully to ensure that your application remains functional despite errors. This might include displaying an error message to users or falling back to a default behavior."),(0,i.kt)("h3",{id:"test-your-error-handling"},"Test Your Error Handling"),(0,i.kt)("p",null,"Write tests to ensure that your error handling works as expected. This can help you catch issues early and ensure that your application can handle errors gracefully in production."),(0,i.kt)("p",null,"By following these best practices, you can create robust and resilient applications that can handle server errors and other exceptions when using the Groundlight SDK."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.5bb0703e.js b/assets/js/main.5bb0703e.js new file mode 100644 index 00000000..9bc8721d --- /dev/null +++ b/assets/js/main.5bb0703e.js @@ -0,0 +1,2 @@ +/*! For license information please see main.5bb0703e.js.LICENSE.txt */ +(self.webpackChunkweb=self.webpackChunkweb||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"004649c5":[()=>n.e(342).then(n.bind(n,896)),"@site/docs/building-applications/2-grabbing-images.md",896],"0b4c8eac":[()=>n.e(67).then(n.bind(n,7474)),"@site/docs/installation/4-raspberry-pi.md",7474],"0cd01ddf":[()=>n.e(240).then(n.bind(n,315)),"@site/docs/iot/iot.md",315],"0fd99c0f":[()=>n.e(136).then(n.bind(n,6392)),"@site/docs/building-applications/3-working-with-detectors.md",6392],"14fdb7e5":[()=>n.e(355).then(n.bind(n,3983)),"@site/docs/getting-started/3-retail-analytics.md",3983],17896441:[()=>Promise.all([n.e(532),n.e(272),n.e(918)]).then(n.bind(n,903)),"@theme/DocItem",903],"1a4e3797":[()=>Promise.all([n.e(532),n.e(920)]).then(n.bind(n,2027)),"@theme/SearchPage",2027],"1b28ffce":[()=>n.e(518).then(n.bind(n,5069)),"@site/docs/building-applications/8-industrial.md",5069],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1df93b7f":[()=>Promise.all([n.e(532),n.e(237)]).then(n.bind(n,8391)),"@site/src/pages/index.tsx",8391],"1e924268":[()=>n.e(614).then(n.bind(n,4686)),"@site/docs/installation/installation.md",4686],"1f391b9e":[()=>Promise.all([n.e(532),n.e(272),n.e(85)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"325ecf53":[()=>n.e(45).then(n.bind(n,2904)),"@site/docs/getting-started/getting-started.mdx",2904],"37fce620":[()=>n.e(871).then(n.bind(n,3542)),"@site/docs/building-applications/1-sample-applications.md",3542],"393be207":[()=>n.e(414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"4178ee1d":[()=>n.e(859).then(n.bind(n,7607)),"@site/docs/api-reference/api-reference.md",7607],"4a1ffe74":[()=>n.e(955).then(n.t.bind(n,3769,19)),"/home/runner/work/python-sdk/python-sdk/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"530c8fc0":[()=>n.e(642).then(n.bind(n,4481)),"@site/docs/building-applications/building-applications.md",4481],"5747eae1":[()=>n.e(571).then(n.bind(n,3689)),"@site/docs/building-applications/4-managing-confidence.md",3689],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"6662e7aa":[()=>n.e(352).then(n.t.bind(n,2776,19)),"/home/runner/work/python-sdk/python-sdk/docs/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",2776],"7aefb68d":[()=>n.e(201).then(n.bind(n,688)),"@site/docs/getting-started/5-streaming.md",688],"8091dcef":[()=>n.e(100).then(n.bind(n,7143)),"@site/docs/installation/2-macos.md",7143],"8557125a":[()=>n.e(729).then(n.bind(n,4544)),"@site/docs/installation/6-optional-libraries.md",4544],"86aa3e00":[()=>n.e(605).then(n.bind(n,8205)),"@site/docs/installation/1-linux.md",8205],"8c4006d9":[()=>n.e(894).then(n.t.bind(n,5745,19)),"/home/runner/work/python-sdk/python-sdk/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"8c48aa69":[()=>n.e(502).then(n.bind(n,1343)),"@site/docs/building-applications/7-edge.md",1343],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],ad6b0f9d:[()=>n.e(168).then(n.bind(n,7095)),"@site/docs/installation/7-monitoring-notification-server.md",7095],c5b38f9e:[()=>n.e(863).then(n.bind(n,2905)),"@site/docs/getting-started/1-api-tokens.md",2905],cb33c72e:[()=>n.e(855).then(n.bind(n,6597)),"@site/docs/building-applications/6-async-queries.md",6597],d5ec6805:[()=>n.e(986).then(n.bind(n,4444)),"@site/docs/installation/3-windows.md",4444],ddfecd50:[()=>n.e(609).then(n.bind(n,6738)),"@site/docs/getting-started/4-dog-on-couch.md",6738],efd4b15a:[()=>n.e(891).then(n.bind(n,6385)),"@site/docs/building-applications/5-handling-errors.md",6385],f705f88e:[()=>n.e(537).then(n.bind(n,9518)),"@site/docs/installation/5-nvidia-jetson.md",9518],fc921a7a:[()=>n.e(124).then(n.bind(n,974)),"@site/docs/getting-started/2-writing-queries.md",974]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function p(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],p={},f=[],h=[],m=(0,c.Z)(o);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=s[n];r&&(p[t]=r[0],f.push(r[1]),h.push(r[2]))})),i().Map({loading:u,loader:p,modules:f,webpack:()=>h,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const f=[{path:"/python-sdk/markdown-page",component:p("/python-sdk/markdown-page","6f0"),exact:!0},{path:"/python-sdk/search",component:p("/python-sdk/search","619"),exact:!0},{path:"/python-sdk/docs",component:p("/python-sdk/docs","03b"),routes:[{path:"/python-sdk/docs/api-reference",component:p("/python-sdk/docs/api-reference","092"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications",component:p("/python-sdk/docs/building-applications","753"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/async-queries",component:p("/python-sdk/docs/building-applications/async-queries","e2f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/edge",component:p("/python-sdk/docs/building-applications/edge","859"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/grabbing-images",component:p("/python-sdk/docs/building-applications/grabbing-images","ccc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/handling-errors",component:p("/python-sdk/docs/building-applications/handling-errors","b6f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/industrial",component:p("/python-sdk/docs/building-applications/industrial","39d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/managing-confidence",component:p("/python-sdk/docs/building-applications/managing-confidence","c5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/sample-applications",component:p("/python-sdk/docs/building-applications/sample-applications","aef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/building-applications/working-with-detectors",component:p("/python-sdk/docs/building-applications/working-with-detectors","711"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/getting-started",component:p("/python-sdk/docs/getting-started","23b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/getting-started/api-tokens",component:p("/python-sdk/docs/getting-started/api-tokens","48d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/getting-started/dog-on-couch",component:p("/python-sdk/docs/getting-started/dog-on-couch","7b3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/getting-started/retail-analytics",component:p("/python-sdk/docs/getting-started/retail-analytics","4ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/getting-started/streaming",component:p("/python-sdk/docs/getting-started/streaming","23e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/getting-started/writing-queries",component:p("/python-sdk/docs/getting-started/writing-queries","35e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation",component:p("/python-sdk/docs/installation","905"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/linux",component:p("/python-sdk/docs/installation/linux","027"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/macos",component:p("/python-sdk/docs/installation/macos","ce1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/monitoring-notification-server",component:p("/python-sdk/docs/installation/monitoring-notification-server","1fb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/nvidia-jetson",component:p("/python-sdk/docs/installation/nvidia-jetson","c38"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/optional-libraries",component:p("/python-sdk/docs/installation/optional-libraries","82b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/raspberry-pi",component:p("/python-sdk/docs/installation/raspberry-pi","4e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/installation/windows",component:p("/python-sdk/docs/installation/windows","9e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/python-sdk/docs/iot",component:p("/python-sdk/docs/iot","9e2"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/python-sdk/",component:p("/python-sdk/","978"),exact:!0},{path:"*",component:p("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),h=n(5742),m=n(2263),g=n(4996),v=n(6668),y=n(1944),b=n(4711),w=n(9727),k=n(3320),E=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,m.Z)(),n=(0,b.l)();return r.createElement(h.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),a=function(){const{siteConfig:{url:e}}=(0,m.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(h.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,v.L)();return r.createElement(r.Fragment,null,r.createElement(h.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(y.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(h.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const T=new Map;function _(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),R=n(8940);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const A=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class P extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(A,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=P,D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner",F="docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
    \n

    Your Docusaurus site did not load properly.

    \n

    A very common reason is a wrong site baseUrl configuration.

    \n

    Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

    \n

    We suggest trying baseUrl =

    \n
    \n`}(e)).replace(/{window[j]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(h.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:D}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(z,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,m.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(h.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var q=n(4763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(q.Z,null,r.createElement(R.M,null,r.createElement(L.t,null,r.createElement(p,null,r.createElement(U,null),r.createElement(C,null),r.createElement($,null),r.createElement(I,{location:_(t)},e)))))}var G=n(6887);const Q=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Z=n(9670);const V=new Set,W=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Y={prefetch(e){if(!(e=>!K()&&!W.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!W.has(e))(e)&&(W.add(e),O(e))},X=Object.freeze(Y);if(l.Z.canUseDOM){window.docusaurus=X;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/python-sdk/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/python-sdk/docs","mainDocId":"getting-started/getting-started","docs":[{"id":"api-reference/redirect","path":"/python-sdk/docs/api-reference/","sidebar":"tutorialSidebar"},{"id":"building-applications/async-queries","path":"/python-sdk/docs/building-applications/async-queries","sidebar":"tutorialSidebar"},{"id":"building-applications/building-applications","path":"/python-sdk/docs/building-applications/","sidebar":"tutorialSidebar"},{"id":"building-applications/edge","path":"/python-sdk/docs/building-applications/edge","sidebar":"tutorialSidebar"},{"id":"building-applications/grabbing-images","path":"/python-sdk/docs/building-applications/grabbing-images","sidebar":"tutorialSidebar"},{"id":"building-applications/handling-errors","path":"/python-sdk/docs/building-applications/handling-errors","sidebar":"tutorialSidebar"},{"id":"building-applications/industrial","path":"/python-sdk/docs/building-applications/industrial","sidebar":"tutorialSidebar"},{"id":"building-applications/managing-confidence","path":"/python-sdk/docs/building-applications/managing-confidence","sidebar":"tutorialSidebar"},{"id":"building-applications/sample-applications","path":"/python-sdk/docs/building-applications/sample-applications","sidebar":"tutorialSidebar"},{"id":"building-applications/working-with-detectors","path":"/python-sdk/docs/building-applications/working-with-detectors","sidebar":"tutorialSidebar"},{"id":"getting-started/api-tokens","path":"/python-sdk/docs/getting-started/api-tokens","sidebar":"tutorialSidebar"},{"id":"getting-started/dog-on-couch","path":"/python-sdk/docs/getting-started/dog-on-couch","sidebar":"tutorialSidebar"},{"id":"getting-started/getting-started","path":"/python-sdk/docs/getting-started/","sidebar":"tutorialSidebar"},{"id":"getting-started/retail-analytics","path":"/python-sdk/docs/getting-started/retail-analytics","sidebar":"tutorialSidebar"},{"id":"getting-started/streaming","path":"/python-sdk/docs/getting-started/streaming","sidebar":"tutorialSidebar"},{"id":"getting-started/writing-queries","path":"/python-sdk/docs/getting-started/writing-queries","sidebar":"tutorialSidebar"},{"id":"installation/installation","path":"/python-sdk/docs/installation/","sidebar":"tutorialSidebar"},{"id":"installation/linux","path":"/python-sdk/docs/installation/linux","sidebar":"tutorialSidebar"},{"id":"installation/macos","path":"/python-sdk/docs/installation/macos","sidebar":"tutorialSidebar"},{"id":"installation/monitoring-notification-server","path":"/python-sdk/docs/installation/monitoring-notification-server","sidebar":"tutorialSidebar"},{"id":"installation/nvidia-jetson","path":"/python-sdk/docs/installation/nvidia-jetson","sidebar":"tutorialSidebar"},{"id":"installation/optional-libraries","path":"/python-sdk/docs/installation/optional-libraries","sidebar":"tutorialSidebar"},{"id":"installation/raspberry-pi","path":"/python-sdk/docs/installation/raspberry-pi","sidebar":"tutorialSidebar"},{"id":"installation/windows","path":"/python-sdk/docs/installation/windows","sidebar":"tutorialSidebar"},{"id":"iot/esp32cam","path":"/python-sdk/docs/iot/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/python-sdk/docs/getting-started/","label":"Getting Started"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.35.0"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(179);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:v=!0,...y}=e;const{siteConfig:{trailingSlash:b,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=p||f;const C=(0,s.Z)(x),T=x?.replace("pathname://","");let _=void 0!==T?(L=T,v&&(e=>e.startsWith("/"))(L)?k(L):L):void 0;var L;_&&C&&(_=(0,i.applyTrailingSlash)(_,{trailingSlash:b,baseUrl:w}));const R=(0,a.useRef)(!1),N=n?o.OL:o.rU,A=u.Z.canUseIntersectionObserver,O=(0,a.useRef)(),P=()=>{R.current||null==_||(window.docusaurus.preload(_),R.current=!0)};(0,a.useEffect)((()=>(!A&&C&&null!=_&&window.docusaurus.prefetch(_),()=>{A&&O.current&&O.current.disconnect()})),[O,_,A,C]);const I=_?.startsWith("#")??!1,D=!_||!C||I;return D||g||E.collectLink(_),D?a.createElement("a",(0,r.Z)({ref:S,href:_},x&&!C&&{target:"_blank",rel:"noopener noreferrer"},y)):a.createElement(N,(0,r.Z)({},y,{onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,A&&e&&C&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=_&&window.docusaurus.prefetch(_))}))})),O.current.observe(e))},to:_},n&&{isActive:m,activeClassName:h}))}const f=a.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>m,gA:()=>p,_r:()=>c,Jo:()=>g,zh:()=>d,yW:()=>h,gB:()=>f});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function h(e){const t=d(e);return l(t)}function m(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ot});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(7462),s=n(6550),u=n(5999),c=n(5936);const d="docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:a}=f();return r.createElement("div",{ref:n,role:"region","aria-label":h},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),v=n(9727);const y={skipToContent:"skipToContent_fXgn"};function b(){return r.createElement(m,{className:y.skipToContent})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const C={content:"content_knG7"};function T(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const _={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:_.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:_.announcementBarPlaceholder}),r.createElement(T,{className:_.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:_.announcementBarClose}))}var R=n(2961),N=n(2466);var A=n(902),O=n(3102);const P=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,R.e)(),t=(0,O.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,A.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(P.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(P);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,O.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var j=n(2949),B=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function $(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,B.Z)(),s=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(U.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!l&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),r.createElement($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Q(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,j.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var Z=n(1327);function V(){return r.createElement(Z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,R.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(V,null),r.createElement(Q,{className:"margin-right--md"}),r.createElement(W,null))}var Y=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const p=(0,X.Z)(a),f=(0,X.Z)(t),h=(0,X.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,J.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(Y.Z,(0,l.Z)({href:c?h:o},d,g)):r.createElement(Y.Z,(0,l.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ge,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),f()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(Ge,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var fe=n(4711);function he(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const me="iconLanguage_nlXk";var ge=n(1029),ve=n(412),ye=n(373),be=n(143),we=n(22),ke=n(8202),Ee=n(3926),Se=n(1073),xe=n(2539),Ce=n(726);const Te='',_e='',Le='',Re='',Ne='',Ae='',Oe='',Pe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ie(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:l}=e;const s=0===n,u=1===n,c=[];i?c.push(Ae):l&&c.push(Oe);const d=c.map((e=>`${e}`)),p=`${s?Te:u?_e:Le}`,f=[`${(0,Ce.o)(t.t,(0,Se.m)(a,"t"),o)}`];if(!i&&!l&&ge.H6){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Ee.e)(e??[])}`)}else s||f.push(`${(0,xe.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const h=`${Re}`;return[...d,p,``,...f,"",h].join("")}function De(){return`${Ne}${(0,u.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Me=n(311);async function Fe(){const e=await Promise.all([n.e(443),n.e(525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const je="_highlight";const Be=function(e){let{handleSearchBarToggle:t}=e;const{siteConfig:{baseUrl:n}}=(0,se.Z)(),o=(0,be.gA)();let i=n;try{const{preferredVersion:e}=(0,ye.J)(o?.pluginId??ge.gQ);e&&!e.isLast&&(i=e.path+"/")}catch(D){if(ge.l9&&!(D instanceof A.i6))throw D}const l=(0,s.k6)(),c=(0,s.TH)(),d=(0,r.useRef)(null),p=(0,r.useRef)(new Map),f=(0,r.useRef)(!1),[h,m]=(0,r.useState)(!1),[g,v]=(0,r.useState)(!1),[y,b]=(0,r.useState)(""),w=(0,r.useRef)(null),k=(0,r.useRef)(""),[E,S]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(ge.Kc))return;let e="";if(c.pathname.startsWith(i)){const t=c.pathname.substring(i.length),n=ge.Kc.find((e=>t===e||t.startsWith(`${e}/`)));n&&(e=n)}k.current!==e&&(p.current.delete(e),k.current=e),S(e)}),[c.pathname,i]);const x=!!ge.hG&&Array.isArray(ge.Kc)&&""===E,C=(0,r.useCallback)((async()=>{if(x||p.current.get(E))return;p.current.set(E,"loading"),w.current?.autocomplete.destroy(),m(!0);const[{wrappedIndexes:e,zhDictionary:t},r]=await Promise.all([(0,we.w)(i,E),Fe()]);if(w.current=r(d.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,a.Z)(Pe.searchBar,{[Pe.searchBarLeft]:"left"===ge.pu}),noPrefix:!0,dropdownMenu:Pe.dropdownMenu,input:Pe.input,hint:Pe.hint,suggestions:Pe.suggestions,suggestion:Pe.suggestion,cursor:Pe.cursor,dataset:Pe.dataset,empty:Pe.empty}},[{source:(0,ke.v)(e,t,ge.qo),templates:{suggestion:Ie,empty:De,footer:e=>{let{query:t,isEmpty:r}=e;if(r&&!E)return;const a=(e=>{let{query:t,isEmpty:r}=e;const a=document.createElement("a"),o=new URLSearchParams,s=(0,u.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),c=(0,u.I)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:E}),d=(0,u.I)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:E});let p;if(o.set("q",t),p=E&&r?c:E?d:s,Array.isArray(ge.Kc)&&!r&&o.set("ctx",E),i!==n){if(!i.startsWith(n))throw new Error(`Version url '${i}' does not start with base url '${n}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",i.substring(n.length))}const f=`${n}search?${o.toString()}`;return a.href=f,a.textContent=p,a.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),w.current?.autocomplete.close(),l.push(f))})),a})({query:t,isEmpty:r}),o=document.createElement("div");return o.className=Pe.hitFooter,o.appendChild(a),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;d.current?.blur();let o=n;if(ge.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(je,t);o+=`?${e.toString()}`}r&&(o+=r),l.push(o)})).on("autocomplete:closed",(()=>{d.current?.blur()})),p.current.set(E,"done"),m(!1),f.current){const e=d.current;e.value&&w.current?.autocomplete.open(),e.focus()}}),[x,E,i,n,l]);(0,r.useEffect)((()=>{if(!ge.vc)return;const e=ve.Z.canUseDOM?new URLSearchParams(c.search).getAll(je):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new ge.vc(t);n.unmark(),0!==e.length&&n.mark(e),b(e.join(" ")),w.current?.autocomplete.setVal(e.join(" "))}))}),[c.search,c.pathname]);const[T,_]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{f.current=!0,C(),_(!0),t?.(!0)}),[t,C]),R=(0,r.useCallback)((()=>{_(!1),t?.(!1)}),[t]),N=(0,r.useCallback)((()=>{C()}),[C]),O=(0,r.useCallback)((e=>{b(e.target.value),e.target.value&&v(!0)}),[]),P=!!ve.Z.canUseDOM&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!ge.AY)return;const e=e=>{!(P?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),d.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[P,L]);const I=(0,r.useCallback)((()=>{const e=new URLSearchParams(c.search);e.delete(je);const t=e.toString(),n=c.pathname+(""!=t?`?${t}`:"")+c.hash;n!=c.pathname+c.search+c.hash&&l.push(n),b(""),w.current?.autocomplete.setVal("")}),[c.pathname,c.search,c.hash,l]);return r.createElement("div",{className:(0,a.Z)("navbar__search",Pe.searchBarContainer,{[Pe.searchIndexLoading]:h&&g,[Pe.focused]:T}),hidden:x},r.createElement("input",{placeholder:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:N,onFocus:L,onBlur:R,onChange:O,ref:d,value:y}),r.createElement(Me.Z,{className:Pe.searchBarLoadingRing}),ge.AY&&ge.t_&&(""!==y?r.createElement("button",{className:Pe.searchClearButton,onClick:I},"\u2715"):ve.Z.canUseDOM&&r.createElement("div",{className:Pe.searchHintContainer},r.createElement("kbd",{className:Pe.searchHint},P?"\u2318":"ctrl"),r.createElement("kbd",{className:Pe.searchHint},"K"))))},ze={searchBox:"searchBox_ZlJk"};function $e(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,ze.searchBox)},t)}var Ue=n(2802);const qe=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),p=(0,fe.l)(),{search:f,hash:h}=(0,s.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(pe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(he,{className:me}),g),items:m}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement($e,{className:n},r.createElement(Be,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,be.Iw)(a),s=(0,Ue.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,be.Iw)(a),s=(0,Ue.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Ue.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:p}=(0,s.TH)(),f=(0,be.Iw)(n),h=(0,be.gB)(n),{savePreferredVersionName:m}=(0,ye.J)(n),g=[...o,...h.map((e=>{const t=f.alternateDocVersions[e.name]??qe(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...i],v=(0,Ue.lO)(n)[0],y=t&&g.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,b=t&&g.length>1?void 0:qe(v).path;return g.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:y,to:b,isActive:a?()=>!1:void 0})):r.createElement(pe,(0,l.Z)({},c,{mobile:t,label:y,to:b,items:g,isActive:a?()=>!1:void 0}))}};function Ge(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Qe(){const e=(0,R.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ge,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ze(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ve(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Ze,{onClick:()=>t.hide()}),t.content)}function We(){const e=(0,R.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(K,null),primaryMenu:r.createElement(Qe,null),secondaryMenu:r.createElement(Ve,null)}):null}const Ke={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,R.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,N.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ke.navbarHideable,!s&&Ke.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ye,{onClick:i.toggle}),r.createElement(We,null))}var Je=n(8780);const et={errorBoundaryError:"errorBoundaryError_a6uf"};function tt(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function nt(e){let{error:t}=e;const n=(0,Je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:et.errorBoundaryError},n)}class rt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const at="right";function ot(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function it(){const{toggle:e,shown:t}=(0,R.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(ot,null))}const lt={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(rt,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Ge,e)))))}function ut(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ct(){const e=(0,R.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??at)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(ut,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(it,null),r.createElement(V,null),r.createElement(st,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(st,{items:a}),r.createElement(Q,{className:lt.colorModeToggle}),!o&&r.createElement($e,null,r.createElement(Be,null)))})}function dt(){return r.createElement(Xe,null,r.createElement(ct,null))}function pt(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Y.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function ft(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(pt,{item:t}))}function ht(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(ft,{key:t,item:e})))))}function mt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(ht,{key:t,column:e}))))}function gt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function vt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(pt,{item:t})}function yt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(vt,{item:e}),t.length!==n+1&&r.createElement(gt,null))))))}function bt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(mt,{columns:t}):r.createElement(yt,{links:t})}var wt=n(941);const kt={footerLogoLink:"footerLogoLink_BH7S"};function Et(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(wt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function St(e){let{logo:t}=e;return t.href?r.createElement(Y.Z,{href:t.href,className:kt.footerLogoLink,target:t.target},r.createElement(Et,{logo:t})):r.createElement(Et,{logo:t})}function xt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ct(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function Tt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Ct,{style:o,links:n&&n.length>0&&r.createElement(bt,{links:n}),logo:a&&r.createElement(St,{logo:a}),copyright:t&&r.createElement(xt,{copyright:t})})}const _t=r.memo(Tt),Lt=(0,A.Qc)([j.S,k.pl,N.OC,ye.L5,i.VC,function(e){let{children:t}=e;return r.createElement(O.n2,null,r.createElement(R.M,null,r.createElement(I,null,t)))}]);function Rt(e){let{children:t}=e;return r.createElement(Lt,null,t)}function Nt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(tt,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(nt,{error:t})))))}const At={mainWrapper:"mainWrapper_z2l0"};function Ot(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(Rt,null,r.createElement(i.d,{title:s,description:u}),r.createElement(b,null),r.createElement(L,null),r.createElement(dt,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,At.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(Nt,e)},t)),!n&&r.createElement(_t,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:p,...f}=e,h=(0,i.Z)(u?.href||"/"),m=n?"":t,g=u?.alt??m;return a.createElement(o.Z,(0,r.Z)({to:h},f,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:p},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>g});var r=n(7462),a=n(7294),o=n(412);const i="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d(e){if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return 0;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}function p(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=function(){const t=e.scrollHeight;return{transition:`height ${r?.duration??d(t)}ms ${r?.easing??i}`,height:`${t}px`}}();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(a(),requestAnimationFrame((()=>{e.style.height=s.height,e.style.overflow=s.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{a()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.Z.canUseDOM)return e?s:u}function h(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(u.current,n),i?.(n))},className:l},r)}function m(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(h,(0,r.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?m:h;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>f});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>m});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},p=e=>e===d.dark?d.dark:d.light,f=e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{c.set(p(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>g});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return r.createElement(f.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(m,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(f);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=(n(1688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function p(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function f(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>p,_F:()=>m,cE:()=>d,hI:()=>k,lO:()=>y,vY:()=>w,oz:()=>b,s1:()=>v});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(8596);const d=!!i._r;function p(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=p(t);if(e)return e}}}const f=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),h=(e,t)=>e.some((e=>m(e,t)));function m(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||h(e.items,t))}function g(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function y(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function b(e,t){const n=y(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=y(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>c,VC:()=>f});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),p=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),l)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function f(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),a=n(6010);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};function i(e){let{className:t}=e;return r.createElement("div",{className:(0,a.Z)(o.loadingRing,t)},r.createElement("div",null),r.createElement("div",null),r.createElement("div",null),r.createElement("div",null))}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>l});var r=n(1336),a=n.n(r),o=n(1029);const i=new Map;function l(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),l=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(l)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>s});var r=n(1336),a=n.n(r);var o=n(1029);function i(e){return l(e).concat(l(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function l(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function s(e,t,n){return function(r,l){const s=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===s.length)return void l([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const l of t)if(r.substr(0,l.length)===l){const t={missed:a.missed,term:a.term.concat({value:l})};r.length>l.length?e(r.substr(l.length),t):n.push(t),i=!0}else for(let t=l.length-1;t>o;t-=1){const s=l.substr(0,t);if(r.substr(0,t)===s){o=t;const l={missed:a.missed,term:a.term.concat({value:s,trailing:!0})};r.length>t?e(r.substr(t),l):n.push(l),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let l;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);l=[];const t=[];for(const r of n){const n=e(r);l.push(n),n.length0&&t.push(n)}n.push(...t)}else l=n.slice();const s=[];for(const a of l)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)s.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(s))}(s,t),c=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(c.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(1690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const l=n+i.length;l${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>s});var r=n(1690),a=n(2539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var l=n(1029);function s(e,t,n,o){void 0===o&&(o=l.Hk);const{chunkIndex:s,chunks:u}=function(e,t,n){const o=[];let l=0,s=0,u=-1;for(;ls){const t=i(e.substring(s,c)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===u&&(u=o.length),s=c+d,o.push({html:(0,a.C)(e.substring(c,s),n,!0),textLength:d})}}if(s({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:u,chunks:o}}(e,t,n),c=u.slice(0,s),d=u[s],p=[d.html],f=u.slice(s+1);let h=d.textLength,m=0,g=0,v=!1,y=!1;for(;h0){const e=c.pop();h+e.textLength<=o?(p.unshift(e.html),m+=e.textLength,h+=e.textLength):(v=!0,c.length=0)}else{if(!(f.length>0))break;{const e=f.shift();h+e.textLength<=o?(p.push(e.html),g+=e.textLength,h+=e.textLength):(y=!0,f.length=0)}}return(v||c.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>a(),gQ:()=>h,H6:()=>c,hG:()=>v,l9:()=>m,dK:()=>o,_k:()=>i,pu:()=>f,AY:()=>d,t_:()=>p,Kc:()=>g,J:()=>l,Hk:()=>u,qo:()=>s,pQ:()=>y});n(1336);var r=n(813),a=n.n(r);const o=["en"],i=!1,l="search-index{dir}.json?_=5eccfa04",s=8,u=50,c=!0,d=!0,p=!0,f="right",h=void 0,m=!0,g=null,v=!1,y=!1},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>T,ob:()=>f,PP:()=>L,Ep:()=>p});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,m(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:b,goBack:function(){b(-1)},goForward:function(){b(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var a=f(n);a&&a!==h&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},1336:(e,t,n)=>{var r,a;!function(){var o,i,l,s,u,c,d,p,f,h,m,g,v,y,b,w,k,E,S,x,C,T,_,L,R,N,A,O,P,I,D=function(e){var t=new D.Builder;return t.pipeline.add(D.trimmer,D.stopWordFilter,D.stemmer),t.searchPipeline.add(D.stemmer),e.call(t,t),t.build()};D.version="2.3.9",D.utils={},D.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),D.utils.asString=function(e){return null==e?"":e.toString()},D.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var s=D.utils.clone(t)||{};s.position=[i,l],s.index=a.length,a.push(new D.Token(n.slice(i,o),s))}i=o+1}}return a},D.tokenizer.separator=/[\s\-]+/,D.Pipeline=function(){this._stack=[]},D.Pipeline.registeredFunctions=Object.create(null),D.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&D.utils.warn("Overwriting existing registered function: "+t),e.label=t,D.Pipeline.registeredFunctions[e.label]=e},D.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},D.Pipeline.load=function(e){var t=new D.Pipeline;return e.forEach((function(e){var n=D.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},D.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){D.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},D.Pipeline.prototype.after=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},D.Pipeline.prototype.before=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},D.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},D.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:ol?u+=2:i==l&&(t+=n[s+1]*r[u+1],s+=2,u+=2);return t},D.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},D.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new D.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new D.TokenSet;a.node.edges["*"]=l}if(0==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new D.TokenSet;a.node.edges["*"]=s}1==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new D.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},D.TokenSet.fromString=function(e){for(var t=new D.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},D.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},D.Index.prototype.search=function(e){return this.query((function(t){new D.QueryParser(e,t).parse()}))},D.Index.prototype.query=function(e){for(var t=new D.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),l=0;l1?1:e},D.Builder.prototype.k1=function(e){this._k1=e},D.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(D.QueryLexer.TERM)),e.ignore(),e.more())return D.QueryLexer.lexText},D.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.EDIT_DISTANCE),D.QueryLexer.lexText},D.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.BOOST),D.QueryLexer.lexText},D.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(D.QueryLexer.TERM)},D.QueryLexer.termSeparator=D.tokenizer.separator,D.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==D.QueryLexer.EOS)return D.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return D.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if(t.match(D.QueryLexer.termSeparator))return D.QueryLexer.lexTerm}else e.escapeCharacter()}},D.QueryParser=function(e,t){this.lexer=new D.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},D.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=D.QueryParser.parseClause;e;)e=e(this);return this.query},D.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},D.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},D.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},D.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case D.QueryLexer.PRESENCE:return D.QueryParser.parsePresence;case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new D.QueryParseError(n,t.start,t.end)}},D.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=D.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=D.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new D.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new D.QueryParseError(n,t.start,t.end)}switch(r.type){case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new D.QueryParseError(n,r.start,r.end)}}},D.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new D.QueryParseError(r,t.start,t.end)}if(a.type===D.QueryLexer.TERM)return D.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}},D.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new D.QueryParseError(r,n.start,n.end)}else e.nextClause()}},D.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}else e.nextClause()}},D.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return D})?r.call(t,n,t,e):r)||(e.exports=a)}()},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=a,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var a=e.contentWindow;if(r=a.document,!a||!r)throw new Error("iframe inaccessible")}catch(o){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,a=!1,o=null,i=function i(){if(!a){a=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(l){n()}}};e.addEventListener("load",i),o=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var a=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),l=i.length,s=0;i=Array.prototype.slice.call(i);var u=function(){--l<=0&&o(s)};l||u(),i.forEach((function(t){e.matches(t,a.exclude)?u():a.onIframeReady(t,(function(e){n(t)&&(s++,r(e)),u()}),u)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var a=!1,o=!1;return r.forEach((function(e,t){e.val===n&&(a=t,o=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==a||o?!1===a||o||(r[a].handled=!0):r.push({val:n,handled:!0}),!0):(!1===a&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var a=this;e.forEach((function(e){e.handled||a.getIframeContents(e.val,(function(e){a.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,a){for(var o=this,i=this.createIterator(t,e,r),l=[],s=[],u=void 0,c=void 0,d=function(){var e=o.getIteratorNode(i);return c=e.prevNode,u=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return o.checkIframeFilter(u,c,e,l)}),(function(t){o.createInstanceOnIframe(t).forEachNode(e,(function(e){return s.push(e)}),r)})),s.push(u);s.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(l,e,n,r),a()}},{key:"forEachNode",value:function(e,t,n){var r=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),i=o.length;i||a(),o.forEach((function(o){var l=function(){r.iterateThroughNodes(e,o,t,n,(function(){--i<=0&&a()}))};r.iframes?r.waitForIframes(o,l):l()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var a=!1;return n.every((function(t){return!r.call(e,t)||(a=!0,!1)})),a}return!1}}]),e}(),o=function(){function o(e){t(this,o),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(o,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var a in t)if(t.hasOwnProperty(a)){var o=t[a],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a),l="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==i&&""!==l&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(l)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(l)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(a){n.every((function(n){if(-1!==n.indexOf(a)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,a="string"==typeof r?r:r.value,o="string"==typeof r?[]:r.limiters,i="";switch(o.forEach((function(e){i+="|"+t.escapeStr(e)})),a){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var a=t.callNoMatchOnInvalidRanges(e,r),o=a.start,i=a.end;a.valid&&(e.start=o,e.length=i-o,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,a=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?a=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:a}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,a=!0,o=n.length,i=t-o,l=parseInt(e.start,10)-i;return(r=(l=l>o?o:l)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),l<0||r-l<0||l>o||r>o?(a=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(l,r).replace(/\s+/g,"")&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:r,valid:a}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return a.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",a=e.splitText(t),o=a.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=a.textContent,a.parentNode.replaceChild(i,a),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,a){var o=this;e.nodes.every((function(i,l){var s=e.nodes[l+1];if(void 0===s||s.start>t){if(!r(i.node))return!1;var u=t-i.start,c=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),p=e.value.substr(c+i.start);if(i.node=o.wrapRangeInTextNode(i.node,u,c),e.value=d+p,e.nodes.forEach((function(t,n){n>=l&&(e.nodes[n].start>0&&n!==l&&(e.nodes[n].start-=c),e.nodes[n].end-=c)})),n-=c,a(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,a){var o=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var a=void 0;null!==(a=e.exec(t.textContent))&&""!==a[i];)if(n(a[i],t)){var l=a.index;if(0!==i)for(var s=1;s{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{var r=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var h=e[i],m=n[2],g=n[3],v=n[4],y=n[5],b=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=m&&null!=h&&h!==m,E="+"===b||"*"===b,S="?"===b||"*"===b,x=n[2]||c,C=v||y;r.push({name:g||o++,prefix:m||"",delimiter:x,optional:S,repeat:E,partial:k,asterisk:!!w,pattern:C?u(C):w?".*":"[^"+s(x)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,T=1;if(y){if(!(C=o(k,S,e,v))||C.index>=e.length)break;var _=C.index,L=C.index+C[0].length,R=S;for(R+=E.value.length;_>=R;)R+=(E=E.next).value.length;if(S=R-=E.value.length,E.value instanceof a)continue;for(var N=E;N!==t.tail&&(Rd.reach&&(d.reach=I);var D=E.prev;if(O&&(D=s(t,D,O),S+=O.length),u(t,D,T),E=s(t,D,new a(p,g?r.tokenize(A,g):A,b,A)),P&&s(t,E,P),T>1){var M={cause:p+","+h,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=p(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&f(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),p=Object.keys(c);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),f=o.substring(l+a.length),h=[];if(s&&h.push(s),h.push(d),f){var m=[f];e(m),h.push.apply(h,m)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(h)),n+=h.length-1):r.content=h}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),h=p.indexOf(f);if(h>-1){++a;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=p.substring(h+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(g),v&&y.push.apply(y,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var p,f=r(s),h=c;a(h);){for(var m in p={},h){var g=s[m];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var v in d)if(!(v in c))for(var y in f(v))if(y in c){p[v]=!0;break}for(var b in h=p)c[b]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var p=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n
    + + \ No newline at end of file diff --git a/docs/building-applications/async-queries.html b/docs/building-applications/async-queries.html index 5aa3ca78..65a28099 100644 --- a/docs/building-applications/async-queries.html +++ b/docs/building-applications/async-queries.html @@ -4,13 +4,13 @@ Asynchronous Queries | Groundlight - - + +
    -

    Asynchronous Queries

    Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.

    Setup Submitting Machine

    On the submitting machine, you will need to install the Groundlight Python SDK. Then you can submit image queries asynchronously using the ask_async interface (read the full documentation here). ask_async submits your query and returns as soon as the query is submitted. It does not wait for an answer to be available prior to returning to minimize the time your program spends interacting with Groundlight. As a result, the ImageQuery object ask_async returns lacks a result (the result field will be None). This is acceptable for this use case as the submitting machine is not interested in the result. Instead, the submitting machine just needs to communicate the ImageQuery.ids to the retrieving machine - this might be done via a database, a message queue, or some other mechanism. For this example, we assume you are using a database where you save the ImageQuery.id to it via db.save(image_query.id).

    from groundlight import Groundlight
    import cv2
    from time import sleep

    detector = gl.get_or_create_detector(name="your_detector_name", query="your_query")

    cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)

    while True:
    _, image = cam.read() # Capture one frame from the camera
    image_query = gl.ask_async(detector=detector, image=image) # Submit the frame to Groundlight
    db.save(image_query.id) # Save the image_query.id to a database for the retrieving machine to use
    sleep(10) # Sleep for 10 seconds before submitting the next query

    cam.release() # Release the camera

    Setup Retrieving Machine

    On the retrieving machine you will need to install the Groundlight Python SDK. Then you can retrieve the results of the image queries submitted by another machine using get_image_query. The retrieving machine can then use the ImageQuery.result to take action based on the result for whatever application you are building. For this example, we assume your application looks up the next image query to process from a database via db.get_next_image_query_id() and that this function returns None once all ImageQuerys are processed.

    from groundlight import Groundlight

    detector = gl.get_or_create_detector(name="your_detector_name", query="your_query")

    image_query_id = db.get_next_image_query_id()

    while image_query_id is not None:
    image_query = gl.get_image_query(id=image_query_id) # retrieve the image query from Groundlight
    result = image_query.result

    # take action based on the result of the image query
    if result.label == 'YES':
    pass # TODO: do something based on your application
    elif result.label == 'NO':
    pass # TODO: do something based on your application
    elif result.label == 'UNCLEAR':
    pass # TODO: do something based on your application

    # update image_query_id for next iteration of the loop
    image_query_id = db.get_next_image_query_id()

    Important Considerations

    When you submit an image query asynchronously, ML prediction on your query is not instant. So attempting to retrieve the result immediately after submitting an async query will likely result in an UNCLEAR result as Groundlight is still processing your query. Instead, if your code needs a result synchronously we recommend using one of our methods with a polling mechanism to retrieve the result. You can see all of the interfaces available in the documentation here.

    from groundlight import Groundlight
    from PIL import Image

    detector = gl.get_or_create_detector(name="your_detector_name", query="your_query")
    image = Image.open("/path/to/your/image.jpg")
    image_query = gl.ask_async(detector=detector, image=image) # Submit async query to Groundlight
    result = image_query.result # This will always be 'None' as you asked asynchronously

    image_query = gl.get_image_query(id=image_query.id) # Immediately retrieve the image query from Groundlight
    result = image_query.result # This will likely be 'UNCLEAR' as Groundlight is still processing your query

    image_query = gl.wait_for_confident_result(id=image_query.id) # Poll for a confident result from Groundlight
    result = image_query.result
    - - +

    Asynchronous Queries

    Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.

    Setup Submitting Machine

    On the submitting machine, you will need to install the Groundlight Python SDK. Then you can submit image queries asynchronously using the ask_async interface (read the full documentation here). ask_async submits your query and returns as soon as the query is submitted. It does not wait for an answer to be available prior to returning to minimize the time your program spends interacting with Groundlight. As a result, the ImageQuery object ask_async returns lacks a result (the result field will be None). This is acceptable for this use case as the submitting machine is not interested in the result. Instead, the submitting machine just needs to communicate the ImageQuery.ids to the retrieving machine - this might be done via a database, a message queue, or some other mechanism. For this example, we assume you are using a database where you save the ImageQuery.id to it via db.save(image_query.id).

    from groundlight import Groundlight
    import cv2
    from time import sleep

    detector = gl.get_or_create_detector(name="your_detector_name", query="your_query")

    cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)

    while True:
    _, image = cam.read() # Capture one frame from the camera
    image_query = gl.ask_async(detector=detector, image=image) # Submit the frame to Groundlight
    db.save(image_query.id) # Save the image_query.id to a database for the retrieving machine to use
    sleep(10) # Sleep for 10 seconds before submitting the next query

    cam.release() # Release the camera

    Setup Retrieving Machine

    On the retrieving machine you will need to install the Groundlight Python SDK. Then you can retrieve the results of the image queries submitted by another machine using get_image_query. The retrieving machine can then use the ImageQuery.result to take action based on the result for whatever application you are building. For this example, we assume your application looks up the next image query to process from a database via db.get_next_image_query_id() and that this function returns None once all ImageQuerys are processed.

    from groundlight import Groundlight

    detector = gl.get_or_create_detector(name="your_detector_name", query="your_query")

    image_query_id = db.get_next_image_query_id()

    while image_query_id is not None:
    image_query = gl.get_image_query(id=image_query_id) # retrieve the image query from Groundlight
    result = image_query.result

    # take action based on the result of the image query
    if result.label == 'YES':
    pass # TODO: do something based on your application
    elif result.label == 'NO':
    pass # TODO: do something based on your application
    elif result.label == 'UNCLEAR':
    pass # TODO: do something based on your application

    # update image_query_id for next iteration of the loop
    image_query_id = db.get_next_image_query_id()

    Important Considerations

    When you submit an image query asynchronously, ML prediction on your query is not instant. So attempting to retrieve the result immediately after submitting an async query will likely result in an UNCLEAR result as Groundlight is still processing your query. Instead, if your code needs a result synchronously we recommend using one of our methods with a polling mechanism to retrieve the result. You can see all of the interfaces available in the documentation here.

    from groundlight import Groundlight
    from PIL import Image

    detector = gl.get_or_create_detector(name="your_detector_name", query="your_query")
    image = Image.open("/path/to/your/image.jpg")
    image_query = gl.ask_async(detector=detector, image=image) # Submit async query to Groundlight
    result = image_query.result # This will always be 'None' as you asked asynchronously

    image_query = gl.get_image_query(id=image_query.id) # Immediately retrieve the image query from Groundlight
    result = image_query.result # This will likely be 'UNCLEAR' as Groundlight is still processing your query

    image_query = gl.wait_for_confident_result(id=image_query.id) # Poll for a confident result from Groundlight
    result = image_query.result
    + + \ No newline at end of file diff --git a/docs/building-applications/edge.html b/docs/building-applications/edge.html index 3110cbc5..60e519fd 100644 --- a/docs/building-applications/edge.html +++ b/docs/building-applications/edge.html @@ -4,18 +4,18 @@ Using Groundlight on the Edge | Groundlight - - + +
    -

    Using Groundlight on the Edge

    If your account has access to edge models, you can download and install them to your edge devices.
    +

    Using Groundlight on the Edge

    If your account has access to edge models, you can download and install them to your edge devices.
    This allows you to run your model evaluations on the edge, reducing latency, cost, network bandwidth, and energy.

    How the Edge Endpoint works

    The Edge Endpoint runs as a set of docker containers on an "edge device". This edge device can be an NVIDIA Jetson device, rack-mounted server, or even a Raspberry Pi. The Edge Endpoint is responsible for downloading and running the models, and for communicating with the Groundlight cloud service.

    To use the edge endpoint, simply configure the Groundlight SDK to use the edge endpoint's URL instead of the cloud endpoint. All application logic will work seamlessly and unchanged with the Groundlight Edge Endpoint, except some ML answers will return much faster locally. The only visible difference is that image queries answered at the edge endpoint will have the prefix iqe_ instead of iq_ for image queries answered in the cloud. iqe_ stands for "image query edge". Edge-originated -image queries will not appear in the cloud dashboard.

    Configuring the Edge Endpoint

    To configure the Groundlight SDK to use the edge endpoint, you can either pass the endpoint URL to the Groundlight constructor like:

    from groundlight import Groundlight
    gl = Groundlight(endpoint="http://localhost:6717")

    or by setting the GROUNDLIGHT_ENDPOINT environment variable like:

    export GROUNDLIGHT_ENDPOINT=http://localhost:6717
    python your_app.py
    - - +image queries will not appear in the cloud dashboard.

    Configuring the Edge Endpoint

    To configure the Groundlight SDK to use the edge endpoint, you can either pass the endpoint URL to the Groundlight constructor like:

    from groundlight import Groundlight
    gl = Groundlight(endpoint="http://localhost:6717")

    or by setting the GROUNDLIGHT_ENDPOINT environment variable like:

    export GROUNDLIGHT_ENDPOINT=http://localhost:6717
    python your_app.py

    + + \ No newline at end of file diff --git a/docs/building-applications/grabbing-images.html b/docs/building-applications/grabbing-images.html index 131bc04a..e75d4d52 100644 --- a/docs/building-applications/grabbing-images.html +++ b/docs/building-applications/grabbing-images.html @@ -4,12 +4,12 @@ Grabbing Images | Groundlight - - + +
    -

    Grabbing Images

    Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.

    PIL

    The Groundlight SDK can accept PIL images directly in submit_image_query. Here's an example:

    from groundlight import Groundlight
    from PIL import Image

    gl = Groundlight()
    det = gl.get_or_create_detector(name="path-clear", query="Is the path clear?")
    pil_img = Image.open("./docs/static/img/doorway.jpg")
    gl.submit_image_query(det, pil_img)

    OpenCV

    OpenCV is a popular image processing library, with many utilities for working with images. +

    Grabbing Images

    Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.

    PIL

    The Groundlight SDK can accept PIL images directly in submit_image_query. Here's an example:

    from groundlight import Groundlight
    from PIL import Image

    gl = Groundlight()
    det = gl.get_or_create_detector(name="path-clear", query="Is the path clear?")
    pil_img = Image.open("./docs/static/img/doorway.jpg")
    gl.submit_image_query(det, pil_img)

    OpenCV

    OpenCV is a popular image processing library, with many utilities for working with images. OpenCV images are stored as numpy arrays. (Note they are stored in BGR order, not RGB order, but as of Groundlight SDK v0.8 this is the expected order.) OpenCV's images can be send directly to submit_image_query as follows:

    import cv2

    cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index)

    _, frame = cam.read() # Capture one frame
    gl.submit_image_query(detector, frame) # Send the frame to Groundlight
    cam.release() # Release the camera

    Numpy

    The Groundlight SDK can accept images as numpy arrays. They should be in the standard HWN format in BGR color order, matching OpenCV standards. Pixel values should be from 0-255 (not 0.0-1.0 as floats). So uint8 data type is preferable since it saves memory.

    Here's sample code to create an 800x600 random image in numpy:

    import numpy as np

    np_img = np.random.uniform(low=0, high=255, size=(600, 800, 3)).astype(np.uint8)
    # Note: channel order is interpretted as BGR not RGB
    gl.submit_image_query(detector, np_img)

    Channel order: BGR vs RGB

    Groundlight expects images in BGR order, because this is standard for OpenCV, which uses numpy arrays as image storage. @@ -20,8 +20,8 @@ Swapped color channels

    In industrial settings, the difference can be almost impossible to detect without prior knowledge of the scene: Correct color order Swapped color channels

    Framegrab

    For a unified interface to many different kinds of image sources, see the framegrab library. -Framegrab is still an early work in progress, but has many useful features for working with cameras and other image sources. Framegrab provides a single interface for many different kinds of image sources, including:

    • USB cameras
    • IP cameras
    • Video files
    • Image files
    - - +Framegrab is still an early work in progress, but has many useful features for working with cameras and other image sources. Framegrab provides a single interface for many different kinds of image sources, including:

    • USB cameras
    • IP cameras
    • Video files
    • Image files
    + + \ No newline at end of file diff --git a/docs/building-applications/handling-errors.html b/docs/building-applications/handling-errors.html index 80f34ffc..440286d9 100644 --- a/docs/building-applications/handling-errors.html +++ b/docs/building-applications/handling-errors.html @@ -4,13 +4,13 @@ Handling Server Errors | Groundlight - - + +
    -

    Handling Server Errors

    When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.

    Handling ApiException

    If there is an HTTP error during an API call, the SDK will raise an ApiException. You can access different metadata from that exception:

    import traceback
    from groundlight import ApiException, Groundlight

    gl = Groundlight()
    try:
    d = gl.get_or_create_detector(
    "Road Checker",
    "Is the site access road blocked?")
    iq = gl.submit_image_query(d, get_image(), wait=60)
    except ApiException as e:
    # Print a traceback for debugging
    traceback.print_exc()

    # e.reason contains a textual description of the error
    print(f"Error reason: {e.reason}")

    # e.status contains the HTTP status code
    print(f"HTTP status code: {e.status}")

    # Common HTTP status codes:
    # 400 Bad Request: The request was invalid or malformed
    # 401 Unauthorized: Your GROUNDLIGHT_API_TOKEN is missing or invalid
    # 403 Forbidden: The request is not allowed due to insufficient permissions
    # 404 Not Found: The requested resource was not found
    # 429 Too Many Requests: The rate limit for the API has been exceeded
    # 500 Internal Server Error: An error occurred on the server side

    Best Practices for Handling Exceptions

    When working with the Groundlight SDK, follow these best practices to handle exceptions and build robust code:

    Catch Specific Exceptions

    Catch only the specific exceptions that you expect to be raised, such as ApiException. Avoid catching broad exceptions like Exception, as it may make debugging difficult and obscure other unrelated issues.

    Use Custom Exception Classes

    Consider creating custom exception classes for your application-specific errors. This can help you differentiate between errors originating from the Groundlight SDK and those from your application.

    Log Exceptions

    Log exceptions with appropriate log levels (e.g., error, warning, etc.) and include relevant context information. This will help you debug issues more effectively and monitor the health of your application.

    Implement Retry Logic

    When handling exceptions, implement retry logic with exponential backoff for transient errors, such as network issues or rate-limiting. This can help your application recover from temporary issues without manual intervention.

    Handle Exceptions Gracefully

    In addition to logging exceptions, handle them gracefully to ensure that your application remains functional despite errors. This might include displaying an error message to users or falling back to a default behavior.

    Test Your Error Handling

    Write tests to ensure that your error handling works as expected. This can help you catch issues early and ensure that your application can handle errors gracefully in production.

    By following these best practices, you can create robust and resilient applications that can handle server errors and other exceptions when using the Groundlight SDK.

    - - +

    Handling Server Errors

    When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.

    Handling ApiException

    If there is an HTTP error during an API call, the SDK will raise an ApiException. You can access different metadata from that exception:

    import traceback
    from groundlight import ApiException, Groundlight

    gl = Groundlight()
    try:
    d = gl.get_or_create_detector(
    "Road Checker",
    "Is the site access road blocked?")
    iq = gl.submit_image_query(d, get_image(), wait=60)
    except ApiException as e:
    # Print a traceback for debugging
    traceback.print_exc()

    # e.reason contains a textual description of the error
    print(f"Error reason: {e.reason}")

    # e.status contains the HTTP status code
    print(f"HTTP status code: {e.status}")

    # Common HTTP status codes:
    # 400 Bad Request: The request was invalid or malformed
    # 401 Unauthorized: Your GROUNDLIGHT_API_TOKEN is missing or invalid
    # 403 Forbidden: The request is not allowed due to insufficient permissions
    # 404 Not Found: The requested resource was not found
    # 429 Too Many Requests: The rate limit for the API has been exceeded
    # 500 Internal Server Error: An error occurred on the server side

    Best Practices for Handling Exceptions

    When working with the Groundlight SDK, follow these best practices to handle exceptions and build robust code:

    Catch Specific Exceptions

    Catch only the specific exceptions that you expect to be raised, such as ApiException. Avoid catching broad exceptions like Exception, as it may make debugging difficult and obscure other unrelated issues.

    Use Custom Exception Classes

    Consider creating custom exception classes for your application-specific errors. This can help you differentiate between errors originating from the Groundlight SDK and those from your application.

    Log Exceptions

    Log exceptions with appropriate log levels (e.g., error, warning, etc.) and include relevant context information. This will help you debug issues more effectively and monitor the health of your application.

    Implement Retry Logic

    When handling exceptions, implement retry logic with exponential backoff for transient errors, such as network issues or rate-limiting. This can help your application recover from temporary issues without manual intervention.

    Handle Exceptions Gracefully

    In addition to logging exceptions, handle them gracefully to ensure that your application remains functional despite errors. This might include displaying an error message to users or falling back to a default behavior.

    Test Your Error Handling

    Write tests to ensure that your error handling works as expected. This can help you catch issues early and ensure that your application can handle errors gracefully in production.

    By following these best practices, you can create robust and resilient applications that can handle server errors and other exceptions when using the Groundlight SDK.

    + + \ No newline at end of file diff --git a/docs/building-applications/industrial.html b/docs/building-applications/industrial.html index 085ece3b..d120e857 100644 --- a/docs/building-applications/industrial.html +++ b/docs/building-applications/industrial.html @@ -4,13 +4,13 @@ Industrial and Manufacturing Applications | Groundlight - - + +
    -

    Industrial and Manufacturing Applications

    Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.

    Machine Tending

    Groundlight's computer vision technology can assist in automating machine-tending tasks, such as loading and unloading materials in CNC machines, milling centers, or injection molding equipment. By enabling robots to recognize parts and tools using natural language, complex machine-tending tasks become more accessible and efficient.

    Process Automation

    Integrating Groundlight's computer vision into your process automation systems can help identify bottlenecks, optimize workflows, and reduce manual intervention. Our technology can work hand-in-hand with robotic systems to perform tasks like sorting, assembly, all while interpreting natural language commands to streamline operations.

    Quality Control

    Groundlight's computer vision technology can play a vital role in ensuring the highest quality standards in your manufacturing processes. By identifying defects or irregularities in products, our computer vision system can help maintain strict quality control, reducing the need for manual inspections and increasing overall product quality.

    Integration with Cobots and CNC Machines

    Groundlight's computer vision technology can be easily integrated with popular cobot robotic arms, such as Universal Robots, to enhance their capabilities and improve collaboration between humans and robots. Additionally, our technology can be integrated into existing CNC machines or other devices using the Modbus interface, allowing for seamless communication and control within your manufacturing environment.

    Contact Sales

    To learn more about how Groundlight's natural language computer vision technology can revolutionize your industrial and manufacturing processes, please reach out to us at info@groundlight.ai.

    - - +

    Industrial and Manufacturing Applications

    Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.

    Machine Tending

    Groundlight's computer vision technology can assist in automating machine-tending tasks, such as loading and unloading materials in CNC machines, milling centers, or injection molding equipment. By enabling robots to recognize parts and tools using natural language, complex machine-tending tasks become more accessible and efficient.

    Process Automation

    Integrating Groundlight's computer vision into your process automation systems can help identify bottlenecks, optimize workflows, and reduce manual intervention. Our technology can work hand-in-hand with robotic systems to perform tasks like sorting, assembly, all while interpreting natural language commands to streamline operations.

    Quality Control

    Groundlight's computer vision technology can play a vital role in ensuring the highest quality standards in your manufacturing processes. By identifying defects or irregularities in products, our computer vision system can help maintain strict quality control, reducing the need for manual inspections and increasing overall product quality.

    Integration with Cobots and CNC Machines

    Groundlight's computer vision technology can be easily integrated with popular cobot robotic arms, such as Universal Robots, to enhance their capabilities and improve collaboration between humans and robots. Additionally, our technology can be integrated into existing CNC machines or other devices using the Modbus interface, allowing for seamless communication and control within your manufacturing environment.

    Contact Sales

    To learn more about how Groundlight's natural language computer vision technology can revolutionize your industrial and manufacturing processes, please reach out to us at info@groundlight.ai.

    + + \ No newline at end of file diff --git a/docs/building-applications/managing-confidence.html b/docs/building-applications/managing-confidence.html index e2db7630..b1afeee4 100644 --- a/docs/building-applications/managing-confidence.html +++ b/docs/building-applications/managing-confidence.html @@ -4,15 +4,15 @@ Confidence Levels | Groundlight - - + +
    -

    Confidence Levels

    Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster.

    The desired confidence level is set as the escalation threshold on your detector. This determines the minimum confidence score for the ML system to provide before the image query is escalated.

    For example, say you want to set your desired confidence level to 0.95, but that you're willing to wait up to 60 seconds to get a confident response.

    from groundlight import Groundlight
    from PIL import Image
    import requests

    gl = Groundlight()
    image_url = "https://www.photos-public-domain.com/wp-content/uploads/2010/11/over_flowing_garbage_can.jpg"
    image = Image.open(requests.get(image_url, stream=True).raw)

    d = gl.get_or_create_detector(name="trash", query="Is the trash can full?", confidence_threshold=0.95)

    # This will wait until either 60 seconds have passed or the confidence reaches 0.95
    image_query = gl.submit_image_query(detector=d, image=image, wait=60)

    print(f"The answer is {image_query.result}")
    tip

    Tuning confidence lets you balance accuracy against latency. +

    Confidence Levels

    Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster.

    The desired confidence level is set as the escalation threshold on your detector. This determines the minimum confidence score for the ML system to provide before the image query is escalated.

    For example, say you want to set your desired confidence level to 0.95, but that you're willing to wait up to 60 seconds to get a confident response.

    from groundlight import Groundlight
    from PIL import Image
    import requests

    gl = Groundlight()
    image_url = "https://www.photos-public-domain.com/wp-content/uploads/2010/11/over_flowing_garbage_can.jpg"
    image = Image.open(requests.get(image_url, stream=True).raw)

    d = gl.get_or_create_detector(name="trash", query="Is the trash can full?", confidence_threshold=0.95)

    # This will wait until either 60 seconds have passed or the confidence reaches 0.95
    image_query = gl.submit_image_query(detector=d, image=image, wait=60)

    print(f"The answer is {image_query.result}")
    tip

    Tuning confidence lets you balance accuracy against latency. Higher confidence will get higher accuracy, but will generally require higher latency. -Higher confidence also requires more labels, which increases labor costs.

    Or if you want to execute submit_image_query as fast as possible, set wait=0. You will either get the ML results or a placeholder response if the ML model hasn't finished executing. Image queries which are below the desired confidence level will still be escalated for further analysis, and the results are incorporated as training data to improve your ML model, but your code will not wait for that to happen.

    image_query = gl.submit_image_query(detector=d, image=image, wait=0)

    If the returned result was generated from an ML model, you can see the confidence score returned for the image query:

    print(f"The confidence is {image_query.result.confidence}")
    - - +Higher confidence also requires more labels, which increases labor costs.

    Or if you want to execute submit_image_query as fast as possible, set wait=0. You will either get the ML results or a placeholder response if the ML model hasn't finished executing. Image queries which are below the desired confidence level will still be escalated for further analysis, and the results are incorporated as training data to improve your ML model, but your code will not wait for that to happen.

    image_query = gl.submit_image_query(detector=d, image=image, wait=0)

    If the returned result was generated from an ML model, you can see the confidence score returned for the image query:

    print(f"The confidence is {image_query.result.confidence}")
    + + \ No newline at end of file diff --git a/docs/building-applications/sample-applications.html b/docs/building-applications/sample-applications.html new file mode 100644 index 00000000..f32f68fe --- /dev/null +++ b/docs/building-applications/sample-applications.html @@ -0,0 +1,16 @@ + + + + + +Sample Applications | Groundlight + + + + +
    +

    Sample Applications

    Explore these GitHub repositories to see examples of Groundlight-powered applications:

    Groundlight Stream Processor

    Repository: https://github.com/groundlight/stream

    The Groundlight Stream Processor is an easy-to-use Docker container for analyzing RTSP streams or common USB-based cameras. You can run it with a single Docker command, such as:

    docker run stream:local --help

    Arduino ESP32 Camera Sample App

    Repository: https://github.com/groundlight/esp32cam

    This sample application allows you to build a working AI vision detector using an inexpensive WiFi camera. With a cost of under $10, you can create a powerful and affordable AI vision system.

    Raspberry Pi

    Repository: https://github.com/groundlight/raspberry-pi-door-lock

    This sample application demonstrates how to set up a Raspberry Pi-based door lock system. The application monitors a door and sends a notification if the door is observed to be unlocked during non-standard business hours.

    Industrial and Manufacturing Applications

    Groundlight can be used to apply modern natural-language-based computer vision to industrial and manufacturing applications.

    + + + + \ No newline at end of file diff --git a/docs/building-applications/working-with-detectors.html b/docs/building-applications/working-with-detectors.html index ec09c4f9..1d3a3d6a 100644 --- a/docs/building-applications/working-with-detectors.html +++ b/docs/building-applications/working-with-detectors.html @@ -4,13 +4,13 @@ Working with Detectors | Groundlight - - + +
    -

    Working with Detectors

    Explicitly create a new detector

    Typically you'll use the get_or_create_detector(name: str, query: str) method to find an existing detector you've already created with the same name, or create a new one if it doesn't exists. But if you'd like to force creating a new detector you can also use the create_detector(name: str, query: str) method

    from groundlight import Groundlight

    gl = Groundlight()
    detector = gl.create_detector(name="your_detector_name", query="is this what we want to see?")

    Retrieve an existing detector

    from groundlight import Groundlight

    gl = Groundlight()
    detector = gl.get_detector(id="YOUR_DETECTOR_ID")

    List your detectors

    from groundlight import Groundlight

    gl = Groundlight()
    # Defaults to 10 results per page
    detectors = gl.list_detectors()

    # Pagination: 1st page of 5 results per page
    detectors = gl.list_detectors(page=1, page_size=5)

    Retrieve an image query

    In practice, you may want to check for a new result on your query. For example, after a cloud reviewer labels your query. For example, you can use the image_query.id after the above submit_image_query() call.

    from groundlight import Groundlight

    gl = Groundlight()
    image_query = gl.get_image_query(id="iq_YOUR_IMAGE_QUERY_ID")

    List your previous image queries

    from groundlight import Groundlight

    gl = Groundlight()
    # Defaults to 10 results per page
    image_queries = gl.list_image_queries()

    # Pagination: 1st page of 5 results per page
    image_queries = gl.list_image_queries(page=1, page_size=5)

    Adding labels to existing image queries

    Groundlight lets you start using models by making queries against your very first image, but there are a few situations where you might either have an existing dataset, or you'd like to handle the escalation response programatically in your own code but still include the label to get better responses in the future. With your image_query from either submit_image_query() or get_image_query() you can add the label directly. Note that if the query is already in the escalation queue due to low ML confidence or audit thresholds, it may also receive labels from another source.

    from groundlight import Groundlight
    from PIL import Image
    import requests

    gl = Groundlight()
    d = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")
    image_url= "https://images.selfstorage.com/large-compress/2174925f24362c479b2.jpg"
    image = Image.open(requests.get(image_url, stream=True).raw)
    image_query = gl.submit_image_query(detector=d, image=image)
    gl.add_label(image_query, 'YES') # or 'NO'

    The only valid labels at this time are 'YES' and 'NO'.

    - - +

    Working with Detectors

    Explicitly create a new detector

    Typically you'll use the get_or_create_detector(name: str, query: str) method to find an existing detector you've already created with the same name, or create a new one if it doesn't exists. But if you'd like to force creating a new detector you can also use the create_detector(name: str, query: str) method

    from groundlight import Groundlight

    gl = Groundlight()
    detector = gl.create_detector(name="your_detector_name", query="is this what we want to see?")

    Retrieve an existing detector

    from groundlight import Groundlight

    gl = Groundlight()
    detector = gl.get_detector(id="YOUR_DETECTOR_ID")

    List your detectors

    from groundlight import Groundlight

    gl = Groundlight()
    # Defaults to 10 results per page
    detectors = gl.list_detectors()

    # Pagination: 1st page of 5 results per page
    detectors = gl.list_detectors(page=1, page_size=5)

    Retrieve an image query

    In practice, you may want to check for a new result on your query. For example, after a cloud reviewer labels your query. For example, you can use the image_query.id after the above submit_image_query() call.

    from groundlight import Groundlight

    gl = Groundlight()
    image_query = gl.get_image_query(id="iq_YOUR_IMAGE_QUERY_ID")

    List your previous image queries

    from groundlight import Groundlight

    gl = Groundlight()
    # Defaults to 10 results per page
    image_queries = gl.list_image_queries()

    # Pagination: 1st page of 5 results per page
    image_queries = gl.list_image_queries(page=1, page_size=5)

    Adding labels to existing image queries

    Groundlight lets you start using models by making queries against your very first image, but there are a few situations where you might either have an existing dataset, or you'd like to handle the escalation response programatically in your own code but still include the label to get better responses in the future. With your image_query from either submit_image_query() or get_image_query() you can add the label directly. Note that if the query is already in the escalation queue due to low ML confidence or audit thresholds, it may also receive labels from another source.

    from groundlight import Groundlight
    from PIL import Image
    import requests

    gl = Groundlight()
    d = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")
    image_url= "https://images.selfstorage.com/large-compress/2174925f24362c479b2.jpg"
    image = Image.open(requests.get(image_url, stream=True).raw)
    image_query = gl.submit_image_query(detector=d, image=image)
    gl.add_label(image_query, 'YES') # or 'NO'

    The only valid labels at this time are 'YES' and 'NO'.

    + + \ No newline at end of file diff --git a/docs/getting-started.html b/docs/getting-started.html index 1e1ac784..93671159 100644 --- a/docs/getting-started.html +++ b/docs/getting-started.html @@ -4,15 +4,15 @@ Getting Started | Groundlight - - + +
    -

    Getting Started

    Computer Vision powered by Natural Language

    Build a working computer vision system in just a few lines of python:

    from groundlight import Groundlight

    gl = Groundlight()
    det = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")
    img = "./docs/static/img/doorway.jpg" # Image can be a file or a Python object
    image_query = gl.submit_image_query(detector=det, image=img)
    print(f"The answer is {image_query.result}")

    Note: The SDK is currently in "beta" phase. Interfaces are subject to change in future versions. We will follow semver semantics for breaking changes.

    How does it work?

    Your images are first analyzed by machine learning (ML) models which are automatically trained on your data. If those models have high enough confidence, that's your answer. But if the models are unsure, then the images are progressively escalated to more resource-intensive analysis methods up to real-time human review. So what you get is a computer vision system that starts working right away without even needing to first gather and label a dataset. At first it will operate with high latency, because people need to review the image queries. But over time, the ML systems will learn and improve so queries come back faster with higher confidence.

    Escalation Technology

    Groundlight's Escalation Technology combines the power of generative AI using our Visual LLM, along with the speed of edge computing, and the reliability of real-time human oversight.

    diagram showing escalation technology

    Building a simple visual application

    1. Install the groundlight SDK. Requires python version 3.7 or higher. See prerequisites.

      pip3 install groundlight
    2. Head over to the groundlight web +

      Getting Started

      Computer Vision powered by Natural Language

      Build a working computer vision system in just a few lines of python:

      from groundlight import Groundlight

      gl = Groundlight()
      det = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")
      img = "./docs/static/img/doorway.jpg" # Image can be a file or a Python object
      image_query = gl.submit_image_query(detector=det, image=img)
      print(f"The answer is {image_query.result}")

      Note: The SDK is currently in "beta" phase. Interfaces are subject to change in future versions. We will follow semver semantics for breaking changes.

      How does it work?

      Your images are first analyzed by machine learning (ML) models which are automatically trained on your data. If those models have high enough confidence, that's your answer. But if the models are unsure, then the images are progressively escalated to more resource-intensive analysis methods up to real-time human review. So what you get is a computer vision system that starts working right away without even needing to first gather and label a dataset. At first it will operate with high latency, because people need to review the image queries. But over time, the ML systems will learn and improve so queries come back faster with higher confidence.

      Escalation Technology

      Groundlight's Escalation Technology combines the power of generative AI using our Visual LLM, along with the speed of edge computing, and the reliability of real-time human oversight.

      diagram showing escalation technology

      Building a simple visual application

      1. Install the groundlight SDK. Requires python version 3.7 or higher. See prerequisites.

        pip3 install groundlight
      2. Head over to the groundlight web app to create an API token. You will need to set the GROUNDLIGHT_API_TOKEN environment variable to access the API.

        export GROUNDLIGHT_API_TOKEN=api_2GdXMflhJi6L_example
      3. Create a python script.

        ask.py
        from groundlight import Groundlight

        gl = Groundlight()
        det = gl.get_or_create_detector(name="doorway", query="Is the doorway open?")
        img = "./docs/static/img/doorway.jpg" # Image can be a file or a Python object
        image_query = gl.submit_image_query(detector=det, image=img)
        print(f"The answer is {image_query.result}")
      4. Run it!

        python ask.py
    - - + + \ No newline at end of file diff --git a/docs/getting-started/api-tokens.html b/docs/getting-started/api-tokens.html index 4d418d04..4b7a3549 100644 --- a/docs/getting-started/api-tokens.html +++ b/docs/getting-started/api-tokens.html @@ -4,13 +4,13 @@ API Tokens | Groundlight - - + +
    -

    API Tokens

    About API Tokens

    To use the Groundlight SDK or API, you need a security token which we call an "API Token." These authenticate you to Groundlight and authorize your code to use services in your account.

    API tokens look like api_2GdXMflhJ... and consist of a ksuid (a kind of sortable UUID) followed by a secret string.

    Handling API Tokens

    You should treat API tokens like passwords. Never check them directly into your code or share them. Please use best security practices with your API tokens, because if anybody gets your API token, they have nearly full control over your Groundlight account.

    Here are some best practices for handling API tokens:

    • Store API tokens in a secure location, such as an encrypted vault.
    • Use environment variables to store API tokens, rather than hardcoding them in your application.
    • Limit the number of people who have access to API tokens.
    • Rotate API tokens regularly and revoke old ones when they are no longer needed.

    Using API Tokens with the SDK

    There are a couple of ways the SDK can find your API token:

    1. Environment variable (recommended): As a best practice, we recommend storing API tokens in the environment variable GROUNDLIGHT_API_TOKEN. This helps avoid accidentally committing the token to your code repository. The SDK will automatically look for the API token there, so you don't have to put it in your code at all.
    from groundlight import Groundlight

    # looks for API token in environment variable GROUNDLIGHT_API_TOKEN
    gl = Groundlight()
    1. Constructor argument: Alternatively, you can pass the API token directly to the Groundlight constructor. However, be cautious not to commit this code to your repository.
    from groundlight import Groundlight

    token = get_token_from_secure_location()
    gl = Groundlight(api_token=token)

    Creating and Revoking API Tokens

    You can manage your API tokens from the Groundlight website at https://app.groundlight.ai/reef/my-account/api-tokens.

    Creating API Tokens

    1. Log in to your Groundlight account and navigate to the API tokens page.
    2. Click the "Create New API Token" button.
    3. Give the new token a descriptive name, so you can easily identify it later.
    4. Click "Create Token."
    5. Copy the generated token and store it securely, as you won't be able to see it again. Groundlight does not store a copy of your API tokens.

    Viewing and Revoking API Tokens

    On the API tokens page, you can see a list of your current tokens, along with the following information:

    • Token Name: The descriptive name you assigned when creating the token
    • Snippet (prefix): A short, unique identifier for each token
    • Last used: The date and time the token was last used

    To revoke an API token

    1. Locate the token you want to revoke in the list.
    2. Click the "Delete" button next to the token.
    3. Confirm that you want to revoke the token.

    Note: Revoking an API token will immediately invalidate it and prevent any applications using it from accessing your Groundlight account. Be sure to update your applications with a new token before revoking an old one.

    - - +

    API Tokens

    About API Tokens

    To use the Groundlight SDK or API, you need a security token which we call an "API Token." These authenticate you to Groundlight and authorize your code to use services in your account.

    API tokens look like api_2GdXMflhJ... and consist of a ksuid (a kind of sortable UUID) followed by a secret string.

    Handling API Tokens

    You should treat API tokens like passwords. Never check them directly into your code or share them. Please use best security practices with your API tokens, because if anybody gets your API token, they have nearly full control over your Groundlight account.

    Here are some best practices for handling API tokens:

    • Store API tokens in a secure location, such as an encrypted vault.
    • Use environment variables to store API tokens, rather than hardcoding them in your application.
    • Limit the number of people who have access to API tokens.
    • Rotate API tokens regularly and revoke old ones when they are no longer needed.

    Using API Tokens with the SDK

    There are a couple of ways the SDK can find your API token:

    1. Environment variable (recommended): As a best practice, we recommend storing API tokens in the environment variable GROUNDLIGHT_API_TOKEN. This helps avoid accidentally committing the token to your code repository. The SDK will automatically look for the API token there, so you don't have to put it in your code at all.
    from groundlight import Groundlight

    # looks for API token in environment variable GROUNDLIGHT_API_TOKEN
    gl = Groundlight()
    1. Constructor argument: Alternatively, you can pass the API token directly to the Groundlight constructor. However, be cautious not to commit this code to your repository.
    from groundlight import Groundlight

    token = get_token_from_secure_location()
    gl = Groundlight(api_token=token)

    Creating and Revoking API Tokens

    You can manage your API tokens from the Groundlight website at https://app.groundlight.ai/reef/my-account/api-tokens.

    Creating API Tokens

    1. Log in to your Groundlight account and navigate to the API tokens page.
    2. Click the "Create New API Token" button.
    3. Give the new token a descriptive name, so you can easily identify it later.
    4. Click "Create Token."
    5. Copy the generated token and store it securely, as you won't be able to see it again. Groundlight does not store a copy of your API tokens.

    Viewing and Revoking API Tokens

    On the API tokens page, you can see a list of your current tokens, along with the following information:

    • Token Name: The descriptive name you assigned when creating the token
    • Snippet (prefix): A short, unique identifier for each token
    • Last used: The date and time the token was last used

    To revoke an API token

    1. Locate the token you want to revoke in the list.
    2. Click the "Delete" button next to the token.
    3. Confirm that you want to revoke the token.

    Note: Revoking an API token will immediately invalidate it and prevent any applications using it from accessing your Groundlight account. Be sure to update your applications with a new token before revoking an old one.

    + + \ No newline at end of file diff --git a/docs/getting-started/dog-on-couch.html b/docs/getting-started/dog-on-couch.html index f7101454..d55fef58 100644 --- a/docs/getting-started/dog-on-couch.html +++ b/docs/getting-started/dog-on-couch.html @@ -4,13 +4,13 @@ A Fun Example: Dog-on-Couch Detector | Groundlight - - + +
    -

    A Fun Example: Dog-on-Couch Detector

    Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.

    Requirements

    • Groundlight SDK with Python 3.7 or higher
    • A supported USB or network-connected camera
    • A pre-recorded sound file (e.g., get_off_couch.mp3)
    • A couch and a dog are recommended for proper end-to-end testing.

    Installation

    Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library:

    pip install groundlight opencv-python pillow pyaudio

    Creating the Application

    1. First, log in to the Groundlight application and get an API Token.

    2. Next, we'll write the Python script for the application. Import the required libraries:

    import time
    import cv2
    from groundlight import Groundlight
    from PIL import Image
    import pyaudio
    import wave
    1. Define a function to capture an image from the camera using OpenCV:
    def capture_image():
    cap = cv2.VideoCapture(0)

    ret, frame = cap.read()
    cap.release()

    if ret:
    # Convert to PIL image
    return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    else:
    return None
    1. Define a function to play the pre-recorded sound:
    def play_sound(file_path):
    CHUNK = 1024
    wf = wave.open(file_path, 'rb')

    p = pyaudio.PyAudio()

    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
    channels=wf.getnchannels(),
    rate=wf.getframerate(),
    output=True)

    data = wf.readframes(CHUNK)

    while data:
    stream.write(data)
    data = wf.readframes(CHUNK)

    stream.stop_stream()
    stream.close()

    p.terminate()
    1. Write the main application loop:
    gl = Groundlight()

    detector = gl.get_detector("Dog on Couch Detector")

    while True:
    image = capture_image()
    if image:
    try:
    iq = gl.submit_image_query(image=image, detector=detector, wait=60)
    answer = iq.result.label
    if answer == "YES":
    print("Dog detected on the couch!")
    play_sound("get_off_couch.mp3")
    except Exception as e:
    print(f"Error submitting image query: {e}")
    else:
    print("Failed to capture image")

    # Sleep for a minute before checking again
    time.sleep(60)

    This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If the dog is detected on the couch, it plays the pre-recorded sound using the play_sound function.

    Save the script as dog_on_couch_detector.py and run it:

    python dog_on_couch_detector.py
    - - +

    A Fun Example: Dog-on-Couch Detector

    Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.

    Requirements

    • Groundlight SDK with Python 3.7 or higher
    • A supported USB or network-connected camera
    • A pre-recorded sound file (e.g., get_off_couch.mp3)
    • A couch and a dog are recommended for proper end-to-end testing.

    Installation

    Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library:

    pip install groundlight opencv-python pillow pyaudio

    Creating the Application

    1. First, log in to the Groundlight application and get an API Token.

    2. Next, we'll write the Python script for the application. Import the required libraries:

    import time
    import cv2
    from groundlight import Groundlight
    from PIL import Image
    import pyaudio
    import wave
    1. Define a function to capture an image from the camera using OpenCV:
    def capture_image():
    cap = cv2.VideoCapture(0)

    ret, frame = cap.read()
    cap.release()

    if ret:
    # Convert to PIL image
    return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    else:
    return None
    1. Define a function to play the pre-recorded sound:
    def play_sound(file_path):
    CHUNK = 1024
    wf = wave.open(file_path, 'rb')

    p = pyaudio.PyAudio()

    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
    channels=wf.getnchannels(),
    rate=wf.getframerate(),
    output=True)

    data = wf.readframes(CHUNK)

    while data:
    stream.write(data)
    data = wf.readframes(CHUNK)

    stream.stop_stream()
    stream.close()

    p.terminate()
    1. Write the main application loop:
    gl = Groundlight()

    detector = gl.get_detector("Dog on Couch Detector")

    while True:
    image = capture_image()
    if image:
    try:
    iq = gl.submit_image_query(image=image, detector=detector, wait=60)
    answer = iq.result.label
    if answer == "YES":
    print("Dog detected on the couch!")
    play_sound("get_off_couch.mp3")
    except Exception as e:
    print(f"Error submitting image query: {e}")
    else:
    print("Failed to capture image")

    # Sleep for a minute before checking again
    time.sleep(60)

    This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If the dog is detected on the couch, it plays the pre-recorded sound using the play_sound function.

    Save the script as dog_on_couch_detector.py and run it:

    python dog_on_couch_detector.py
    + + \ No newline at end of file diff --git a/docs/getting-started/retail-analytics.html b/docs/getting-started/retail-analytics.html index 729673ec..9d42b2a2 100644 --- a/docs/getting-started/retail-analytics.html +++ b/docs/getting-started/retail-analytics.html @@ -4,13 +4,13 @@ A Serious Example: Retail Analytics | Groundlight - - + +
    -

    A Serious Example: Retail Analytics

    Tracking utilization of a customer service counter

    This example demonstrates the application of Groundlight to a retail analytics solution, which monitors the usage of a service counter by customers throughout the day. The application creates a detector to identify when the service desk is being utilized by a customer. It checks the detector every minute, and once an hour, it prints out a summary of the percentage of time that the service counter is in use. At the end of the day, it emails the daily log.

    This retail analytics application can be beneficial in various ways:

    1. Staff allocation and scheduling: By analyzing the usage patterns of the service counter, store managers can optimize staff allocation and scheduling, ensuring that enough employees are available during peak hours and reducing wait times for customers.

    2. Identifying trends: The application can help identify trends in customer behavior, such as busier times of the day or specific days of the week with higher traffic. This information can be used to plan targeted marketing campaigns or promotions to increase sales and customer engagement.

    3. Improving store layout: Understanding when and how often customers use the service counter can provide insights into the effectiveness of the store's layout. Retailers can use this information to make data-driven decisions about rearranging the store layout to encourage customers to visit the service counter or explore other areas of the store.

    4. Customer satisfaction: By monitoring the usage of the service counter and proactively addressing long wait times or crowded areas, retailers can improve customer satisfaction and loyalty. A positive customer experience can lead to increased sales and return visits.

    To implement this retail analytics solution, a store would need to install a supported camera near the service counter, ensuring a clear view of the area. The camera would then be connected to a computer running the Groundlight-based application. Store managers would receive hourly summaries of the service counter usage and a daily log via email, enabling them to make informed decisions to improve store operations and customer experience.

    Requirements

    • Groundlight SDK with Python 3.7 or higher
    • A supported USB or network-connected camera
    • An email account with SMTP access to send the daily log

    Installation

    Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK, OpenCV library, and other required libraries:

    pip install groundlight opencv-python pillow

    Creating the Application

    1. First, log in to the Groundlight application and get an API Token.

    2. Next, we'll write the Python script for the application. Import the required libraries:

    import time
    import cv2
    import smtplib
    from groundlight import Groundlight
    from PIL import Image
    from datetime import datetime, timedelta
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    1. Define a function to capture an image from the camera using OpenCV:
    def capture_image():
    cap = cv2.VideoCapture(0)

    ret, frame = cap.read()
    cap.release()

    if ret:
    # Convert to PIL image
    return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    else:
    return None
    1. Define a function to send the daily log via email. You will need to customize this for your particular network environment.
    def send_email(sender, receiver, subject, body):
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    server = smtplib.SMTP('smtp.example.com', 587)
    server.starttls()
    server.login(sender, "your-password")
    text = msg.as_string()
    server.sendmail(sender, receiver, text)
    server.quit()
    1. Define when your business's operating hours are:
    START_OF_BUSINESS = 9  # e.g. 9am
    END_OF_BUSINESS = 17 # e.g. 5pm

    def is_within_business_hours():
    current_hour = datetime.now().hour
    return START_OF_BUSINESS <= current_hour < END_OF_BUSINESS

    1. Write the main application loop:
    gl = Groundlight()

    detector = gl.get_or_create_detector(
    name="counter-in-use",
    query="Is there a customer at the service counter?",
    # We can get away with relatively low confidence since we're aggregating
    confidence_threshold=0.8)

    DELAY = 60

    log = []
    daily_log = []
    next_hourly_start = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)

    while True:
    if not is_within_business_hours():
    time.sleep(DELAY)
    continue

    image = capture_image()
    if not image:
    print("Failed to capture image")
    time.sleep(DELAY)
    continue

    try:
    iq = gl.submit_image_query(image=image, detector=detector, wait=60)
    except Exception as e:
    print(f"Error submitting image query: {e}")
    time.sleep(DELAY)
    continue

    answer = iq.result.label
    log.append(answer)

    if datetime.now() >= next_hourly_start:
    next_hourly_start += timedelta(hours=1)

    percent_in_use = (log.count("YES") / len(log)) * 100
    current_time = datetime.now().replace(hour=START_OF_BUSINESS, minute=0, second=0)
    formatted_time = current_time.strftime("%I%p") # like 3pm
    msg = f"Hourly summary for {formatted_time}: {percent_in_use:.0f}% counter in use"
    print(msg)
    daily_log.append(msg)
    log = []

    current_hour = datetime.now().hour
    if current_hour == END_OF_BUSINESS and not daily_log == []:
    daily_summary = "Daily summary:\n"
    for msg in daily_log:
    daily_summary += f"{msg}\n"

    print(daily_summary)
    send_email(sender="counterbot@example.com",
    receiver="manager@example.com",
    subject="Daily Service Counter Usage Log",
    body=daily_summary)
    daily_log = []

    time.sleep(DELAY)

    This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If a customer is detected at the counter, it logs the event. Every hour, it prints a summary of the counter's usage percentage, and at the end of the day, it emails the daily log using the send_email function.

    Save the script as service_counter_monitor.py and run it:

    python service_counter_monitor.py
    - - +

    A Serious Example: Retail Analytics

    Tracking utilization of a customer service counter

    This example demonstrates the application of Groundlight to a retail analytics solution, which monitors the usage of a service counter by customers throughout the day. The application creates a detector to identify when the service desk is being utilized by a customer. It checks the detector every minute, and once an hour, it prints out a summary of the percentage of time that the service counter is in use. At the end of the day, it emails the daily log.

    This retail analytics application can be beneficial in various ways:

    1. Staff allocation and scheduling: By analyzing the usage patterns of the service counter, store managers can optimize staff allocation and scheduling, ensuring that enough employees are available during peak hours and reducing wait times for customers.

    2. Identifying trends: The application can help identify trends in customer behavior, such as busier times of the day or specific days of the week with higher traffic. This information can be used to plan targeted marketing campaigns or promotions to increase sales and customer engagement.

    3. Improving store layout: Understanding when and how often customers use the service counter can provide insights into the effectiveness of the store's layout. Retailers can use this information to make data-driven decisions about rearranging the store layout to encourage customers to visit the service counter or explore other areas of the store.

    4. Customer satisfaction: By monitoring the usage of the service counter and proactively addressing long wait times or crowded areas, retailers can improve customer satisfaction and loyalty. A positive customer experience can lead to increased sales and return visits.

    To implement this retail analytics solution, a store would need to install a supported camera near the service counter, ensuring a clear view of the area. The camera would then be connected to a computer running the Groundlight-based application. Store managers would receive hourly summaries of the service counter usage and a daily log via email, enabling them to make informed decisions to improve store operations and customer experience.

    Requirements

    • Groundlight SDK with Python 3.7 or higher
    • A supported USB or network-connected camera
    • An email account with SMTP access to send the daily log

    Installation

    Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK, OpenCV library, and other required libraries:

    pip install groundlight opencv-python pillow

    Creating the Application

    1. First, log in to the Groundlight application and get an API Token.

    2. Next, we'll write the Python script for the application. Import the required libraries:

    import time
    import cv2
    import smtplib
    from groundlight import Groundlight
    from PIL import Image
    from datetime import datetime, timedelta
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    1. Define a function to capture an image from the camera using OpenCV:
    def capture_image():
    cap = cv2.VideoCapture(0)

    ret, frame = cap.read()
    cap.release()

    if ret:
    # Convert to PIL image
    return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    else:
    return None
    1. Define a function to send the daily log via email. You will need to customize this for your particular network environment.
    def send_email(sender, receiver, subject, body):
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    server = smtplib.SMTP('smtp.example.com', 587)
    server.starttls()
    server.login(sender, "your-password")
    text = msg.as_string()
    server.sendmail(sender, receiver, text)
    server.quit()
    1. Define when your business's operating hours are:
    START_OF_BUSINESS = 9  # e.g. 9am
    END_OF_BUSINESS = 17 # e.g. 5pm

    def is_within_business_hours():
    current_hour = datetime.now().hour
    return START_OF_BUSINESS <= current_hour < END_OF_BUSINESS

    1. Write the main application loop:
    gl = Groundlight()

    detector = gl.get_or_create_detector(
    name="counter-in-use",
    query="Is there a customer at the service counter?",
    # We can get away with relatively low confidence since we're aggregating
    confidence_threshold=0.8)

    DELAY = 60

    log = []
    daily_log = []
    next_hourly_start = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)

    while True:
    if not is_within_business_hours():
    time.sleep(DELAY)
    continue

    image = capture_image()
    if not image:
    print("Failed to capture image")
    time.sleep(DELAY)
    continue

    try:
    iq = gl.submit_image_query(image=image, detector=detector, wait=60)
    except Exception as e:
    print(f"Error submitting image query: {e}")
    time.sleep(DELAY)
    continue

    answer = iq.result.label
    log.append(answer)

    if datetime.now() >= next_hourly_start:
    next_hourly_start += timedelta(hours=1)

    percent_in_use = (log.count("YES") / len(log)) * 100
    current_time = datetime.now().replace(hour=START_OF_BUSINESS, minute=0, second=0)
    formatted_time = current_time.strftime("%I%p") # like 3pm
    msg = f"Hourly summary for {formatted_time}: {percent_in_use:.0f}% counter in use"
    print(msg)
    daily_log.append(msg)
    log = []

    current_hour = datetime.now().hour
    if current_hour == END_OF_BUSINESS and not daily_log == []:
    daily_summary = "Daily summary:\n"
    for msg in daily_log:
    daily_summary += f"{msg}\n"

    print(daily_summary)
    send_email(sender="counterbot@example.com",
    receiver="manager@example.com",
    subject="Daily Service Counter Usage Log",
    body=daily_summary)
    daily_log = []

    time.sleep(DELAY)

    This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If a customer is detected at the counter, it logs the event. Every hour, it prints a summary of the counter's usage percentage, and at the end of the day, it emails the daily log using the send_email function.

    Save the script as service_counter_monitor.py and run it:

    python service_counter_monitor.py
    + + \ No newline at end of file diff --git a/docs/getting-started/streaming.html b/docs/getting-started/streaming.html new file mode 100644 index 00000000..91bb660f --- /dev/null +++ b/docs/getting-started/streaming.html @@ -0,0 +1,16 @@ + + + + + +A Quick Example: Live Stream Alert | Groundlight + + + + +
    +

    A Quick Example: Live Stream Alert

    A quick example to get used to setting up detectors and asking good questions: set up a monitor on a live stream.

    Requirements

    • Groundlight SDK with Python 3.7 or higher
    • The video ID of a YouTube live stream you'd like to monitor

    Installation

    Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library:

    pip install groundlight pillow ffmpeg yt-dlp typer

    Creating the Application

    1. Save this command as a shell script get_latest_frame.sh:
    #!/bin/bash

    ffmpeg -i "$(yt-dlp -g $1 | head -n 1)" -vframes 1 last.jpg -y

    This will download the most recent frame from a YouTube live stream and save it to a local file last.jpg.

    1. Log in to the Groundlight application and get an API Token.

    2. Next, we'll write the Python script for the application.

    import os
    import subprocess
    import typer
    from groundlight import Groundlight
    from PIL import Image


    def main(*, video_id: str = None, detector_name: str = None, query: str = None, confidence: float = 0.75, wait: int = 60):
    """
    Run the script to get the stream's last frame as a subprocess, and submit result as an image query to a Groundlight detector
    :param video_id: Video ID of the YouTube live stream (the URLs have the form https://www.youtube.com/watch?v=<VIDEO_ID>)
    :param detector_name: Name for your Groundlight detector
    :param query: Question you want to ask of the stream (we will alert on the answer of NO)
    """
    gl = Groundlight()
    detector = gl.create_detector(name=detector_name, query=query, confidence_threshold=confidence)

    while True:
    p = subprocess.run(["./get_latest_frame.sh", video_id])
    if p.returncode != 0:
    raise RuntimeError(f"Could not get image from video ID: {video_id}. Process exited with return code {p.returncode}.")

    image = Image.open("last.jpg").convert("RGB")
    response = gl.submit_image_query(detector=detector, image=image, wait=wait)

    if response.result.label == "NO":
    os.system("say 'Alert!'") # this may not work on all operating systems


    if __name__ == "__main__":
    typer.run(main)

    1. Save the script as streaming_alert.py in the same directory as get_latest_frame.sh above and run it:
    python streaming_alert.py <VIDEO_ID> --detector_name <DETECTOR_NAME> --query <QUERY IN QUOTATION MARKS>
    + + + + \ No newline at end of file diff --git a/docs/getting-started/writing-queries.html b/docs/getting-started/writing-queries.html index 8324e79e..a2b26047 100644 --- a/docs/getting-started/writing-queries.html +++ b/docs/getting-started/writing-queries.html @@ -4,12 +4,12 @@ Writing Queries | Groundlight - - + +
    -

    Writing Queries

    Introduction

    With Groundlight's detectors, you can ask binary questions about images i.e., the answer +

    Writing Queries

    Introduction

    With Groundlight's detectors, you can ask binary questions about images i.e., the answer should be unambiguously "YES" or "NO". If you ask an ambiguous question, you may receive an "UNSURE" response.

    detector = gl.get_or_create_detector(
    name="Conveyor belt boxes",
    query="Are there any cardboard boxes on the conveyor belt?"
    )
    image_query = gl.submit_image_query(detector=detector, image=some_image)

    # The SDK can return "YES" or "NO" (or "UNSURE")
    print(f"The answer is {image_query.result.label}")

    So, what makes a good question? Let's look at a few good ✅, moderate 🟡, and bad ❌ examples!

    Examples

    ✅ Are there any cardboard boxes on the conveyor belt?

    This question is binary and can be answered unambiguously with a simple "YES" or "NO" based on the image content.

    🟡 Is the trash can full?

    This question is okay, but it could be rephrased to be more specific. For example, "Is the black @@ -20,7 +20,7 @@ is nice weather. Instead, you might ask "Can you see any clouds in the sky?"

    ❌ Where is the thing?

    This is not a binary question "YES" and "NO" don't make sense in this context. Also, it's not clear what the "thing" refers to.

    🟡 Is the factory floor clean and organized?

    While this question is binary, "cleanliness" can be somewhat subjective. An improved version could be: "Are there any visible spills or clutter on the factory floor?"

    - - + + \ No newline at end of file diff --git a/docs/installation.html b/docs/installation.html index 6b21d372..4acd5ff6 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -4,13 +4,13 @@ Installation | Groundlight - - + +

    Installation

    Welcome to the Groundlight SDK installation guide. In this guide, you'll find step-by-step instructions on how to install and set up the Groundlight SDK on various platforms.

    Platform-specific Installation Guides

    Choose your platform from the list below and follow the instructions in the corresponding guide:

    After completing the installation process for your platform, you'll be ready to start building visual applications using the Groundlight SDK.

    - - + + \ No newline at end of file diff --git a/docs/installation/linux.html b/docs/installation/linux.html index a966e2b0..41e799a6 100644 --- a/docs/installation/linux.html +++ b/docs/installation/linux.html @@ -4,13 +4,13 @@ Installing on Linux | Groundlight - - + +

    Installing on Linux

    This guide will help you install the Groundlight SDK on Linux. The Groundlight SDK requires Python 3.7 or higher.

    Prerequisites

    Ensure that you have the following installed on your system:

    • Python 3.7 or higher
    • pip (Python package installer)

    Basic Installation

    Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:

    Installing Groundlight SDK

    To install the Groundlight SDK using pip, run the following command in your terminal:

    pip install groundlight

    If you're also using python2 on your system, you might need to use pip3 instead:

    pip3 install groundlight

    The Groundlight SDK is now installed and ready for use.

    Checking Groundlight SDK Version

    To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner:

    python -c "import groundlight; print(groundlight.__version__)"

    Upgrading Groundlight SDK

    If you need to upgrade the Groundlight SDK to the latest version, use the following pip command:

    pip install --upgrade groundlight

    Or, if you're using pip3:

    pip3 install --upgrade groundlight

    After upgrading, you can use the Python one-liner mentioned in the "Checking Groundlight SDK Version" section to verify that the latest version is now installed.

    Getting the right Python Version

    To check your installed Python version, open a terminal and run:

    python --version

    If you see a version number starting with "3.7" or higher (e.g., "3.7.5" or "3.9.0"), you're good to go. If not, you might need to upgrade Python on your system.

    Upgrading Python on Linux

    Use your distribution's package manager to install the latest Python version:

    • For Ubuntu or Debian-based systems:

      sudo apt update
      sudo apt install python3

      (For Ubuntu 18.04 see note below.)

    • For Fedora-based systems:

      sudo dnf install python3
    • For Arch Linux:

      sudo pacman -S python

    After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.

    Special note about Ubuntu 18.04

    Ubuntu 18.04 still uses python 3.6 by default, which is end-of-life. We generally recommend using python 3.10. If you know how to install py3.10, please go ahead. But the easiest version of python 3 to use with Ubuntu 18.04 is python 3.8, which can be installed as follows without adding any extra repositories:

    # Prepare Ubuntu to install things
    sudo apt-get update
    # Install the basics
    sudo apt-get install -y python3.8 python3.8-distutils curl
    # Configure `python3` to run python3.8 by default
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 10
    # Download and install pip3.8
    curl https://bootstrap.pypa.io/get-pip.py > /tmp/get-pip.py
    sudo python3.8 /tmp/get-pip.py
    # Configure `pip3` to run pip3.8
    sudo update-alternatives --install /usr/bin/pip3 pip3 $(which pip3.8) 10
    # Now we can install Groundlight!
    pip3 install groundlight

    Ready to go!

    You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.

    - - + + \ No newline at end of file diff --git a/docs/installation/macos.html b/docs/installation/macos.html index 76d457db..f0f6165c 100644 --- a/docs/installation/macos.html +++ b/docs/installation/macos.html @@ -4,13 +4,13 @@ Installing on macOS | Groundlight - - + +

    Installing on macOS

    This guide will help you install the Groundlight SDK on macOS. The Groundlight SDK requires Python 3.7 or higher.

    Prerequisites

    Ensure that you have the following installed on your system:

    • Python 3.7 or higher
    • pip (Python package installer)

    Basic Installation

    Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:

    Installing Groundlight SDK

    To install the Groundlight SDK using pip, run the following command in your terminal:

    pip install groundlight

    If you're also using python2 on your system, you might need to use pip3 instead:

    pip3 install groundlight

    The Groundlight SDK is now installed and ready for use.

    Checking Groundlight SDK Version

    To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner:

    python -c "import groundlight; print(groundlight.__version__)"

    Upgrading Groundlight SDK

    If you need to upgrade the Groundlight SDK to the latest version, use the following pip command:

    pip install --upgrade groundlight

    Or, if you're using pip3:

    pip3 install --upgrade groundlight

    After upgrading, you can use the Python one-liner mentioned in the "Checking Groundlight SDK Version" section to verify that the latest version is now installed.

    Getting the right Python Version

    To check your installed Python version, open a terminal and run:

    python --version

    If you see a version number starting with "3.7" or higher (e.g., "3.7.5" or "3.9.0"), you're good to go. If not, you might need to upgrade Python on your system.

    Upgrading Python on MacOS

    Download the latest Python installer from the official Python website and run it, or use Homebrew to install Python:

    brew install python

    After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.

    Ready to go!

    You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.

    - - + + \ No newline at end of file diff --git a/docs/installation/monitoring-notification-server.html b/docs/installation/monitoring-notification-server.html index 21c8aa99..afdf24ce 100644 --- a/docs/installation/monitoring-notification-server.html +++ b/docs/installation/monitoring-notification-server.html @@ -4,13 +4,13 @@ Monitoring Notification Server | Groundlight - - + +

    Monitoring Notification Server

    This is the easiest way to deploy your Groundlight detectors on a linux computer. All configuration is done through a web user interface, and no code development is required.

    Prerequisites

    1. Internet connected linux computer
    2. Video source (USB camera or RTSP stream)
    3. Groundlight API Key (available from groundlight.ai)

    Deployment

    1. Install Docker on your computer. See Docker's installation instructions.
    2. Create a new file called docker-compose.yml in your project directory. Copy the following into it:
    services:
    frontend:
    image: docker.io/groundlight/monitoring-notification-server-frontend:latest
    ports:
    - "3000:3000"
    depends_on:
    - backend
    backend:
    image: docker.io/groundlight/monitoring-notification-server-backend:latest
    ports:
    - "8000:8000"
    devices:
    - /dev/video0:/dev/video0
    - /dev/video1:/dev/video1
    - /dev/video2:/dev/video2
    - /dev/video3:/dev/video3
    privileged: true
    volumes:
    - /dev/bus/usb:/dev/bus/usb
    1. Run the following command in your project directory:
    docker-compose up
    1. If installed locally, open http://localhost:3000 in your browser. If installed on a remote device, replace localhost with the IP address of your device. You should see the following page:

    Screenshot of the Groundlight Monitoring Notification Server

    - - + + \ No newline at end of file diff --git a/docs/installation/nvidia-jetson.html b/docs/installation/nvidia-jetson.html index b553fecb..d81ad333 100644 --- a/docs/installation/nvidia-jetson.html +++ b/docs/installation/nvidia-jetson.html @@ -4,13 +4,13 @@ Installing on NVIDIA Jetson | Groundlight - - + +

    Installing on NVIDIA Jetson

    This guide will help you install the Groundlight SDK on NVIDIA Jetson devices. The Groundlight SDK requires Python 3.7 or higher.

    Prerequisites

    Ensure that you have the following installed on your NVIDIA Jetson:

    • Python 3.7 or higher
    • pip (Python package installer)

    Basic Installation

    Assuming you have Python 3.7 or higher installed on your NVIDIA Jetson, you can proceed with the following steps to install or upgrade the Groundlight SDK:

    Installing Groundlight SDK

    To install the Groundlight SDK using pip, run the following command in your terminal:

    pip3 install groundlight

    An ARM-compatible version will automatically get installed. The Groundlight SDK is now installed and ready for use.

    Using RTSP Streams

    If you have docker installed on your NVIDIA Jetson, you can even just run

    docker run groundlight/stream

    as we publish an ARM version of our streaming application to Docker Hub.

    Sample application

    For a complete end-to-end example of running on an NVIDIA Jetson, see this GitHub repo.

    Ready to go!

    You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and [Building Applications

    - - + + \ No newline at end of file diff --git a/docs/installation/optional-libraries.html b/docs/installation/optional-libraries.html index 2ea9951f..2b8a8a07 100644 --- a/docs/installation/optional-libraries.html +++ b/docs/installation/optional-libraries.html @@ -4,8 +4,8 @@ Optional libraries | Groundlight - - + +
    @@ -14,7 +14,7 @@ and will make use of them if they're present. If not, we'll gracefully degrade, and tell you what's wrong if you try to use these features.

    PIL - optional but default installed

    The PIL library offers a bunch of standard utilities for working with images in python. The Groundlight SDK can work without PIL.

    Because PIL is not very large, and is quite useful, we install it by default with the normal build of the Groundlight SDK. So when you

    pip3 install groundlight

    it comes with the pillow version of the PIL library already installed.

    Working without PIL

    If you are extremely space constrained, you can install the Groundlight SDK from source without PIL and it will work properly, but with reduced functionality. Specifically, you will need to convert your images into JPEG format yourself. The SDK normally relies on PIL to do JPEG compression (which is a non-trivial algorithm), and the API requires images to be in JPEG format. However on space-constrained platforms, sometimes this conversion is done in hardware, and so we don't want to force you to install PIL if you don't need it.

    Numpy, OpenCV - fully optional

    These commonly-used libraries are not installed by default, because they are quite large, and their installation can often cause conflicts with other dependent libraries. If you want to use them, install them directly.

    - - + + \ No newline at end of file diff --git a/docs/installation/raspberry-pi.html b/docs/installation/raspberry-pi.html index 4f4ca862..0156fc5f 100644 --- a/docs/installation/raspberry-pi.html +++ b/docs/installation/raspberry-pi.html @@ -4,13 +4,13 @@ Installing on Raspberry Pi | Groundlight - - + +

    Installing on Raspberry Pi

    This guide will help you install the Groundlight SDK on Raspberry Pi. The Groundlight SDK requires Python 3.7 or higher.

    Prerequisites

    Ensure that you have the following installed on your Raspberry Pi:

    • Python 3.7 or higher
    • pip (Python package installer)

    Basic Installation

    Assuming you have Python 3.7 or higher installed on your Raspberry Pi, you can proceed with the following steps to install or upgrade the Groundlight SDK:

    Installing Groundlight SDK

    To install the Groundlight SDK using pip, run the following command in your terminal:

    pip3 install groundlight

    An ARM-compatible version will automatically get installed. The Groundlight SDK is now installed and ready for use.

    Using RTSP Streams

    If you have docker installed on your Raspberry Pi, you can even just run

    docker run groundlight/stream

    as we publish an ARM version of our streaming application to Docker Hub.

    Sample application

    For a complete end-to-end example of running on a Raspberry Pi, see this GitHub repo.

    Ready to go!

    You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.

    - - + + \ No newline at end of file diff --git a/docs/installation/windows.html b/docs/installation/windows.html index 01f08af4..3199c5d8 100644 --- a/docs/installation/windows.html +++ b/docs/installation/windows.html @@ -4,13 +4,13 @@ Installing on Windows | Groundlight - - + +

    Installing on Windows

    This guide will help you install the Groundlight SDK on Windows. The Groundlight SDK requires Python 3.7 or higher.

    Prerequisites

    Ensure that you have the following installed on your system:

    • Python 3.7 or higher
    • pip (Python package installer)

    Basic Installation

    Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:

    Installing Groundlight SDK

    To install the Groundlight SDK using pip, run the following command in your Command Prompt:

    pip install groundlight

    If you're also using python2 on your system, you might need to use pip3 instead:

    pip3 install groundlight

    The Groundlight SDK is now installed and ready for use.

    Checking Groundlight SDK Version

    To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner:

    python -c "import groundlight; print(groundlight.__version__)"

    Upgrading Groundlight SDK

    If you need to upgrade the Groundlight SDK to the latest version, use the following pip command:

    pip install --upgrade groundlight

    Or, if you're using pip3:

    pip3 install --upgrade groundlight

    After upgrading, you can use the Python one-liner mentioned in the "Checking Groundlight SDK Version" section to verify that the latest version is now installed.

    Getting the right Python Version

    To check your installed Python version, open a Command Prompt and run:

    python --version

    If you see a version number starting with "3.7" or higher (e.g., "3.7.5" or "3.9.0"), you're good to go. If not, you might need to upgrade Python on your system.

    Upgrading Python on Windows

    Download the latest Python installer from the official Python website and run it.

    After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.

    Ready to go!

    You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.

    - - + + \ No newline at end of file diff --git a/docs/iot.html b/docs/iot.html index 4d766ea9..48581a0f 100644 --- a/docs/iot.html +++ b/docs/iot.html @@ -4,13 +4,13 @@ Setting up an ESP32 Camera Board | Groundlight - - + +

    No-Code IoT Deployment

    Groundlight supplies a tool for no-code deployment of a detector to an ESP32 Camera board. You can find it at https://iot.groundlight.ai/espcam.

    Easy Deployment

    This tool is designed to make it as easy as possible to deploy your Groundlight detector on an ESP32 Camera Board. You can deploy your detector in just a few clicks.

    1. Go to https://iot.groundlight.ai/espcam
    2. Plug your ESP32 Camera Board into your computer with a USB cable.
    3. Click through the steps to upload your detector to your ESP32 Camera Board.
    4. When prompted, allow your browser access to the serial port, so that it can program the device.
    Dialog box in browser asking for serial port access

    If you don't see a prompt like this, try using a current version of Chrome or another browser that supports Web Serial.

    Notification Options

    The tool supports the following notification options for your deployed detector:

    • Email
    • SMS (With Twilio)
    • Slack

    Multiple Supported Boards

    Tested with the following boards. Many other ESP32 boards should work as well, but may require building the firmware from source and changing the IO pin definitions.

    Example bannerExample bannerExample bannerExample banner

    Source Code

    The source code is written as an Arduino-based PlatformIO project for ESP32, and is available on GitHub at https://github.com/groundlight/esp32cam

    If you need assistance or have questions about integrating Groundlight with Arduino, please consider opening an issue on the GitHub repository or reaching out to our support team.

    - - + + \ No newline at end of file diff --git a/index.html b/index.html index bdc7da72..470792f4 100644 --- a/index.html +++ b/index.html @@ -4,13 +4,13 @@ Groundlight | Groundlight - - + +

    Groundlight

    Computer Vision powered by Natural Language

    Instant Models

    Groundlight's Visual LLM creates computer vision models from English instructions instead of a dataset. This reduces the time to get an AI-driven solution off the ground. Did we mention you don't need a dataset?

    Human Reliability

    Groundlight's models are allowed to say they're "Unsure" and can escalate to a larger model or human expert for assistance. By knowing what they know, Groundlight's models act more robust, combining the speed of AI with the reliability of human oversight.

    Seamless MLOps

    Because Groundlight starts with humans-in-the-loop (HITL), continuous monitoring and auditing are automatic. Any data drift is automatically detected and corrected for. So you know your visual applications won't fall behind as the world around them inevitably changes.

    - - + + \ No newline at end of file diff --git a/markdown-page.html b/markdown-page.html index fff55a34..aa2b7319 100644 --- a/markdown-page.html +++ b/markdown-page.html @@ -4,13 +4,13 @@ Markdown page example | Groundlight - - + +

    Markdown page example

    You don't need React to write simple standalone pages.

    - - + + \ No newline at end of file diff --git a/search-index.json b/search-index.json index 8f7d5da3..44100dcc 100644 --- a/search-index.json +++ b/search-index.json @@ -1 +1 @@ -[{"documents":[{"i":1,"t":"","u":"/python-sdk/docs/api-reference","b":["Docs"]},{"i":2,"t":"Building Applications","u":"/python-sdk/docs/building-applications","b":["Docs","Building Applications"]},{"i":16,"t":"Asynchronous Queries","u":"/python-sdk/docs/building-applications/async-queries","b":["Docs","Building Applications"]},{"i":24,"t":"Using Groundlight on the Edge","u":"/python-sdk/docs/building-applications/edge","b":["Docs","Building Applications"]},{"i":30,"t":"Grabbing Images","u":"/python-sdk/docs/building-applications/grabbing-images","b":["Docs","Building Applications"]},{"i":42,"t":"Handling Server Errors","u":"/python-sdk/docs/building-applications/handling-errors","b":["Docs","Building Applications"]},{"i":60,"t":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications/industrial","b":["Docs","Building Applications"]},{"i":72,"t":"Confidence Levels","u":"/python-sdk/docs/building-applications/managing-confidence","b":["Docs","Building Applications"]},{"i":74,"t":"Working with Detectors","u":"/python-sdk/docs/building-applications/working-with-detectors","b":["Docs","Building Applications"]},{"i":87,"t":"Getting Started","u":"/python-sdk/docs/getting-started","b":["Docs","Getting Started"]},{"i":96,"t":"API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","b":["Docs","Getting Started"]},{"i":111,"t":"A Fun Example: Dog-on-Couch Detector","u":"/python-sdk/docs/getting-started/dog-on-couch","b":["Docs","Getting Started"]},{"i":119,"t":"A Serious Example: Retail Analytics","u":"/python-sdk/docs/getting-started/retail-analytics","b":["Docs","Getting Started"]},{"i":128,"t":"Writing Queries","u":"/python-sdk/docs/getting-started/writing-queries","b":["Docs","Getting Started"]},{"i":144,"t":"Installation","u":"/python-sdk/docs/installation","b":["Docs","Installation"]},{"i":148,"t":"Installing on Linux","u":"/python-sdk/docs/installation/linux","b":["Docs","Installation"]},{"i":168,"t":"Installing on macOS","u":"/python-sdk/docs/installation/macos","b":["Docs","Installation"]},{"i":186,"t":"Monitoring Notification Server","u":"/python-sdk/docs/installation/monitoring-notification-server","b":["Docs","Installation"]},{"i":192,"t":"Installing on NVIDIA Jetson","u":"/python-sdk/docs/installation/nvidia-jetson","b":["Docs","Installation"]},{"i":206,"t":"Optional libraries","u":"/python-sdk/docs/installation/optional-libraries","b":["Docs","Installation"]},{"i":215,"t":"Installing on Raspberry Pi","u":"/python-sdk/docs/installation/raspberry-pi","b":["Docs","Installation"]},{"i":229,"t":"Installing on Windows","u":"/python-sdk/docs/installation/windows","b":["Docs","Installation"]},{"i":247,"t":"No-Code IoT Deployment","u":"/python-sdk/docs/iot","b":["Docs"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[]],["t/2",[0,2.972,1,2.424]],["t/16",[2,2.972,3,2.424]],["t/24",[4,2.511,5,2.511,6,2.511]],["t/30",[7,2.972,8,2.972]],["t/42",[9,2.511,10,2.048,11,2.511]],["t/60",[1,2.048,12,2.511,13,2.511]],["t/72",[14,2.972,15,2.972]],["t/74",[16,2.972,17,2.972]],["t/87",[18,2.972,19,2.972]],["t/96",[20,2.972,21,2.972]],["t/111",[22,1.917,23,1.564,24,1.917,25,1.917,26,1.917]],["t/119",[23,1.774,27,2.174,28,2.174,29,2.174]],["t/128",[3,2.424,30,2.972]],["t/144",[31,3.639]],["t/148",[32,1.579,33,2.972]],["t/168",[32,1.579,34,2.972]],["t/186",[10,2.048,35,2.511,36,2.511]],["t/192",[32,1.334,37,2.511,38,2.511]],["t/206",[39,2.972,40,2.972]],["t/215",[32,1.334,41,2.511,42,2.511]],["t/229",[32,1.579,43,2.972]],["t/247",[44,2.511,45,2.511,46,2.511]]],"invertedIndex":[["analytics",{"_index":29,"t":{"119":{"position":[[26,9]]}}}],["api",{"_index":20,"t":{"96":{"position":[[0,3]]}}}],["applications",{"_index":1,"t":{"2":{"position":[[9,12]]},"60":{"position":[[29,12]]}}}],["asynchronous",{"_index":2,"t":{"16":{"position":[[0,12]]}}}],["building",{"_index":0,"t":{"2":{"position":[[0,8]]}}}],["code",{"_index":44,"t":{"247":{"position":[[3,4]]}}}],["confidence",{"_index":14,"t":{"72":{"position":[[0,10]]}}}],["couch",{"_index":25,"t":{"111":{"position":[[22,5]]}}}],["deployment",{"_index":46,"t":{"247":{"position":[[12,10]]}}}],["detector",{"_index":26,"t":{"111":{"position":[[28,8]]}}}],["detectors",{"_index":17,"t":{"74":{"position":[[13,9]]}}}],["dog",{"_index":24,"t":{"111":{"position":[[15,3]]}}}],["edge",{"_index":6,"t":{"24":{"position":[[25,4]]}}}],["errors",{"_index":11,"t":{"42":{"position":[[16,6]]}}}],["example",{"_index":23,"t":{"111":{"position":[[6,8]]},"119":{"position":[[10,8]]}}}],["fun",{"_index":22,"t":{"111":{"position":[[2,3]]}}}],["getting",{"_index":18,"t":{"87":{"position":[[0,7]]}}}],["grabbing",{"_index":7,"t":{"30":{"position":[[0,8]]}}}],["groundlight",{"_index":5,"t":{"24":{"position":[[6,11]]}}}],["handling",{"_index":9,"t":{"42":{"position":[[0,8]]}}}],["images",{"_index":8,"t":{"30":{"position":[[9,6]]}}}],["industrial",{"_index":12,"t":{"60":{"position":[[0,10]]}}}],["installation",{"_index":31,"t":{"144":{"position":[[0,12]]}}}],["installing",{"_index":32,"t":{"148":{"position":[[0,10]]},"168":{"position":[[0,10]]},"192":{"position":[[0,10]]},"215":{"position":[[0,10]]},"229":{"position":[[0,10]]}}}],["iot",{"_index":45,"t":{"247":{"position":[[8,3]]}}}],["jetson",{"_index":38,"t":{"192":{"position":[[21,6]]}}}],["levels",{"_index":15,"t":{"72":{"position":[[11,6]]}}}],["libraries",{"_index":40,"t":{"206":{"position":[[9,9]]}}}],["linux",{"_index":33,"t":{"148":{"position":[[14,5]]}}}],["macos",{"_index":34,"t":{"168":{"position":[[14,5]]}}}],["manufacturing",{"_index":13,"t":{"60":{"position":[[15,13]]}}}],["monitoring",{"_index":35,"t":{"186":{"position":[[0,10]]}}}],["notification",{"_index":36,"t":{"186":{"position":[[11,12]]}}}],["nvidia",{"_index":37,"t":{"192":{"position":[[14,6]]}}}],["optional",{"_index":39,"t":{"206":{"position":[[0,8]]}}}],["pi",{"_index":42,"t":{"215":{"position":[[24,2]]}}}],["queries",{"_index":3,"t":{"16":{"position":[[13,7]]},"128":{"position":[[8,7]]}}}],["raspberry",{"_index":41,"t":{"215":{"position":[[14,9]]}}}],["retail",{"_index":28,"t":{"119":{"position":[[19,6]]}}}],["serious",{"_index":27,"t":{"119":{"position":[[2,7]]}}}],["server",{"_index":10,"t":{"42":{"position":[[9,6]]},"186":{"position":[[24,6]]}}}],["started",{"_index":19,"t":{"87":{"position":[[8,7]]}}}],["tokens",{"_index":21,"t":{"96":{"position":[[4,6]]}}}],["using",{"_index":4,"t":{"24":{"position":[[0,5]]}}}],["windows",{"_index":43,"t":{"229":{"position":[[14,7]]}}}],["working",{"_index":16,"t":{"74":{"position":[[0,7]]}}}],["writing",{"_index":30,"t":{"128":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":4,"t":"Sample Applications","u":"/python-sdk/docs/building-applications","h":"#sample-applications","p":2},{"i":6,"t":"Groundlight Stream Processor","u":"/python-sdk/docs/building-applications","h":"#groundlight-stream-processor","p":2},{"i":8,"t":"Arduino ESP32 Camera Sample App","u":"/python-sdk/docs/building-applications","h":"#arduino-esp32-camera-sample-app","p":2},{"i":10,"t":"Raspberry Pi","u":"/python-sdk/docs/building-applications","h":"#raspberry-pi","p":2},{"i":12,"t":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications","h":"#industrial-and-manufacturing-applications","p":2},{"i":14,"t":"Further Reading","u":"/python-sdk/docs/building-applications","h":"#further-reading","p":2},{"i":18,"t":"Setup Submitting Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-submitting-machine","p":16},{"i":20,"t":"Setup Retrieving Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-retrieving-machine","p":16},{"i":22,"t":"Important Considerations","u":"/python-sdk/docs/building-applications/async-queries","h":"#important-considerations","p":16},{"i":26,"t":"How the Edge Endpoint works","u":"/python-sdk/docs/building-applications/edge","h":"#how-the-edge-endpoint-works","p":24},{"i":28,"t":"Configuring the Edge Endpoint","u":"/python-sdk/docs/building-applications/edge","h":"#configuring-the-edge-endpoint","p":24},{"i":32,"t":"PIL","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#pil","p":30},{"i":34,"t":"OpenCV","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#opencv","p":30},{"i":36,"t":"Numpy","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#numpy","p":30},{"i":38,"t":"Channel order: BGR vs RGB","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#channel-order-bgr-vs-rgb","p":30},{"i":40,"t":"Framegrab","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#framegrab","p":30},{"i":44,"t":"Handling ApiException","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handling-apiexception","p":42},{"i":46,"t":"Best Practices for Handling Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#best-practices-for-handling-exceptions","p":42},{"i":48,"t":"Catch Specific Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#catch-specific-exceptions","p":42},{"i":50,"t":"Use Custom Exception Classes","u":"/python-sdk/docs/building-applications/handling-errors","h":"#use-custom-exception-classes","p":42},{"i":52,"t":"Log Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#log-exceptions","p":42},{"i":54,"t":"Implement Retry Logic","u":"/python-sdk/docs/building-applications/handling-errors","h":"#implement-retry-logic","p":42},{"i":56,"t":"Handle Exceptions Gracefully","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handle-exceptions-gracefully","p":42},{"i":58,"t":"Test Your Error Handling","u":"/python-sdk/docs/building-applications/handling-errors","h":"#test-your-error-handling","p":42},{"i":62,"t":"Machine Tending","u":"/python-sdk/docs/building-applications/industrial","h":"#machine-tending","p":60},{"i":64,"t":"Process Automation","u":"/python-sdk/docs/building-applications/industrial","h":"#process-automation","p":60},{"i":66,"t":"Quality Control","u":"/python-sdk/docs/building-applications/industrial","h":"#quality-control","p":60},{"i":68,"t":"Integration with Cobots and CNC Machines","u":"/python-sdk/docs/building-applications/industrial","h":"#integration-with-cobots-and-cnc-machines","p":60},{"i":70,"t":"Contact Sales","u":"/python-sdk/docs/building-applications/industrial","h":"","p":60},{"i":75,"t":"Explicitly create a new detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#explicitly-create-a-new-detector","p":74},{"i":77,"t":"Retrieve an existing detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-existing-detector","p":74},{"i":79,"t":"List your detectors","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-detectors","p":74},{"i":81,"t":"Retrieve an image query","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-image-query","p":74},{"i":83,"t":"List your previous image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-previous-image-queries","p":74},{"i":85,"t":"Adding labels to existing image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#adding-labels-to-existing-image-queries","p":74},{"i":88,"t":"Computer Vision powered by Natural Language","u":"/python-sdk/docs/getting-started","h":"#computer-vision-powered-by-natural-language","p":87},{"i":90,"t":"How does it work?","u":"/python-sdk/docs/getting-started","h":"#how-does-it-work","p":87},{"i":92,"t":"Escalation Technology","u":"/python-sdk/docs/getting-started","h":"#escalation-technology","p":87},{"i":94,"t":"Building a simple visual application","u":"/python-sdk/docs/getting-started","h":"#building-a-simple-visual-application","p":87},{"i":97,"t":"About API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#about-api-tokens","p":96},{"i":99,"t":"Handling API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#handling-api-tokens","p":96},{"i":101,"t":"Using API Tokens with the SDK","u":"/python-sdk/docs/getting-started/api-tokens","h":"#using-api-tokens-with-the-sdk","p":96},{"i":103,"t":"Creating and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-and-revoking-api-tokens","p":96},{"i":105,"t":"Creating API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-api-tokens","p":96},{"i":107,"t":"Viewing and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#viewing-and-revoking-api-tokens","p":96},{"i":109,"t":"To revoke an API token","u":"/python-sdk/docs/getting-started/api-tokens","h":"#to-revoke-an-api-token","p":96},{"i":113,"t":"Requirements","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#requirements","p":111},{"i":115,"t":"Installation","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#installation","p":111},{"i":117,"t":"Creating the Application","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#creating-the-application","p":111},{"i":120,"t":"Tracking utilization of a customer service counter","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#tracking-utilization-of-a-customer-service-counter","p":119},{"i":122,"t":"Requirements","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#requirements","p":119},{"i":124,"t":"Installation","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#installation","p":119},{"i":126,"t":"Creating the Application","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#creating-the-application","p":119},{"i":129,"t":"Introduction","u":"/python-sdk/docs/getting-started/writing-queries","h":"#introduction","p":128},{"i":131,"t":"Examples","u":"/python-sdk/docs/getting-started/writing-queries","h":"#examples","p":128},{"i":132,"t":"✅ Are there any cardboard boxes on the conveyor belt?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-are-there-any-cardboard-boxes-on-the-conveyor-belt","p":128},{"i":134,"t":"🟡 Is the trash can full?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-trash-can-full","p":128},{"i":136,"t":"✅ Is the garage door completely closed?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-garage-door-completely-closed","p":128},{"i":138,"t":"🟡 Is the weather nice out?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-weather-nice-out","p":128},{"i":140,"t":"❌ Where is the thing?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-where-is-the-thing","p":128},{"i":142,"t":"🟡 Is the factory floor clean and organized?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-factory-floor-clean-and-organized","p":128},{"i":146,"t":"Platform-specific Installation Guides","u":"/python-sdk/docs/installation","h":"#platform-specific-installation-guides","p":144},{"i":150,"t":"Prerequisites","u":"/python-sdk/docs/installation/linux","h":"#prerequisites","p":148},{"i":152,"t":"Basic Installation","u":"/python-sdk/docs/installation/linux","h":"#basic-installation","p":148},{"i":154,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#installing-groundlight-sdk","p":148},{"i":156,"t":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/linux","h":"#checking-groundlight-sdk-version","p":148},{"i":158,"t":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#upgrading-groundlight-sdk","p":148},{"i":160,"t":"Getting the right Python Version","u":"/python-sdk/docs/installation/linux","h":"#getting-the-right-python-version","p":148},{"i":162,"t":"Upgrading Python on Linux","u":"/python-sdk/docs/installation/linux","h":"#upgrading-python-on-linux","p":148},{"i":164,"t":"Special note about Ubuntu 18.04","u":"/python-sdk/docs/installation/linux","h":"#special-note-about-ubuntu-1804","p":148},{"i":166,"t":"Ready to go!","u":"/python-sdk/docs/installation/linux","h":"#ready-to-go","p":148},{"i":170,"t":"Prerequisites","u":"/python-sdk/docs/installation/macos","h":"#prerequisites","p":168},{"i":172,"t":"Basic Installation","u":"/python-sdk/docs/installation/macos","h":"#basic-installation","p":168},{"i":174,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#installing-groundlight-sdk","p":168},{"i":176,"t":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/macos","h":"#checking-groundlight-sdk-version","p":168},{"i":178,"t":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#upgrading-groundlight-sdk","p":168},{"i":180,"t":"Getting the right Python Version","u":"/python-sdk/docs/installation/macos","h":"#getting-the-right-python-version","p":168},{"i":182,"t":"Upgrading Python on MacOS","u":"/python-sdk/docs/installation/macos","h":"#upgrading-python-on-macos","p":168},{"i":184,"t":"Ready to go!","u":"/python-sdk/docs/installation/macos","h":"#ready-to-go","p":168},{"i":188,"t":"Prerequisites","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#prerequisites","p":186},{"i":190,"t":"Deployment","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#deployment","p":186},{"i":194,"t":"Prerequisites","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#prerequisites","p":192},{"i":196,"t":"Basic Installation","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#basic-installation","p":192},{"i":198,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#installing-groundlight-sdk","p":192},{"i":200,"t":"Using RTSP Streams","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#using-rtsp-streams","p":192},{"i":202,"t":"Sample application","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#sample-application","p":192},{"i":204,"t":"Ready to go!","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#ready-to-go","p":192},{"i":207,"t":"Smaller is better!","u":"/python-sdk/docs/installation/optional-libraries","h":"#smaller-is-better","p":206},{"i":209,"t":"PIL - optional but default installed","u":"/python-sdk/docs/installation/optional-libraries","h":"#pil---optional-but-default-installed","p":206},{"i":211,"t":"Working without PIL","u":"/python-sdk/docs/installation/optional-libraries","h":"#working-without-pil","p":206},{"i":213,"t":"Numpy, OpenCV - fully optional","u":"/python-sdk/docs/installation/optional-libraries","h":"#numpy-opencv---fully-optional","p":206},{"i":217,"t":"Prerequisites","u":"/python-sdk/docs/installation/raspberry-pi","h":"#prerequisites","p":215},{"i":219,"t":"Basic Installation","u":"/python-sdk/docs/installation/raspberry-pi","h":"#basic-installation","p":215},{"i":221,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/raspberry-pi","h":"#installing-groundlight-sdk","p":215},{"i":223,"t":"Using RTSP Streams","u":"/python-sdk/docs/installation/raspberry-pi","h":"#using-rtsp-streams","p":215},{"i":225,"t":"Sample application","u":"/python-sdk/docs/installation/raspberry-pi","h":"#sample-application","p":215},{"i":227,"t":"Ready to go!","u":"/python-sdk/docs/installation/raspberry-pi","h":"#ready-to-go","p":215},{"i":231,"t":"Prerequisites","u":"/python-sdk/docs/installation/windows","h":"#prerequisites","p":229},{"i":233,"t":"Basic Installation","u":"/python-sdk/docs/installation/windows","h":"#basic-installation","p":229},{"i":235,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#installing-groundlight-sdk","p":229},{"i":237,"t":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/windows","h":"#checking-groundlight-sdk-version","p":229},{"i":239,"t":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#upgrading-groundlight-sdk","p":229},{"i":241,"t":"Getting the right Python Version","u":"/python-sdk/docs/installation/windows","h":"#getting-the-right-python-version","p":229},{"i":243,"t":"Upgrading Python on Windows","u":"/python-sdk/docs/installation/windows","h":"#upgrading-python-on-windows","p":229},{"i":245,"t":"Ready to go!","u":"/python-sdk/docs/installation/windows","h":"#ready-to-go","p":229},{"i":249,"t":"Easy Deployment","u":"/python-sdk/docs/iot","h":"#easy-deployment","p":247},{"i":251,"t":"Notification Options","u":"/python-sdk/docs/iot","h":"#notification-options","p":247},{"i":253,"t":"Multiple Supported Boards","u":"/python-sdk/docs/iot","h":"#multiple-supported-boards","p":247},{"i":255,"t":"Source Code","u":"/python-sdk/docs/iot","h":"#source-code","p":247}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/4",[0,3.579,1,4.237]],["t/6",[2,2.082,3,4.113,4,4.113]],["t/8",[0,2.374,5,3.189,6,3.189,7,3.189,8,3.189]],["t/10",[9,4.808,10,4.808]],["t/12",[1,3.623,11,4.113,12,4.113]],["t/14",[13,4.808,14,4.808]],["t/18",[15,3.623,16,4.113,17,3.301]],["t/20",[15,3.623,17,3.301,18,4.113]],["t/22",[19,4.808,20,4.808]],["t/26",[21,3.623,22,3.623,23,4.113]],["t/28",[21,3.623,22,3.623,24,4.113]],["t/32",[25,4.646]],["t/34",[26,5.1]],["t/36",[27,5.1]],["t/38",[28,3.189,29,3.189,30,3.189,31,3.189,32,3.189]],["t/40",[33,5.788]],["t/44",[34,3.579,35,4.808]],["t/46",[34,2.674,36,3.593,37,3.593,38,2.674]],["t/48",[38,3.061,39,4.113,40,3.623]],["t/50",[41,3.593,42,3.593,43,3.593,44,3.593]],["t/52",[38,3.579,45,4.808]],["t/54",[46,4.113,47,4.113,48,4.113]],["t/56",[38,3.061,49,4.113,50,4.113]],["t/58",[34,3.061,51,4.113,52,4.113]],["t/62",[17,3.86,53,4.808]],["t/64",[54,4.808,55,4.808]],["t/66",[56,4.808,57,4.808]],["t/68",[58,3.593,59,3.593,60,3.593,61,3.593]],["t/70",[62,4.808,63,4.808]],["t/75",[64,3.593,65,3.593,66,3.593,67,3.165]],["t/77",[67,3.623,68,3.623,69,3.623]],["t/79",[70,4.237,71,4.808]],["t/81",[68,3.623,72,3.301,73,4.113]],["t/83",[70,3.165,72,2.884,74,3.593,75,3.165]],["t/85",[69,2.81,72,2.56,75,2.81,76,3.189,77,3.189]],["t/88",[78,3.189,79,3.189,80,3.189,81,3.189,82,3.189]],["t/90",[83,5.788]],["t/92",[84,4.808,85,4.808]],["t/94",[86,3.593,87,3.593,88,3.593,89,2.506]],["t/97",[90,3.007,91,3.167]],["t/99",[34,3.061,90,2.571,91,2.708]],["t/101",[90,2.246,91,2.366,92,2.884,93,1.819]],["t/103",[90,2.246,91,2.366,94,2.674,95,3.165]],["t/105",[90,2.571,91,2.708,94,3.061]],["t/107",[90,2.246,91,2.366,95,3.165,96,3.593]],["t/109",[90,2.571,97,4.113,98,4.113]],["t/113",[99,5.1]],["t/115",[100,3.45]],["t/117",[89,3.354,94,3.579]],["t/120",[101,3.189,102,3.189,103,3.189,104,3.189,105,3.189]],["t/122",[99,5.1]],["t/124",[100,3.45]],["t/126",[89,3.354,94,3.579]],["t/129",[106,5.788]],["t/131",[107,5.788]],["t/132",[108,2.1,109,3.189,110,3.189,111,3.189,112,3.189]],["t/134",[108,2.708,113,4.113,114,4.113]],["t/136",[108,2.1,115,3.189,116,3.189,117,3.189,118,3.189]],["t/138",[108,2.366,119,3.593,120,3.593,121,3.593]],["t/140",[108,3.167,122,4.808]],["t/142",[108,2.1,123,3.189,124,3.189,125,3.189,126,3.189]],["t/146",[40,3.165,100,2.142,127,3.593,128,3.593]],["t/150",[129,3.812]],["t/152",[100,2.866,130,3.354]],["t/154",[2,2.082,93,2.082,131,2.868]],["t/156",[2,1.819,93,1.819,132,2.884,133,2.366]],["t/158",[2,2.082,93,2.082,134,2.708]],["t/160",[133,2.366,135,2.884,136,2.884,137,2.366]],["t/162",[134,2.708,137,2.708,138,4.113]],["t/164",[139,3.593,140,3.593,141,3.593,142,3.593]],["t/166",[143,3.354,144,3.354]],["t/170",[129,3.812]],["t/172",[100,2.866,130,3.354]],["t/174",[2,2.082,93,2.082,131,2.868]],["t/176",[2,1.819,93,1.819,132,2.884,133,2.366]],["t/178",[2,2.082,93,2.082,134,2.708]],["t/180",[133,2.366,135,2.884,136,2.884,137,2.366]],["t/182",[134,2.708,137,2.708,145,4.113]],["t/184",[143,3.354,144,3.354]],["t/188",[129,3.812]],["t/190",[146,5.1]],["t/194",[129,3.812]],["t/196",[100,2.866,130,3.354]],["t/198",[2,2.082,93,2.082,131,2.868]],["t/200",[92,3.301,147,3.623,148,3.623]],["t/202",[0,3.579,89,3.354]],["t/204",[143,3.354,144,3.354]],["t/207",[149,4.808,150,4.808]],["t/209",[25,2.884,151,3.165,152,3.593,153,3.593]],["t/211",[25,3.301,154,4.113,155,4.113]],["t/213",[26,3.165,27,3.165,151,3.165,156,3.593]],["t/217",[129,3.812]],["t/219",[100,2.866,130,3.354]],["t/221",[2,2.082,93,2.082,131,2.868]],["t/223",[92,3.301,147,3.623,148,3.623]],["t/225",[0,3.579,89,3.354]],["t/227",[143,3.354,144,3.354]],["t/231",[129,3.812]],["t/233",[100,2.866,130,3.354]],["t/235",[2,2.082,93,2.082,131,2.868]],["t/237",[2,1.819,93,1.819,132,2.884,133,2.366]],["t/239",[2,2.082,93,2.082,134,2.708]],["t/241",[133,2.366,135,2.884,136,2.884,137,2.366]],["t/243",[134,2.708,137,2.708,157,4.113]],["t/245",[143,3.354,144,3.354]],["t/249",[146,4.237,158,4.808]],["t/251",[159,4.808,160,4.808]],["t/253",[161,4.113,162,4.113,163,4.113]],["t/255",[164,4.808,165,4.808]]],"invertedIndex":[["",{"_index":108,"t":{"132":{"position":[[0,1]]},"134":{"position":[[0,2]]},"136":{"position":[[0,1]]},"138":{"position":[[0,2]]},"140":{"position":[[0,1]]},"142":{"position":[[0,2]]}}}],["18.04",{"_index":142,"t":{"164":{"position":[[26,5]]}}}],["adding",{"_index":76,"t":{"85":{"position":[[0,6]]}}}],["api",{"_index":90,"t":{"97":{"position":[[6,3]]},"99":{"position":[[9,3]]},"101":{"position":[[6,3]]},"103":{"position":[[22,3]]},"105":{"position":[[9,3]]},"107":{"position":[[21,3]]},"109":{"position":[[13,3]]}}}],["apiexception",{"_index":35,"t":{"44":{"position":[[9,12]]}}}],["app",{"_index":8,"t":{"8":{"position":[[28,3]]}}}],["application",{"_index":89,"t":{"94":{"position":[[25,11]]},"117":{"position":[[13,11]]},"126":{"position":[[13,11]]},"202":{"position":[[7,11]]},"225":{"position":[[7,11]]}}}],["applications",{"_index":1,"t":{"4":{"position":[[7,12]]},"12":{"position":[[29,12]]}}}],["arduino",{"_index":5,"t":{"8":{"position":[[0,7]]}}}],["automation",{"_index":55,"t":{"64":{"position":[[8,10]]}}}],["basic",{"_index":130,"t":{"152":{"position":[[0,5]]},"172":{"position":[[0,5]]},"196":{"position":[[0,5]]},"219":{"position":[[0,5]]},"233":{"position":[[0,5]]}}}],["belt",{"_index":112,"t":{"132":{"position":[[48,5]]}}}],["best",{"_index":36,"t":{"46":{"position":[[0,4]]}}}],["better",{"_index":150,"t":{"207":{"position":[[11,7]]}}}],["bgr",{"_index":30,"t":{"38":{"position":[[15,3]]}}}],["boards",{"_index":163,"t":{"253":{"position":[[19,6]]}}}],["boxes",{"_index":110,"t":{"132":{"position":[[26,5]]}}}],["building",{"_index":86,"t":{"94":{"position":[[0,8]]}}}],["camera",{"_index":7,"t":{"8":{"position":[[14,6]]}}}],["cardboard",{"_index":109,"t":{"132":{"position":[[16,9]]}}}],["catch",{"_index":39,"t":{"48":{"position":[[0,5]]}}}],["channel",{"_index":28,"t":{"38":{"position":[[0,7]]}}}],["checking",{"_index":132,"t":{"156":{"position":[[0,8]]},"176":{"position":[[0,8]]},"237":{"position":[[0,8]]}}}],["classes",{"_index":44,"t":{"50":{"position":[[21,7]]}}}],["clean",{"_index":125,"t":{"142":{"position":[[24,5]]}}}],["closed",{"_index":118,"t":{"136":{"position":[[32,7]]}}}],["cnc",{"_index":60,"t":{"68":{"position":[[28,3]]}}}],["cobots",{"_index":59,"t":{"68":{"position":[[17,6]]}}}],["code",{"_index":165,"t":{"255":{"position":[[7,4]]}}}],["completely",{"_index":117,"t":{"136":{"position":[[21,10]]}}}],["computer",{"_index":78,"t":{"88":{"position":[[0,8]]}}}],["configuring",{"_index":24,"t":{"28":{"position":[[0,11]]}}}],["considerations",{"_index":20,"t":{"22":{"position":[[10,14]]}}}],["contact",{"_index":62,"t":{"70":{"position":[[0,7]]}}}],["control",{"_index":57,"t":{"66":{"position":[[8,7]]}}}],["conveyor",{"_index":111,"t":{"132":{"position":[[39,8]]}}}],["counter",{"_index":105,"t":{"120":{"position":[[43,7]]}}}],["create",{"_index":65,"t":{"75":{"position":[[11,6]]}}}],["creating",{"_index":94,"t":{"103":{"position":[[0,8]]},"105":{"position":[[0,8]]},"117":{"position":[[0,8]]},"126":{"position":[[0,8]]}}}],["custom",{"_index":42,"t":{"50":{"position":[[4,6]]}}}],["customer",{"_index":103,"t":{"120":{"position":[[26,8]]}}}],["default",{"_index":152,"t":{"209":{"position":[[19,7]]}}}],["deployment",{"_index":146,"t":{"190":{"position":[[0,10]]},"249":{"position":[[5,10]]}}}],["detector",{"_index":67,"t":{"75":{"position":[[24,8]]},"77":{"position":[[21,8]]}}}],["detectors",{"_index":71,"t":{"79":{"position":[[10,9]]}}}],["door",{"_index":116,"t":{"136":{"position":[[16,4]]}}}],["easy",{"_index":158,"t":{"249":{"position":[[0,4]]}}}],["edge",{"_index":21,"t":{"26":{"position":[[8,4]]},"28":{"position":[[16,4]]}}}],["endpoint",{"_index":22,"t":{"26":{"position":[[13,8]]},"28":{"position":[[21,8]]}}}],["error",{"_index":52,"t":{"58":{"position":[[10,5]]}}}],["escalation",{"_index":84,"t":{"92":{"position":[[0,10]]}}}],["esp32",{"_index":6,"t":{"8":{"position":[[8,5]]}}}],["examples",{"_index":107,"t":{"131":{"position":[[0,8]]}}}],["exception",{"_index":43,"t":{"50":{"position":[[11,9]]}}}],["exceptions",{"_index":38,"t":{"46":{"position":[[28,10]]},"48":{"position":[[15,10]]},"52":{"position":[[4,10]]},"56":{"position":[[7,10]]}}}],["existing",{"_index":69,"t":{"77":{"position":[[12,8]]},"85":{"position":[[17,8]]}}}],["explicitly",{"_index":64,"t":{"75":{"position":[[0,10]]}}}],["factory",{"_index":123,"t":{"142":{"position":[[10,7]]}}}],["floor",{"_index":124,"t":{"142":{"position":[[18,5]]}}}],["framegrab",{"_index":33,"t":{"40":{"position":[[0,9]]}}}],["full",{"_index":114,"t":{"134":{"position":[[20,5]]}}}],["fully",{"_index":156,"t":{"213":{"position":[[16,5]]}}}],["further",{"_index":13,"t":{"14":{"position":[[0,7]]}}}],["garage",{"_index":115,"t":{"136":{"position":[[9,6]]}}}],["getting",{"_index":135,"t":{"160":{"position":[[0,7]]},"180":{"position":[[0,7]]},"241":{"position":[[0,7]]}}}],["go",{"_index":144,"t":{"166":{"position":[[9,3]]},"184":{"position":[[9,3]]},"204":{"position":[[9,3]]},"227":{"position":[[9,3]]},"245":{"position":[[9,3]]}}}],["gracefully",{"_index":50,"t":{"56":{"position":[[18,10]]}}}],["groundlight",{"_index":2,"t":{"6":{"position":[[0,11]]},"154":{"position":[[11,11]]},"156":{"position":[[9,11]]},"158":{"position":[[10,11]]},"174":{"position":[[11,11]]},"176":{"position":[[9,11]]},"178":{"position":[[10,11]]},"198":{"position":[[11,11]]},"221":{"position":[[11,11]]},"235":{"position":[[11,11]]},"237":{"position":[[9,11]]},"239":{"position":[[10,11]]}}}],["guides",{"_index":128,"t":{"146":{"position":[[31,6]]}}}],["handle",{"_index":49,"t":{"56":{"position":[[0,6]]}}}],["handling",{"_index":34,"t":{"44":{"position":[[0,8]]},"46":{"position":[[19,8]]},"58":{"position":[[16,8]]},"99":{"position":[[0,8]]}}}],["image",{"_index":72,"t":{"81":{"position":[[12,5]]},"83":{"position":[[19,5]]},"85":{"position":[[26,5]]}}}],["implement",{"_index":46,"t":{"54":{"position":[[0,9]]}}}],["important",{"_index":19,"t":{"22":{"position":[[0,9]]}}}],["industrial",{"_index":11,"t":{"12":{"position":[[0,10]]}}}],["installation",{"_index":100,"t":{"115":{"position":[[0,12]]},"124":{"position":[[0,12]]},"146":{"position":[[18,12]]},"152":{"position":[[6,12]]},"172":{"position":[[6,12]]},"196":{"position":[[6,12]]},"219":{"position":[[6,12]]},"233":{"position":[[6,12]]}}}],["installed",{"_index":153,"t":{"209":{"position":[[27,9]]}}}],["installing",{"_index":131,"t":{"154":{"position":[[0,10]]},"174":{"position":[[0,10]]},"198":{"position":[[0,10]]},"221":{"position":[[0,10]]},"235":{"position":[[0,10]]}}}],["integration",{"_index":58,"t":{"68":{"position":[[0,11]]}}}],["introduction",{"_index":106,"t":{"129":{"position":[[0,12]]}}}],["labels",{"_index":77,"t":{"85":{"position":[[7,6]]}}}],["language",{"_index":82,"t":{"88":{"position":[[35,8]]}}}],["linux",{"_index":138,"t":{"162":{"position":[[20,5]]}}}],["list",{"_index":70,"t":{"79":{"position":[[0,4]]},"83":{"position":[[0,4]]}}}],["log",{"_index":45,"t":{"52":{"position":[[0,3]]}}}],["logic",{"_index":48,"t":{"54":{"position":[[16,5]]}}}],["machine",{"_index":17,"t":{"18":{"position":[[17,7]]},"20":{"position":[[17,7]]},"62":{"position":[[0,7]]}}}],["machines",{"_index":61,"t":{"68":{"position":[[32,8]]}}}],["macos",{"_index":145,"t":{"182":{"position":[[20,5]]}}}],["manufacturing",{"_index":12,"t":{"12":{"position":[[15,13]]}}}],["multiple",{"_index":161,"t":{"253":{"position":[[0,8]]}}}],["natural",{"_index":81,"t":{"88":{"position":[[27,7]]}}}],["new",{"_index":66,"t":{"75":{"position":[[20,3]]}}}],["nice",{"_index":120,"t":{"138":{"position":[[18,4]]}}}],["note",{"_index":140,"t":{"164":{"position":[[8,4]]}}}],["notification",{"_index":159,"t":{"251":{"position":[[0,12]]}}}],["numpy",{"_index":27,"t":{"36":{"position":[[0,5]]},"213":{"position":[[0,6]]}}}],["opencv",{"_index":26,"t":{"34":{"position":[[0,6]]},"213":{"position":[[7,6]]}}}],["optional",{"_index":151,"t":{"209":{"position":[[6,8]]},"213":{"position":[[22,8]]}}}],["options",{"_index":160,"t":{"251":{"position":[[13,7]]}}}],["order",{"_index":29,"t":{"38":{"position":[[8,6]]}}}],["organized",{"_index":126,"t":{"142":{"position":[[34,10]]}}}],["out",{"_index":121,"t":{"138":{"position":[[23,4]]}}}],["pi",{"_index":10,"t":{"10":{"position":[[10,2]]}}}],["pil",{"_index":25,"t":{"32":{"position":[[0,3]]},"209":{"position":[[0,3]]},"211":{"position":[[16,3]]}}}],["platform",{"_index":127,"t":{"146":{"position":[[0,8]]}}}],["powered",{"_index":80,"t":{"88":{"position":[[16,7]]}}}],["practices",{"_index":37,"t":{"46":{"position":[[5,9]]}}}],["prerequisites",{"_index":129,"t":{"150":{"position":[[0,13]]},"170":{"position":[[0,13]]},"188":{"position":[[0,13]]},"194":{"position":[[0,13]]},"217":{"position":[[0,13]]},"231":{"position":[[0,13]]}}}],["previous",{"_index":74,"t":{"83":{"position":[[10,8]]}}}],["process",{"_index":54,"t":{"64":{"position":[[0,7]]}}}],["processor",{"_index":4,"t":{"6":{"position":[[19,9]]}}}],["python",{"_index":137,"t":{"160":{"position":[[18,6]]},"162":{"position":[[10,6]]},"180":{"position":[[18,6]]},"182":{"position":[[10,6]]},"241":{"position":[[18,6]]},"243":{"position":[[10,6]]}}}],["quality",{"_index":56,"t":{"66":{"position":[[0,7]]}}}],["queries",{"_index":75,"t":{"83":{"position":[[25,7]]},"85":{"position":[[32,7]]}}}],["query",{"_index":73,"t":{"81":{"position":[[18,5]]}}}],["raspberry",{"_index":9,"t":{"10":{"position":[[0,9]]}}}],["reading",{"_index":14,"t":{"14":{"position":[[8,7]]}}}],["ready",{"_index":143,"t":{"166":{"position":[[0,5]]},"184":{"position":[[0,5]]},"204":{"position":[[0,5]]},"227":{"position":[[0,5]]},"245":{"position":[[0,5]]}}}],["requirements",{"_index":99,"t":{"113":{"position":[[0,12]]},"122":{"position":[[0,12]]}}}],["retrieve",{"_index":68,"t":{"77":{"position":[[0,8]]},"81":{"position":[[0,8]]}}}],["retrieving",{"_index":18,"t":{"20":{"position":[[6,10]]}}}],["retry",{"_index":47,"t":{"54":{"position":[[10,5]]}}}],["revoke",{"_index":97,"t":{"109":{"position":[[3,6]]}}}],["revoking",{"_index":95,"t":{"103":{"position":[[13,8]]},"107":{"position":[[12,8]]}}}],["rgb",{"_index":32,"t":{"38":{"position":[[22,3]]}}}],["right",{"_index":136,"t":{"160":{"position":[[12,5]]},"180":{"position":[[12,5]]},"241":{"position":[[12,5]]}}}],["rtsp",{"_index":147,"t":{"200":{"position":[[6,4]]},"223":{"position":[[6,4]]}}}],["sales",{"_index":63,"t":{"70":{"position":[[8,5]]}}}],["sample",{"_index":0,"t":{"4":{"position":[[0,6]]},"8":{"position":[[21,6]]},"202":{"position":[[0,6]]},"225":{"position":[[0,6]]}}}],["sdk",{"_index":93,"t":{"101":{"position":[[26,3]]},"154":{"position":[[23,3]]},"156":{"position":[[21,3]]},"158":{"position":[[22,3]]},"174":{"position":[[23,3]]},"176":{"position":[[21,3]]},"178":{"position":[[22,3]]},"198":{"position":[[23,3]]},"221":{"position":[[23,3]]},"235":{"position":[[23,3]]},"237":{"position":[[21,3]]},"239":{"position":[[22,3]]}}}],["service",{"_index":104,"t":{"120":{"position":[[35,7]]}}}],["setup",{"_index":15,"t":{"18":{"position":[[0,5]]},"20":{"position":[[0,5]]}}}],["simple",{"_index":87,"t":{"94":{"position":[[11,6]]}}}],["smaller",{"_index":149,"t":{"207":{"position":[[0,7]]}}}],["source",{"_index":164,"t":{"255":{"position":[[0,6]]}}}],["special",{"_index":139,"t":{"164":{"position":[[0,7]]}}}],["specific",{"_index":40,"t":{"48":{"position":[[6,8]]},"146":{"position":[[9,8]]}}}],["stream",{"_index":3,"t":{"6":{"position":[[12,6]]}}}],["streams",{"_index":148,"t":{"200":{"position":[[11,7]]},"223":{"position":[[11,7]]}}}],["submitting",{"_index":16,"t":{"18":{"position":[[6,10]]}}}],["supported",{"_index":162,"t":{"253":{"position":[[9,9]]}}}],["technology",{"_index":85,"t":{"92":{"position":[[11,10]]}}}],["tending",{"_index":53,"t":{"62":{"position":[[8,7]]}}}],["test",{"_index":51,"t":{"58":{"position":[[0,4]]}}}],["thing",{"_index":122,"t":{"140":{"position":[[15,6]]}}}],["token",{"_index":98,"t":{"109":{"position":[[17,5]]}}}],["tokens",{"_index":91,"t":{"97":{"position":[[10,6]]},"99":{"position":[[13,6]]},"101":{"position":[[10,6]]},"103":{"position":[[26,6]]},"105":{"position":[[13,6]]},"107":{"position":[[25,6]]}}}],["tracking",{"_index":101,"t":{"120":{"position":[[0,8]]}}}],["trash",{"_index":113,"t":{"134":{"position":[[10,5]]}}}],["ubuntu",{"_index":141,"t":{"164":{"position":[[19,6]]}}}],["upgrading",{"_index":134,"t":{"158":{"position":[[0,9]]},"162":{"position":[[0,9]]},"178":{"position":[[0,9]]},"182":{"position":[[0,9]]},"239":{"position":[[0,9]]},"243":{"position":[[0,9]]}}}],["use",{"_index":41,"t":{"50":{"position":[[0,3]]}}}],["using",{"_index":92,"t":{"101":{"position":[[0,5]]},"200":{"position":[[0,5]]},"223":{"position":[[0,5]]}}}],["utilization",{"_index":102,"t":{"120":{"position":[[9,11]]}}}],["version",{"_index":133,"t":{"156":{"position":[[25,7]]},"160":{"position":[[25,7]]},"176":{"position":[[25,7]]},"180":{"position":[[25,7]]},"237":{"position":[[25,7]]},"241":{"position":[[25,7]]}}}],["viewing",{"_index":96,"t":{"107":{"position":[[0,7]]}}}],["vision",{"_index":79,"t":{"88":{"position":[[9,6]]}}}],["visual",{"_index":88,"t":{"94":{"position":[[18,6]]}}}],["vs",{"_index":31,"t":{"38":{"position":[[19,2]]}}}],["weather",{"_index":119,"t":{"138":{"position":[[10,7]]}}}],["windows",{"_index":157,"t":{"243":{"position":[[20,7]]}}}],["without",{"_index":155,"t":{"211":{"position":[[8,7]]}}}],["work",{"_index":83,"t":{"90":{"position":[[12,5]]}}}],["working",{"_index":154,"t":{"211":{"position":[[0,7]]}}}],["works",{"_index":23,"t":{"26":{"position":[[22,5]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Groundlight provides a powerful \"computer vision powered by natural language\" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis. In this page, we'll introduce you to some sample applications built using Groundlight and provide links to more detailed guides on various topics.","s":"Building Applications","u":"/python-sdk/docs/building-applications","h":"","p":2},{"i":5,"t":"Explore these GitHub repositories to see examples of Groundlight-powered applications:","s":"Sample Applications","u":"/python-sdk/docs/building-applications","h":"#sample-applications","p":2},{"i":7,"t":"Repository: https://github.com/groundlight/stream The Groundlight Stream Processor is an easy-to-use Docker container for analyzing RTSP streams or common USB-based cameras. You can run it with a single Docker command, such as: docker run stream:local --help","s":"Groundlight Stream Processor","u":"/python-sdk/docs/building-applications","h":"#groundlight-stream-processor","p":2},{"i":9,"t":"Repository: https://github.com/groundlight/esp32cam This sample application allows you to build a working AI vision detector using an inexpensive WiFi camera. With a cost of under $10, you can create a powerful and affordable AI vision system.","s":"Arduino ESP32 Camera Sample App","u":"/python-sdk/docs/building-applications","h":"#arduino-esp32-camera-sample-app","p":2},{"i":11,"t":"Repository: https://github.com/groundlight/raspberry-pi-door-lock This sample application demonstrates how to set up a Raspberry Pi-based door lock system. The application monitors a door and sends a notification if the door is observed to be unlocked during non-standard business hours.","s":"Raspberry Pi","u":"/python-sdk/docs/building-applications","h":"#raspberry-pi","p":2},{"i":13,"t":"Groundlight can be used to apply modern natural-language-based computer vision to industrial and manufacturing applications.","s":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications","h":"#industrial-and-manufacturing-applications","p":2},{"i":15,"t":"For more in-depth guides on various aspects of building applications with Groundlight, check out the following pages: Grabbing images: Understand the intricacies of how to submit images from various input sources to Groundlight. Working with detectors: Learn how to create, configure, and use detectors in your Groundlight-powered applications. Confidence levels: Master how to control the trade-off of latency against accuracy by configuring the desired confidence level for your detectors. Handling server errors: Understand how to handle and troubleshoot HTTP errors that may occur while using Groundlight. Asynchronous queries: Groundlight makes it easy to submit asynchronous queries. Learn how to submit queries asynchronously and retrieve the results later. Using Groundlight on the edge: Discover how to deploy Groundlight in edge computing environments for improved performance and reduced latency. Industrial applications: Learn how to apply modern natural-language-based computer vision to your industrial and manufacturing applications. By exploring these resources and sample applications, you'll be well on your way to building powerful visual applications using Groundlight's computer vision and natural language capabilities.","s":"Further Reading","u":"/python-sdk/docs/building-applications","h":"#further-reading","p":2},{"i":17,"t":"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.","s":"Asynchronous Queries","u":"/python-sdk/docs/building-applications/async-queries","h":"","p":16},{"i":19,"t":"On the submitting machine, you will need to install the Groundlight Python SDK. Then you can submit image queries asynchronously using the ask_async interface (read the full documentation here). ask_async submits your query and returns as soon as the query is submitted. It does not wait for an answer to be available prior to returning to minimize the time your program spends interacting with Groundlight. As a result, the ImageQuery object ask_async returns lacks a result (the result field will be None). This is acceptable for this use case as the submitting machine is not interested in the result. Instead, the submitting machine just needs to communicate the ImageQuery.ids to the retrieving machine - this might be done via a database, a message queue, or some other mechanism. For this example, we assume you are using a database where you save the ImageQuery.id to it via db.save(image_query.id). from groundlight import Groundlight import cv2 from time import sleep detector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\") cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index) while True: _, image = cam.read() # Capture one frame from the camera image_query = gl.ask_async(detector=detector, image=image) # Submit the frame to Groundlight db.save(image_query.id) # Save the image_query.id to a database for the retrieving machine to use sleep(10) # Sleep for 10 seconds before submitting the next query cam.release() # Release the camera","s":"Setup Submitting Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-submitting-machine","p":16},{"i":21,"t":"On the retrieving machine you will need to install the Groundlight Python SDK. Then you can retrieve the results of the image queries submitted by another machine using get_image_query. The retrieving machine can then use the ImageQuery.result to take action based on the result for whatever application you are building. For this example, we assume your application looks up the next image query to process from a database via db.get_next_image_query_id() and that this function returns None once all ImageQuerys are processed. from groundlight import Groundlight detector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\") image_query_id = db.get_next_image_query_id() while image_query_id is not None: image_query = gl.get_image_query(id=image_query_id) # retrieve the image query from Groundlight result = image_query.result # take action based on the result of the image query if result.label == 'YES': pass # TODO: do something based on your application elif result.label == 'NO': pass # TODO: do something based on your application elif result.label == 'UNCLEAR': pass # TODO: do something based on your application # update image_query_id for next iteration of the loop image_query_id = db.get_next_image_query_id()","s":"Setup Retrieving Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-retrieving-machine","p":16},{"i":23,"t":"When you submit an image query asynchronously, ML prediction on your query is not instant. So attempting to retrieve the result immediately after submitting an async query will likely result in an UNCLEAR result as Groundlight is still processing your query. Instead, if your code needs a result synchronously we recommend using one of our methods with a polling mechanism to retrieve the result. You can see all of the interfaces available in the documentation here. from groundlight import Groundlight from PIL import Image detector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\") image = Image.open(\"/path/to/your/image.jpg\") image_query = gl.ask_async(detector=detector, image=image) # Submit async query to Groundlight result = image_query.result # This will always be 'None' as you asked asynchronously image_query = gl.get_image_query(id=image_query.id) # Immediately retrieve the image query from Groundlight result = image_query.result # This will likely be 'UNCLEAR' as Groundlight is still processing your query image_query = gl.wait_for_confident_result(id=image_query.id) # Poll for a confident result from Groundlight result = image_query.result","s":"Important Considerations","u":"/python-sdk/docs/building-applications/async-queries","h":"#important-considerations","p":16},{"i":25,"t":"If your account has access to edge models, you can download and install them to your edge devices. This allows you to run your model evaluations on the edge, reducing latency, cost, network bandwidth, and energy.","s":"Using Groundlight on the Edge","u":"/python-sdk/docs/building-applications/edge","h":"","p":24},{"i":27,"t":"The Edge Endpoint runs as a set of docker containers on an \"edge device\". This edge device can be an NVIDIA Jetson device, rack-mounted server, or even a Raspberry Pi. The Edge Endpoint is responsible for downloading and running the models, and for communicating with the Groundlight cloud service. To use the edge endpoint, simply configure the Groundlight SDK to use the edge endpoint's URL instead of the cloud endpoint. All application logic will work seamlessly and unchanged with the Groundlight Edge Endpoint, except some ML answers will return much faster locally. The only visible difference is that image queries answered at the edge endpoint will have the prefix iqe_ instead of iq_ for image queries answered in the cloud. iqe_ stands for \"image query edge\". Edge-originated image queries will not appear in the cloud dashboard.","s":"How the Edge Endpoint works","u":"/python-sdk/docs/building-applications/edge","h":"#how-the-edge-endpoint-works","p":24},{"i":29,"t":"To configure the Groundlight SDK to use the edge endpoint, you can either pass the endpoint URL to the Groundlight constructor like: from groundlight import Groundlight gl = Groundlight(endpoint=\"http://localhost:6717\") or by setting the GROUNDLIGHT_ENDPOINT environment variable like: export GROUNDLIGHT_ENDPOINT=http://localhost:6717 python your_app.py","s":"Configuring the Edge Endpoint","u":"/python-sdk/docs/building-applications/edge","h":"#configuring-the-edge-endpoint","p":24},{"i":31,"t":"Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.","s":"Grabbing Images","u":"/python-sdk/docs/building-applications/grabbing-images","h":"","p":30},{"i":33,"t":"The Groundlight SDK can accept PIL images directly in submit_image_query. Here's an example: from groundlight import Groundlight from PIL import Image gl = Groundlight() det = gl.get_or_create_detector(name=\"path-clear\", query=\"Is the path clear?\") pil_img = Image.open(\"./docs/static/img/doorway.jpg\") gl.submit_image_query(det, pil_img)","s":"PIL","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#pil","p":30},{"i":35,"t":"OpenCV is a popular image processing library, with many utilities for working with images. OpenCV images are stored as numpy arrays. (Note they are stored in BGR order, not RGB order, but as of Groundlight SDK v0.8 this is the expected order.) OpenCV's images can be send directly to submit_image_query as follows: import cv2 cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index) _, frame = cam.read() # Capture one frame gl.submit_image_query(detector, frame) # Send the frame to Groundlight cam.release() # Release the camera","s":"OpenCV","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#opencv","p":30},{"i":37,"t":"The Groundlight SDK can accept images as numpy arrays. They should be in the standard HWN format in BGR color order, matching OpenCV standards. Pixel values should be from 0-255 (not 0.0-1.0 as floats). So uint8 data type is preferable since it saves memory. Here's sample code to create an 800x600 random image in numpy: import numpy as np np_img = np.random.uniform(low=0, high=255, size=(600, 800, 3)).astype(np.uint8) # Note: channel order is interpretted as BGR not RGB gl.submit_image_query(detector, np_img)","s":"Numpy","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#numpy","p":30},{"i":39,"t":"Groundlight expects images in BGR order, because this is standard for OpenCV, which uses numpy arrays as image storage. (OpenCV uses BGR because it was originally developed decades ago for compatibility with the BGR color format used by many cameras and image processing hardware at the time of its creation.) Most other image libraries use RGB order, so if you are using images as numpy arrays which did not originate from OpenCV you likely need to reverse the channel order before sending the images to Groundlight. Note this change was made in v0.8 of the Groundlight SDK - in previous versions, RGB order was expected. If you have an RGB array, you must reverse the channel order before sending it to Groundlight, like: # Convert numpy image in RGB channel order to BGR order bgr_img = rgb_img[:, :, ::-1] The difference can be surprisingly subtle when red and blue get swapped. Often images just look a little off, but sometimes they look very wrong. Here's an example of a natural-scene image where you might think the color balance is just off: In industrial settings, the difference can be almost impossible to detect without prior knowledge of the scene:","s":"Channel order: BGR vs RGB","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#channel-order-bgr-vs-rgb","p":30},{"i":41,"t":"For a unified interface to many different kinds of image sources, see the framegrab library. Framegrab is still an early work in progress, but has many useful features for working with cameras and other image sources. Framegrab provides a single interface for many different kinds of image sources, including: USB cameras IP cameras Video files Image files","s":"Framegrab","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#framegrab","p":30},{"i":43,"t":"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.","s":"Handling Server Errors","u":"/python-sdk/docs/building-applications/handling-errors","h":"","p":42},{"i":45,"t":"If there is an HTTP error during an API call, the SDK will raise an ApiException. You can access different metadata from that exception: import traceback from groundlight import ApiException, Groundlight gl = Groundlight() try: d = gl.get_or_create_detector( \"Road Checker\", \"Is the site access road blocked?\") iq = gl.submit_image_query(d, get_image(), wait=60) except ApiException as e: # Print a traceback for debugging traceback.print_exc() # e.reason contains a textual description of the error print(f\"Error reason: {e.reason}\") # e.status contains the HTTP status code print(f\"HTTP status code: {e.status}\") # Common HTTP status codes: # 400 Bad Request: The request was invalid or malformed # 401 Unauthorized: Your GROUNDLIGHT_API_TOKEN is missing or invalid # 403 Forbidden: The request is not allowed due to insufficient permissions # 404 Not Found: The requested resource was not found # 429 Too Many Requests: The rate limit for the API has been exceeded # 500 Internal Server Error: An error occurred on the server side","s":"Handling ApiException","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handling-apiexception","p":42},{"i":47,"t":"When working with the Groundlight SDK, follow these best practices to handle exceptions and build robust code:","s":"Best Practices for Handling Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#best-practices-for-handling-exceptions","p":42},{"i":49,"t":"Catch only the specific exceptions that you expect to be raised, such as ApiException. Avoid catching broad exceptions like Exception, as it may make debugging difficult and obscure other unrelated issues.","s":"Catch Specific Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#catch-specific-exceptions","p":42},{"i":51,"t":"Consider creating custom exception classes for your application-specific errors. This can help you differentiate between errors originating from the Groundlight SDK and those from your application.","s":"Use Custom Exception Classes","u":"/python-sdk/docs/building-applications/handling-errors","h":"#use-custom-exception-classes","p":42},{"i":53,"t":"Log exceptions with appropriate log levels (e.g., error, warning, etc.) and include relevant context information. This will help you debug issues more effectively and monitor the health of your application.","s":"Log Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#log-exceptions","p":42},{"i":55,"t":"When handling exceptions, implement retry logic with exponential backoff for transient errors, such as network issues or rate-limiting. This can help your application recover from temporary issues without manual intervention.","s":"Implement Retry Logic","u":"/python-sdk/docs/building-applications/handling-errors","h":"#implement-retry-logic","p":42},{"i":57,"t":"In addition to logging exceptions, handle them gracefully to ensure that your application remains functional despite errors. This might include displaying an error message to users or falling back to a default behavior.","s":"Handle Exceptions Gracefully","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handle-exceptions-gracefully","p":42},{"i":59,"t":"Write tests to ensure that your error handling works as expected. This can help you catch issues early and ensure that your application can handle errors gracefully in production. By following these best practices, you can create robust and resilient applications that can handle server errors and other exceptions when using the Groundlight SDK.","s":"Test Your Error Handling","u":"/python-sdk/docs/building-applications/handling-errors","h":"#test-your-error-handling","p":42},{"i":61,"t":"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.","s":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications/industrial","h":"","p":60},{"i":63,"t":"Groundlight's computer vision technology can assist in automating machine-tending tasks, such as loading and unloading materials in CNC machines, milling centers, or injection molding equipment. By enabling robots to recognize parts and tools using natural language, complex machine-tending tasks become more accessible and efficient.","s":"Machine Tending","u":"/python-sdk/docs/building-applications/industrial","h":"#machine-tending","p":60},{"i":65,"t":"Integrating Groundlight's computer vision into your process automation systems can help identify bottlenecks, optimize workflows, and reduce manual intervention. Our technology can work hand-in-hand with robotic systems to perform tasks like sorting, assembly, all while interpreting natural language commands to streamline operations.","s":"Process Automation","u":"/python-sdk/docs/building-applications/industrial","h":"#process-automation","p":60},{"i":67,"t":"Groundlight's computer vision technology can play a vital role in ensuring the highest quality standards in your manufacturing processes. By identifying defects or irregularities in products, our computer vision system can help maintain strict quality control, reducing the need for manual inspections and increasing overall product quality.","s":"Quality Control","u":"/python-sdk/docs/building-applications/industrial","h":"#quality-control","p":60},{"i":69,"t":"Groundlight's computer vision technology can be easily integrated with popular cobot robotic arms, such as Universal Robots, to enhance their capabilities and improve collaboration between humans and robots. Additionally, our technology can be integrated into existing CNC machines or other devices using the Modbus interface, allowing for seamless communication and control within your manufacturing environment.","s":"Integration with Cobots and CNC Machines","u":"/python-sdk/docs/building-applications/industrial","h":"#integration-with-cobots-and-cnc-machines","p":60},{"i":71,"t":"To learn more about how Groundlight's natural language computer vision technology can revolutionize your industrial and manufacturing processes, please reach out to us at info@groundlight.ai.","s":"Contact Sales","u":"/python-sdk/docs/building-applications/industrial","h":"","p":60},{"i":73,"t":"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster. The desired confidence level is set as the escalation threshold on your detector. This determines the minimum confidence score for the ML system to provide before the image query is escalated. For example, say you want to set your desired confidence level to 0.95, but that you're willing to wait up to 60 seconds to get a confident response. from groundlight import Groundlight from PIL import Image import requests gl = Groundlight() image_url = \"https://www.photos-public-domain.com/wp-content/uploads/2010/11/over_flowing_garbage_can.jpg\" image = Image.open(requests.get(image_url, stream=True).raw) d = gl.get_or_create_detector(name=\"trash\", query=\"Is the trash can full?\", confidence_threshold=0.95) # This will wait until either 60 seconds have passed or the confidence reaches 0.95 image_query = gl.submit_image_query(detector=d, image=image, wait=60) print(f\"The answer is {image_query.result}\") tip Tuning confidence lets you balance accuracy against latency. Higher confidence will get higher accuracy, but will generally require higher latency. Higher confidence also requires more labels, which increases labor costs. Or if you want to execute submit_image_query as fast as possible, set wait=0. You will either get the ML results or a placeholder response if the ML model hasn't finished executing. Image queries which are below the desired confidence level will still be escalated for further analysis, and the results are incorporated as training data to improve your ML model, but your code will not wait for that to happen. image_query = gl.submit_image_query(detector=d, image=image, wait=0) If the returned result was generated from an ML model, you can see the confidence score returned for the image query: print(f\"The confidence is {image_query.result.confidence}\")","s":"Confidence Levels","u":"/python-sdk/docs/building-applications/managing-confidence","h":"","p":72},{"i":76,"t":"Typically you'll use the get_or_create_detector(name: str, query: str) method to find an existing detector you've already created with the same name, or create a new one if it doesn't exists. But if you'd like to force creating a new detector you can also use the create_detector(name: str, query: str) method from groundlight import Groundlight gl = Groundlight() detector = gl.create_detector(name=\"your_detector_name\", query=\"is this what we want to see?\")","s":"Explicitly create a new detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#explicitly-create-a-new-detector","p":74},{"i":78,"t":"from groundlight import Groundlight gl = Groundlight() detector = gl.get_detector(id=\"YOUR_DETECTOR_ID\")","s":"Retrieve an existing detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-existing-detector","p":74},{"i":80,"t":"from groundlight import Groundlight gl = Groundlight() # Defaults to 10 results per page detectors = gl.list_detectors() # Pagination: 1st page of 5 results per page detectors = gl.list_detectors(page=1, page_size=5)","s":"List your detectors","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-detectors","p":74},{"i":82,"t":"In practice, you may want to check for a new result on your query. For example, after a cloud reviewer labels your query. For example, you can use the image_query.id after the above submit_image_query() call. from groundlight import Groundlight gl = Groundlight() image_query = gl.get_image_query(id=\"iq_YOUR_IMAGE_QUERY_ID\")","s":"Retrieve an image query","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-image-query","p":74},{"i":84,"t":"from groundlight import Groundlight gl = Groundlight() # Defaults to 10 results per page image_queries = gl.list_image_queries() # Pagination: 1st page of 5 results per page image_queries = gl.list_image_queries(page=1, page_size=5)","s":"List your previous image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-previous-image-queries","p":74},{"i":86,"t":"Groundlight lets you start using models by making queries against your very first image, but there are a few situations where you might either have an existing dataset, or you'd like to handle the escalation response programatically in your own code but still include the label to get better responses in the future. With your image_query from either submit_image_query() or get_image_query() you can add the label directly. Note that if the query is already in the escalation queue due to low ML confidence or audit thresholds, it may also receive labels from another source. from groundlight import Groundlight from PIL import Image import requests gl = Groundlight() d = gl.get_or_create_detector(name=\"doorway\", query=\"Is the doorway open?\") image_url= \"https://images.selfstorage.com/large-compress/2174925f24362c479b2.jpg\" image = Image.open(requests.get(image_url, stream=True).raw) image_query = gl.submit_image_query(detector=d, image=image) gl.add_label(image_query, 'YES') # or 'NO' The only valid labels at this time are 'YES' and 'NO'.","s":"Adding labels to existing image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#adding-labels-to-existing-image-queries","p":74},{"i":89,"t":"Build a working computer vision system in just a few lines of python: from groundlight import Groundlight gl = Groundlight() det = gl.get_or_create_detector(name=\"doorway\", query=\"Is the doorway open?\") img = \"./docs/static/img/doorway.jpg\" # Image can be a file or a Python object image_query = gl.submit_image_query(detector=det, image=img) print(f\"The answer is {image_query.result}\") Note: The SDK is currently in \"beta\" phase. Interfaces are subject to change in future versions. We will follow semver semantics for breaking changes.","s":"Computer Vision powered by Natural Language","u":"/python-sdk/docs/getting-started","h":"#computer-vision-powered-by-natural-language","p":87},{"i":91,"t":"Your images are first analyzed by machine learning (ML) models which are automatically trained on your data. If those models have high enough confidence, that's your answer. But if the models are unsure, then the images are progressively escalated to more resource-intensive analysis methods up to real-time human review. So what you get is a computer vision system that starts working right away without even needing to first gather and label a dataset. At first it will operate with high latency, because people need to review the image queries. But over time, the ML systems will learn and improve so queries come back faster with higher confidence.","s":"How does it work?","u":"/python-sdk/docs/getting-started","h":"#how-does-it-work","p":87},{"i":93,"t":"Groundlight's Escalation Technology combines the power of generative AI using our Visual LLM, along with the speed of edge computing, and the reliability of real-time human oversight.","s":"Escalation Technology","u":"/python-sdk/docs/getting-started","h":"#escalation-technology","p":87},{"i":95,"t":"Install the groundlight SDK. Requires python version 3.7 or higher. See prerequisites. pip3 install groundlight Head over to the groundlight web app to create an API token. You will need to set the GROUNDLIGHT_API_TOKEN environment variable to access the API. export GROUNDLIGHT_API_TOKEN=api_2GdXMflhJi6L_example Create a python script. ask.py from groundlight import Groundlight gl = Groundlight() det = gl.get_or_create_detector(name=\"doorway\", query=\"Is the doorway open?\") img = \"./docs/static/img/doorway.jpg\" # Image can be a file or a Python object image_query = gl.submit_image_query(detector=det, image=img) print(f\"The answer is {image_query.result}\") Run it! python ask.py","s":"Building a simple visual application","u":"/python-sdk/docs/getting-started","h":"#building-a-simple-visual-application","p":87},{"i":98,"t":"To use the Groundlight SDK or API, you need a security token which we call an \"API Token.\" These authenticate you to Groundlight and authorize your code to use services in your account. API tokens look like api_2GdXMflhJ... and consist of a ksuid (a kind of sortable UUID) followed by a secret string.","s":"About API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#about-api-tokens","p":96},{"i":100,"t":"You should treat API tokens like passwords. Never check them directly into your code or share them. Please use best security practices with your API tokens, because if anybody gets your API token, they have nearly full control over your Groundlight account. Here are some best practices for handling API tokens: Store API tokens in a secure location, such as an encrypted vault. Use environment variables to store API tokens, rather than hardcoding them in your application. Limit the number of people who have access to API tokens. Rotate API tokens regularly and revoke old ones when they are no longer needed.","s":"Handling API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#handling-api-tokens","p":96},{"i":102,"t":"There are a couple of ways the SDK can find your API token: Environment variable (recommended): As a best practice, we recommend storing API tokens in the environment variable GROUNDLIGHT_API_TOKEN. This helps avoid accidentally committing the token to your code repository. The SDK will automatically look for the API token there, so you don't have to put it in your code at all. from groundlight import Groundlight # looks for API token in environment variable GROUNDLIGHT_API_TOKEN gl = Groundlight() Constructor argument: Alternatively, you can pass the API token directly to the Groundlight constructor. However, be cautious not to commit this code to your repository. from groundlight import Groundlight token = get_token_from_secure_location() gl = Groundlight(api_token=token)","s":"Using API Tokens with the SDK","u":"/python-sdk/docs/getting-started/api-tokens","h":"#using-api-tokens-with-the-sdk","p":96},{"i":104,"t":"You can manage your API tokens from the Groundlight website at https://app.groundlight.ai/reef/my-account/api-tokens.","s":"Creating and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-and-revoking-api-tokens","p":96},{"i":106,"t":"Log in to your Groundlight account and navigate to the API tokens page. Click the \"Create New API Token\" button. Give the new token a descriptive name, so you can easily identify it later. Click \"Create Token.\" Copy the generated token and store it securely, as you won't be able to see it again. Groundlight does not store a copy of your API tokens.","s":"Creating API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-api-tokens","p":96},{"i":108,"t":"On the API tokens page, you can see a list of your current tokens, along with the following information: Token Name: The descriptive name you assigned when creating the token Snippet (prefix): A short, unique identifier for each token Last used: The date and time the token was last used","s":"Viewing and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#viewing-and-revoking-api-tokens","p":96},{"i":110,"t":"Locate the token you want to revoke in the list. Click the \"Delete\" button next to the token. Confirm that you want to revoke the token. Note: Revoking an API token will immediately invalidate it and prevent any applications using it from accessing your Groundlight account. Be sure to update your applications with a new token before revoking an old one.","s":"To revoke an API token","u":"/python-sdk/docs/getting-started/api-tokens","h":"#to-revoke-an-api-token","p":96},{"i":112,"t":"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.","s":"A Fun Example: Dog-on-Couch Detector","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"","p":111},{"i":114,"t":"Groundlight SDK with Python 3.7 or higher A supported USB or network-connected camera A pre-recorded sound file (e.g., get_off_couch.mp3) A couch and a dog are recommended for proper end-to-end testing.","s":"Requirements","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#requirements","p":111},{"i":116,"t":"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library: pip install groundlight opencv-python pillow pyaudio","s":"Installation","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#installation","p":111},{"i":118,"t":"First, log in to the Groundlight application and get an API Token. Next, we'll write the Python script for the application. Import the required libraries: import time import cv2 from groundlight import Groundlight from PIL import Image import pyaudio import wave Define a function to capture an image from the camera using OpenCV: def capture_image(): cap = cv2.VideoCapture(0) ret, frame = cap.read() cap.release() if ret: # Convert to PIL image return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) else: return None Define a function to play the pre-recorded sound: def play_sound(file_path): CHUNK = 1024 wf = wave.open(file_path, 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(CHUNK) while data: stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate() Write the main application loop: gl = Groundlight() detector = gl.get_detector(\"Dog on Couch Detector\") while True: image = capture_image() if image: try: iq = gl.submit_image_query(image=image, detector=detector, wait=60) answer = iq.result.label if answer == \"YES\": print(\"Dog detected on the couch!\") play_sound(\"get_off_couch.mp3\") except Exception as e: print(f\"Error submitting image query: {e}\") else: print(\"Failed to capture image\") # Sleep for a minute before checking again time.sleep(60) This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If the dog is detected on the couch, it plays the pre-recorded sound using the play_sound function. Save the script as dog_on_couch_detector.py and run it: python dog_on_couch_detector.py","s":"Creating the Application","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#creating-the-application","p":111},{"i":121,"t":"This example demonstrates the application of Groundlight to a retail analytics solution, which monitors the usage of a service counter by customers throughout the day. The application creates a detector to identify when the service desk is being utilized by a customer. It checks the detector every minute, and once an hour, it prints out a summary of the percentage of time that the service counter is in use. At the end of the day, it emails the daily log. This retail analytics application can be beneficial in various ways: Staff allocation and scheduling: By analyzing the usage patterns of the service counter, store managers can optimize staff allocation and scheduling, ensuring that enough employees are available during peak hours and reducing wait times for customers. Identifying trends: The application can help identify trends in customer behavior, such as busier times of the day or specific days of the week with higher traffic. This information can be used to plan targeted marketing campaigns or promotions to increase sales and customer engagement. Improving store layout: Understanding when and how often customers use the service counter can provide insights into the effectiveness of the store's layout. Retailers can use this information to make data-driven decisions about rearranging the store layout to encourage customers to visit the service counter or explore other areas of the store. Customer satisfaction: By monitoring the usage of the service counter and proactively addressing long wait times or crowded areas, retailers can improve customer satisfaction and loyalty. A positive customer experience can lead to increased sales and return visits. To implement this retail analytics solution, a store would need to install a supported camera near the service counter, ensuring a clear view of the area. The camera would then be connected to a computer running the Groundlight-based application. Store managers would receive hourly summaries of the service counter usage and a daily log via email, enabling them to make informed decisions to improve store operations and customer experience.","s":"Tracking utilization of a customer service counter","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#tracking-utilization-of-a-customer-service-counter","p":119},{"i":123,"t":"Groundlight SDK with Python 3.7 or higher A supported USB or network-connected camera An email account with SMTP access to send the daily log","s":"Requirements","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#requirements","p":119},{"i":125,"t":"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK, OpenCV library, and other required libraries: pip install groundlight opencv-python pillow","s":"Installation","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#installation","p":119},{"i":127,"t":"First, log in to the Groundlight application and get an API Token. Next, we'll write the Python script for the application. Import the required libraries: import time import cv2 import smtplib from groundlight import Groundlight from PIL import Image from datetime import datetime, timedelta from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText Define a function to capture an image from the camera using OpenCV: def capture_image(): cap = cv2.VideoCapture(0) ret, frame = cap.read() cap.release() if ret: # Convert to PIL image return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) else: return None Define a function to send the daily log via email. You will need to customize this for your particular network environment. def send_email(sender, receiver, subject, body): msg = MIMEMultipart() msg['From'] = sender msg['To'] = receiver msg['Subject'] = subject msg.attach(MIMEText(body, 'plain')) server = smtplib.SMTP('smtp.example.com', 587) server.starttls() server.login(sender, \"your-password\") text = msg.as_string() server.sendmail(sender, receiver, text) server.quit() Define when your business's operating hours are: START_OF_BUSINESS = 9 # e.g. 9am END_OF_BUSINESS = 17 # e.g. 5pm def is_within_business_hours(): current_hour = datetime.now().hour return START_OF_BUSINESS <= current_hour < END_OF_BUSINESS Write the main application loop: gl = Groundlight() detector = gl.get_or_create_detector( name=\"counter-in-use\", query=\"Is there a customer at the service counter?\", # We can get away with relatively low confidence since we're aggregating confidence_threshold=0.8) DELAY = 60 log = [] daily_log = [] next_hourly_start = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1) while True: if not is_within_business_hours(): time.sleep(DELAY) continue image = capture_image() if not image: print(\"Failed to capture image\") time.sleep(DELAY) continue try: iq = gl.submit_image_query(image=image, detector=detector, wait=60) except Exception as e: print(f\"Error submitting image query: {e}\") time.sleep(DELAY) continue answer = iq.result.label log.append(answer) if datetime.now() >= next_hourly_start: next_hourly_start += timedelta(hours=1) percent_in_use = (log.count(\"YES\") / len(log)) * 100 current_time = datetime.now().replace(hour=START_OF_BUSINESS, minute=0, second=0) formatted_time = current_time.strftime(\"%I%p\") # like 3pm msg = f\"Hourly summary for {formatted_time}: {percent_in_use:.0f}% counter in use\" print(msg) daily_log.append(msg) log = [] current_hour = datetime.now().hour if current_hour == END_OF_BUSINESS and not daily_log == []: daily_summary = \"Daily summary:\\n\" for msg in daily_log: daily_summary += f\"{msg}\\n\" print(daily_summary) send_email(sender=\"counterbot@example.com\", receiver=\"manager@example.com\", subject=\"Daily Service Counter Usage Log\", body=daily_summary) daily_log = [] time.sleep(DELAY) This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If a customer is detected at the counter, it logs the event. Every hour, it prints a summary of the counter's usage percentage, and at the end of the day, it emails the daily log using the send_email function. Save the script as service_counter_monitor.py and run it: python service_counter_monitor.py","s":"Creating the Application","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#creating-the-application","p":119},{"i":130,"t":"With Groundlight's detectors, you can ask binary questions about images — i.e., the answer should be unambiguously \"YES\" or \"NO\". If you ask an ambiguous question, you may receive an \"UNSURE\" response. detector = gl.get_or_create_detector( name=\"Conveyor belt boxes\", query=\"Are there any cardboard boxes on the conveyor belt?\" ) image_query = gl.submit_image_query(detector=detector, image=some_image) # The SDK can return \"YES\" or \"NO\" (or \"UNSURE\") print(f\"The answer is {image_query.result.label}\") So, what makes a good question? Let's look at a few good ✅, moderate 🟡, and bad ❌ examples!","s":"Introduction","u":"/python-sdk/docs/getting-started/writing-queries","h":"#introduction","p":128},{"i":133,"t":"This question is binary and can be answered unambiguously with a simple \"YES\" or \"NO\" based on the image content.","s":"✅ Are there any cardboard boxes on the conveyor belt?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-are-there-any-cardboard-boxes-on-the-conveyor-belt","p":128},{"i":135,"t":"This question is okay, but it could be rephrased to be more specific. For example, \"Is the black trash can more than 80% full?\" tip With Groundlight, your questions may be routed to a machine learning model or a human reviewer. One way to improve your questions is to think, \"If I saw this question for the first time, would I know precisely what the person was trying to convey?\"","s":"🟡 Is the trash can full?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-trash-can-full","p":128},{"i":137,"t":"The query is very specific about what \"YES\" means. According to this query, any slight / partial opening would be considered \"NO\".","s":"✅ Is the garage door completely closed?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-garage-door-completely-closed","p":128},{"i":139,"t":"This question is somewhat ambiguous. Different people may have different opinions on what is nice weather. Instead, you might ask \"Can you see any clouds in the sky?\"","s":"🟡 Is the weather nice out?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-weather-nice-out","p":128},{"i":141,"t":"This is not a binary question — \"YES\" and \"NO\" don't make sense in this context. Also, it's not clear what the \"thing\" refers to.","s":"❌ Where is the thing?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-where-is-the-thing","p":128},{"i":143,"t":"While this question is binary, \"cleanliness\" can be somewhat subjective. An improved version could be: \"Are there any visible spills or clutter on the factory floor?\"","s":"🟡 Is the factory floor clean and organized?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-factory-floor-clean-and-organized","p":128},{"i":145,"t":"Welcome to the Groundlight SDK installation guide. In this guide, you'll find step-by-step instructions on how to install and set up the Groundlight SDK on various platforms.","s":"Installation","u":"/python-sdk/docs/installation","h":"","p":144},{"i":147,"t":"Choose your platform from the list below and follow the instructions in the corresponding guide: Linux macOS Windows Raspberry Pi NVIDIA Jetson Linux with Monitoring Notification Server ESP32 Camera Device After completing the installation process for your platform, you'll be ready to start building visual applications using the Groundlight SDK.","s":"Platform-specific Installation Guides","u":"/python-sdk/docs/installation","h":"#platform-specific-installation-guides","p":144},{"i":149,"t":"This guide will help you install the Groundlight SDK on Linux. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on Linux","u":"/python-sdk/docs/installation/linux","h":"","p":148},{"i":151,"t":"Ensure that you have the following installed on your system: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/linux","h":"#prerequisites","p":148},{"i":153,"t":"Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/linux","h":"#basic-installation","p":148},{"i":155,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip install groundlight If you're also using python2 on your system, you might need to use pip3 instead: pip3 install groundlight The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#installing-groundlight-sdk","p":148},{"i":157,"t":"To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner: python -c \"import groundlight; print(groundlight.__version__)\"","s":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/linux","h":"#checking-groundlight-sdk-version","p":148},{"i":159,"t":"If you need to upgrade the Groundlight SDK to the latest version, use the following pip command: pip install --upgrade groundlight Or, if you're using pip3: pip3 install --upgrade groundlight After upgrading, you can use the Python one-liner mentioned in the \"Checking Groundlight SDK Version\" section to verify that the latest version is now installed.","s":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#upgrading-groundlight-sdk","p":148},{"i":161,"t":"To check your installed Python version, open a terminal and run: python --version If you see a version number starting with \"3.7\" or higher (e.g., \"3.7.5\" or \"3.9.0\"), you're good to go. If not, you might need to upgrade Python on your system.","s":"Getting the right Python Version","u":"/python-sdk/docs/installation/linux","h":"#getting-the-right-python-version","p":148},{"i":163,"t":"Use your distribution's package manager to install the latest Python version: For Ubuntu or Debian-based systems: sudo apt update sudo apt install python3 (For Ubuntu 18.04 see note below.) For Fedora-based systems: sudo dnf install python3 For Arch Linux: sudo pacman -S python After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.","s":"Upgrading Python on Linux","u":"/python-sdk/docs/installation/linux","h":"#upgrading-python-on-linux","p":148},{"i":165,"t":"Ubuntu 18.04 still uses python 3.6 by default, which is end-of-life. We generally recommend using python 3.10. If you know how to install py3.10, please go ahead. But the easiest version of python 3 to use with Ubuntu 18.04 is python 3.8, which can be installed as follows without adding any extra repositories: # Prepare Ubuntu to install things sudo apt-get update # Install the basics sudo apt-get install -y python3.8 python3.8-distutils curl # Configure `python3` to run python3.8 by default sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 10 # Download and install pip3.8 curl https://bootstrap.pypa.io/get-pip.py > /tmp/get-pip.py sudo python3.8 /tmp/get-pip.py # Configure `pip3` to run pip3.8 sudo update-alternatives --install /usr/bin/pip3 pip3 $(which pip3.8) 10 # Now we can install Groundlight! pip3 install groundlight","s":"Special note about Ubuntu 18.04","u":"/python-sdk/docs/installation/linux","h":"#special-note-about-ubuntu-1804","p":148},{"i":167,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/linux","h":"#ready-to-go","p":148},{"i":169,"t":"This guide will help you install the Groundlight SDK on macOS. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on macOS","u":"/python-sdk/docs/installation/macos","h":"","p":168},{"i":171,"t":"Ensure that you have the following installed on your system: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/macos","h":"#prerequisites","p":168},{"i":173,"t":"Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/macos","h":"#basic-installation","p":168},{"i":175,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip install groundlight If you're also using python2 on your system, you might need to use pip3 instead: pip3 install groundlight The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#installing-groundlight-sdk","p":168},{"i":177,"t":"To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner: python -c \"import groundlight; print(groundlight.__version__)\"","s":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/macos","h":"#checking-groundlight-sdk-version","p":168},{"i":179,"t":"If you need to upgrade the Groundlight SDK to the latest version, use the following pip command: pip install --upgrade groundlight Or, if you're using pip3: pip3 install --upgrade groundlight After upgrading, you can use the Python one-liner mentioned in the \"Checking Groundlight SDK Version\" section to verify that the latest version is now installed.","s":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#upgrading-groundlight-sdk","p":168},{"i":181,"t":"To check your installed Python version, open a terminal and run: python --version If you see a version number starting with \"3.7\" or higher (e.g., \"3.7.5\" or \"3.9.0\"), you're good to go. If not, you might need to upgrade Python on your system.","s":"Getting the right Python Version","u":"/python-sdk/docs/installation/macos","h":"#getting-the-right-python-version","p":168},{"i":183,"t":"Download the latest Python installer from the official Python website and run it, or use Homebrew to install Python: brew install python After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.","s":"Upgrading Python on MacOS","u":"/python-sdk/docs/installation/macos","h":"#upgrading-python-on-macos","p":168},{"i":185,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/macos","h":"#ready-to-go","p":168},{"i":187,"t":"This is the easiest way to deploy your Groundlight detectors on a linux computer. All configuration is done through a web user interface, and no code development is required.","s":"Monitoring Notification Server","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"","p":186},{"i":189,"t":"Internet connected linux computer Video source (USB camera or RTSP stream) Groundlight API Key (available from groundlight.ai)","s":"Prerequisites","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#prerequisites","p":186},{"i":191,"t":"Install Docker on your computer. See Docker's installation instructions. Create a new file called docker-compose.yml in your project directory. Copy the following into it: services: frontend: image: docker.io/groundlight/monitoring-notification-server-frontend:latest ports: - \"3000:3000\" depends_on: - backend backend: image: docker.io/groundlight/monitoring-notification-server-backend:latest ports: - \"8000:8000\" devices: - /dev/video0:/dev/video0 - /dev/video1:/dev/video1 - /dev/video2:/dev/video2 - /dev/video3:/dev/video3 privileged: true volumes: - /dev/bus/usb:/dev/bus/usb Run the following command in your project directory: docker-compose up If installed locally, open http://localhost:3000 in your browser. If installed on a remote device, replace localhost with the IP address of your device. You should see the following page:","s":"Deployment","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#deployment","p":186},{"i":193,"t":"This guide will help you install the Groundlight SDK on NVIDIA Jetson devices. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on NVIDIA Jetson","u":"/python-sdk/docs/installation/nvidia-jetson","h":"","p":192},{"i":195,"t":"Ensure that you have the following installed on your NVIDIA Jetson: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#prerequisites","p":192},{"i":197,"t":"Assuming you have Python 3.7 or higher installed on your NVIDIA Jetson, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#basic-installation","p":192},{"i":199,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip3 install groundlight An ARM-compatible version will automatically get installed. The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#installing-groundlight-sdk","p":192},{"i":201,"t":"If you have docker installed on your NVIDIA Jetson, you can even just run docker run groundlight/stream as we publish an ARM version of our streaming application to Docker Hub.","s":"Using RTSP Streams","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#using-rtsp-streams","p":192},{"i":203,"t":"For a complete end-to-end example of running on an NVIDIA Jetson, see this GitHub repo.","s":"Sample application","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#sample-application","p":192},{"i":205,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and [Building Applications","s":"Ready to go!","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#ready-to-go","p":192},{"i":208,"t":"The Groundlight SDK is optimized to run on small edge devices. As such, you can use the Groundlight SDK without installing large libraries like numpy or OpenCV. But if you're already installing them, we'll use them. Our SDK detects if these libraries are installed and will make use of them if they're present. If not, we'll gracefully degrade, and tell you what's wrong if you try to use these features.","s":"Smaller is better!","u":"/python-sdk/docs/installation/optional-libraries","h":"#smaller-is-better","p":206},{"i":210,"t":"The PIL library offers a bunch of standard utilities for working with images in python. The Groundlight SDK can work without PIL. Because PIL is not very large, and is quite useful, we install it by default with the normal build of the Groundlight SDK. So when you pip3 install groundlight it comes with the pillow version of the PIL library already installed.","s":"PIL - optional but default installed","u":"/python-sdk/docs/installation/optional-libraries","h":"#pil---optional-but-default-installed","p":206},{"i":212,"t":"If you are extremely space constrained, you can install the Groundlight SDK from source without PIL and it will work properly, but with reduced functionality. Specifically, you will need to convert your images into JPEG format yourself. The SDK normally relies on PIL to do JPEG compression (which is a non-trivial algorithm), and the API requires images to be in JPEG format. However on space-constrained platforms, sometimes this conversion is done in hardware, and so we don't want to force you to install PIL if you don't need it.","s":"Working without PIL","u":"/python-sdk/docs/installation/optional-libraries","h":"#working-without-pil","p":206},{"i":214,"t":"These commonly-used libraries are not installed by default, because they are quite large, and their installation can often cause conflicts with other dependent libraries. If you want to use them, install them directly.","s":"Numpy, OpenCV - fully optional","u":"/python-sdk/docs/installation/optional-libraries","h":"#numpy-opencv---fully-optional","p":206},{"i":216,"t":"This guide will help you install the Groundlight SDK on Raspberry Pi. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on Raspberry Pi","u":"/python-sdk/docs/installation/raspberry-pi","h":"","p":215},{"i":218,"t":"Ensure that you have the following installed on your Raspberry Pi: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/raspberry-pi","h":"#prerequisites","p":215},{"i":220,"t":"Assuming you have Python 3.7 or higher installed on your Raspberry Pi, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/raspberry-pi","h":"#basic-installation","p":215},{"i":222,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip3 install groundlight An ARM-compatible version will automatically get installed. The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/raspberry-pi","h":"#installing-groundlight-sdk","p":215},{"i":224,"t":"If you have docker installed on your Raspberry Pi, you can even just run docker run groundlight/stream as we publish an ARM version of our streaming application to Docker Hub.","s":"Using RTSP Streams","u":"/python-sdk/docs/installation/raspberry-pi","h":"#using-rtsp-streams","p":215},{"i":226,"t":"For a complete end-to-end example of running on a Raspberry Pi, see this GitHub repo.","s":"Sample application","u":"/python-sdk/docs/installation/raspberry-pi","h":"#sample-application","p":215},{"i":228,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/raspberry-pi","h":"#ready-to-go","p":215},{"i":230,"t":"This guide will help you install the Groundlight SDK on Windows. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on Windows","u":"/python-sdk/docs/installation/windows","h":"","p":229},{"i":232,"t":"Ensure that you have the following installed on your system: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/windows","h":"#prerequisites","p":229},{"i":234,"t":"Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/windows","h":"#basic-installation","p":229},{"i":236,"t":"To install the Groundlight SDK using pip, run the following command in your Command Prompt: pip install groundlight If you're also using python2 on your system, you might need to use pip3 instead: pip3 install groundlight The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#installing-groundlight-sdk","p":229},{"i":238,"t":"To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner: python -c \"import groundlight; print(groundlight.__version__)\"","s":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/windows","h":"#checking-groundlight-sdk-version","p":229},{"i":240,"t":"If you need to upgrade the Groundlight SDK to the latest version, use the following pip command: pip install --upgrade groundlight Or, if you're using pip3: pip3 install --upgrade groundlight After upgrading, you can use the Python one-liner mentioned in the \"Checking Groundlight SDK Version\" section to verify that the latest version is now installed.","s":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#upgrading-groundlight-sdk","p":229},{"i":242,"t":"To check your installed Python version, open a Command Prompt and run: python --version If you see a version number starting with \"3.7\" or higher (e.g., \"3.7.5\" or \"3.9.0\"), you're good to go. If not, you might need to upgrade Python on your system.","s":"Getting the right Python Version","u":"/python-sdk/docs/installation/windows","h":"#getting-the-right-python-version","p":229},{"i":244,"t":"Download the latest Python installer from the official Python website and run it. After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.","s":"Upgrading Python on Windows","u":"/python-sdk/docs/installation/windows","h":"#upgrading-python-on-windows","p":229},{"i":246,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/windows","h":"#ready-to-go","p":229},{"i":248,"t":"Groundlight supplies a tool for no-code deployment of a detector to an ESP32 Camera board. You can find it at https://iot.groundlight.ai/espcam.","s":"No-Code IoT Deployment","u":"/python-sdk/docs/iot","h":"","p":247},{"i":250,"t":"This tool is designed to make it as easy as possible to deploy your Groundlight detector on an ESP32 Camera Board. You can deploy your detector in just a few clicks. Go to https://iot.groundlight.ai/espcam Plug your ESP32 Camera Board into your computer with a USB cable. Click through the steps to upload your detector to your ESP32 Camera Board. When prompted, allow your browser access to the serial port, so that it can program the device. If you don't see a prompt like this, try using a current version of Chrome or another browser that supports Web Serial.","s":"Easy Deployment","u":"/python-sdk/docs/iot","h":"#easy-deployment","p":247},{"i":252,"t":"The tool supports the following notification options for your deployed detector: Email SMS (With Twilio) Slack","s":"Notification Options","u":"/python-sdk/docs/iot","h":"#notification-options","p":247},{"i":254,"t":"Tested with the following boards. Many other ESP32 boards should work as well, but may require building the firmware from source and changing the IO pin definitions. M5Stack ESP32 PSRAM Timer Camera [purchase here] M5Stack ESP32 PSRAM Timer Camera X [purchase here] ESP32-CAM [purchase here] SeeedStudio ESP32S3 Sense [purchase here]","s":"Multiple Supported Boards","u":"/python-sdk/docs/iot","h":"#multiple-supported-boards","p":247},{"i":256,"t":"The source code is written as an Arduino-based PlatformIO project for ESP32, and is available on GitHub at https://github.com/groundlight/esp32cam If you need assistance or have questions about integrating Groundlight with Arduino, please consider opening an issue on the GitHub repository or reaching out to our support team.","s":"Source Code","u":"/python-sdk/docs/iot","h":"#source-code","p":247}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,0.635,1,3.391,2,3.391,3,1.92,4,2.184,5,3.391,6,2.55,7,2.668,8,1.762,9,4.195,10,2.804,11,4.406,12,3.291,13,4.195,14,2.043,15,4.195,16,2.444,17,4.14,18,1.307,19,4.195,20,3.153,21,3.153,22,4.195,23,3.391,24,2.962,25,2.668,26,3.153,27,4.195,28,2.962,29,4.195,30,1.278,31,3.391,32,4.195,33,2.043,34,4.195,35,3.71,36,4.195]],["t/5",[0,0.614,5,5.28,12,3.181,37,5.777,38,4.909,39,5.777,40,2.904,41,5.777]],["t/7",[0,0.483,18,1.602,42,3.63,43,5.141,44,4.156,45,5.141,46,4.156,47,5.296,48,5.141,49,4.547,50,4.547,51,5.141,52,4.547,53,3.436,54,2.773,55,4.156,56,2.75,57,4.547,58,2.773,59,2.995,60,5.141,61,2.587]],["t/9",[2,4.263,4,3.561,8,2.215,10,3.525,16,3.072,28,3.724,30,1.606,42,3.724,62,4.664,63,2.414,64,4.664,65,3.205,66,6.049,67,2.568,68,5.273,69,5.273,70,2.568,71,4.664,72,5.273,73,3.724,74,5.273]],["t/11",[8,2.056,28,3.457,42,3.457,54,2.641,63,2.982,75,4.895,76,3.959,77,7.803,78,6.514,79,4.33,80,3.457,81,3.272,82,2.975,83,3.957,84,4.895,85,3.679,86,4.895,87,4.895,88,3.679,89,4.33,90,3.679,91,4.895,92,3.957]],["t/13",[0,0.577,3,2.811,4,3.197,6,3.732,7,3.906,12,2.991,54,3.313,93,4.337,94,5.431,95,4.964,96,4.337,97,4.105]],["t/15",[0,0.638,2,1.953,3,1.772,4,2.015,5,1.953,6,2.353,7,2.462,11,1.816,12,3.15,16,1.408,17,2.734,18,0.753,28,1.706,30,1.475,33,1.177,35,2.137,46,1.953,54,1.303,65,1.469,94,2.137,95,1.953,96,2.734,97,1.615,98,2.416,99,2.416,100,2.168,101,1.408,102,1.816,103,0.827,104,1.706,105,2.416,106,2.168,107,3.871,108,2.416,109,3.915,110,2.416,111,2.137,112,3.64,113,3.915,114,1.816,115,2.734,116,2.137,117,2.416,118,1.615,119,2.137,120,2.91,121,1.953,122,2.137,123,2.416,124,2.137,125,2.137,126,1.816,127,1.408,128,2.588,129,1.615,130,2.416,131,2.137,132,2.416,133,3.424,134,2.944,135,2.137,136,1.953,137,1.953,138,1.615,139,2.137,140,2.462,141,2.416,142,1.953,143,2.137,144,2.416,145,2.137,146,2.416,147,2.137,148,2.416,149,2.416,150,1.816,151,2.137,152,1.816,153,1.408,154,2.137]],["t/17",[0,0.547,1,3.357,20,3.121,30,1.265,54,2.24,70,2.022,127,2.419,133,3.673,134,4.085,138,3.891,155,2.932,156,4.746,157,3.357,158,3.673,159,5.821,160,3.121,161,4.869,162,2.445,163,3.673,164,4.705,165,2.162,166,4.152,167,3.673,168,4.152,169,3.121,170,4.152,171,4.152,172,4.152,173,3.673,174,2.776,175,4.152,176,3.357]],["t/19",[0,0.538,18,1.102,21,1.625,30,1.077,67,1.053,70,2.187,73,1.527,109,2.86,134,1.314,136,1.747,155,1.527,156,3.664,161,3.825,162,1.486,164,2.86,165,1.125,169,1.625,177,0.884,178,0.644,179,0.551,180,0.406,181,4.49,182,2.162,183,1.625,184,1.445,185,1.527,186,2.422,187,3.129,188,2.162,189,1.912,190,1.747,191,1.314,192,1.527,193,1.912,194,2.162,195,2.162,196,1.908,197,1.912,198,2.162,199,2.162,200,3.664,201,2.162,202,2.162,203,2.162,204,1.527,205,2.162,206,2.162,207,2.162,208,1.375,209,1.912,210,2.162,211,2.162,212,1.747,213,2.659,214,3.971,215,1.912,216,1.912,217,1.912,218,1.912,219,2.86,220,2.162,221,3.537,222,1.697,223,1.625,224,3.129,225,2.59,226,1.747,227,1.747,228,1.747,229,1.625,230,1.912,231,1.747,232,1.445,233,1.912,234,1.625,235,1.912,236,1.912,237,1.625,238,1.125,239,2.659,240,1.259,241,1.912,242,1.625,243,1.912,244,2.162,245,1.912,246,1.527,247,1.445,248,1.912,249,1.912]],["t/21",[0,0.526,18,0.767,30,0.749,54,3.299,63,2.8,67,1.198,81,1.644,100,1.377,134,1.495,137,3.174,138,1.644,160,1.849,161,3.276,162,2.35,164,3.174,165,1.281,173,3.473,177,1.005,178,0.732,179,0.627,180,0.462,186,2.644,187,2.176,189,2.176,200,3.461,204,2.773,213,1.849,214,2.176,218,2.176,222,0.929,225,2.888,226,1.988,227,1.988,240,1.433,247,2.625,250,1.988,251,2.176,252,2.46,253,3.927,254,2.46,255,2.176,256,4.901,257,1.988,258,2.176,259,2.46,260,2.46,261,5.595,262,2.46,263,1.737,264,4.901,265,1.565,266,3.962,267,4.901,268,4.901,269,3.927,270,2.176,271,1.849,272,2.46,273,1.988]],["t/23",[0,0.663,14,1.299,30,0.812,40,1.186,67,1.299,109,3.385,136,3.385,137,4.178,156,1.884,162,2.459,184,1.783,185,1.884,186,3.809,192,1.884,200,5.31,204,1.884,208,1.697,209,2.359,217,2.359,222,1.582,225,2.905,226,2.156,227,2.156,238,1.389,240,3.012,241,2.359,242,2.005,263,3.65,270,3.704,274,1.884,275,2.667,276,2.667,277,2.667,278,3.704,279,4.187,280,2.957,281,3.385,282,2.667,283,2.156,284,2.359,285,2.667,286,2.359,287,1.554,288,2.667,289,2.667,290,2.667,291,2.667,292,2.667,293,2.667,294,2.359]],["t/25",[56,2.272,64,4.916,71,4.916,120,4.178,140,4.951,178,1.655,295,3.716,296,3.716,297,3.925,298,4.178,299,3.925,300,4.494,301,5.558,302,4.494,303,3.925,304,5.558,305,5.558]],["t/27",[0,0.516,18,1.405,47,2.073,63,1.344,76,1.784,80,2.073,82,1.784,114,2.206,127,1.71,134,3.338,140,5.026,162,2.589,180,0.551,186,1.583,208,2.868,274,2.073,297,2.073,306,6.21,307,2.935,308,2.935,309,4.127,310,1.867,311,1.867,312,2.935,313,2.935,314,2.206,315,2.935,316,2.935,317,1.867,318,2.935,319,5.451,320,2.372,321,2.935,322,2.935,323,2.596,324,2.596,325,1.962,326,2.596,327,2.935,328,2.206,329,2.935,330,2.073,331,2.935,332,2.372,333,2.596,334,2.596,335,2.596,336,3.988,337,2.596,338,4.509,339,2.935,340,2.935,341,2.935,342,2.935,343,2.935]],["t/29",[0,0.747,18,1.602,114,3.864,140,3.27,179,1.31,180,0.965,222,1.943,225,1.848,266,4.156,306,5.95,323,4.547,344,4.547,345,2.426,346,5.141,347,5.141,348,5.141,349,3.436,350,4.156,351,4.547,352,5.141,353,5.141]],["t/31",[106,3.439,153,3.578,180,1.153,287,3.578,354,6.141,355,4.105,356,4.964,357,6.141,358,5.431,359,3.578,360,4.337,361,4.615]],["t/33",[0,0.73,106,2.709,162,2.032,165,2.518,180,0.908,222,2.442,225,2.615,287,3.765,345,2.283,362,4.279,363,3.234,364,3.416,365,3.911,366,3.911,367,4.837,368,5.224,369,3.077,370,4.837,371,6.462,372,4.837,373,4.837]],["t/35",[0,0.491,65,2.172,70,2.546,106,3.461,162,1.501,180,0.671,222,1.35,223,2.686,225,2.717,228,2.889,229,2.686,230,3.161,231,2.889,232,2.389,233,3.161,235,3.161,236,3.161,237,2.686,238,1.86,239,5.112,248,3.161,249,3.161,281,2.889,355,2.389,356,2.889,359,3.046,360,2.524,361,2.686,363,2.389,364,2.524,374,2.524,375,3.161,376,5.227,377,2.273,378,2.889,379,4.997,380,2.889,381,3.161,382,2.889,383,3.574,384,4.226,385,3.161,386,3.161]],["t/37",[0,0.351,14,1.82,16,2.177,28,2.639,90,2.808,106,2.092,162,1.569,180,0.701,222,1.412,225,1.941,231,3.02,359,2.177,360,4.477,361,2.808,362,3.305,365,3.02,377,2.377,378,4.365,379,4.365,380,3.02,386,3.305,387,3.736,388,3.02,389,3.305,390,3.736,391,3.305,392,3.736,393,3.736,394,3.736,395,3.736,396,3.736,397,3.736,398,3.736,399,2.639,400,3.736,401,3.736,402,3.736,403,3.736,404,3.736,405,3.736,406,3.736,407,5.399,408,3.736,409,3.736,410,3.736,411,3.736,412,3.736,413,3.305,414,3.736]],["t/39",[0,0.522,6,1.477,18,0.757,30,0.74,55,1.965,90,1.827,93,1.716,96,1.716,106,3.112,162,2.554,165,1.265,177,0.993,180,0.456,193,2.15,196,1.311,225,1.997,246,2.747,281,1.965,335,3.44,355,1.625,359,2.833,360,3.434,361,2.923,365,1.965,377,1.546,378,4.493,379,5.504,380,4.493,381,2.15,382,1.965,388,1.965,389,3.44,413,4.301,415,2.43,416,3.44,417,2.43,418,2.43,419,2.43,420,2.43,421,2.43,422,2.43,423,2.15,424,2.43,425,1.625,426,2.43,427,3.889,428,3.889,429,2.15,430,2.43,431,2.43,432,2.15,433,2.43,434,1.827,435,2.43,436,2.43,437,2.43,438,2.43,439,2.43,440,2.43,441,2.43,442,2.43,443,2.923,444,2.43,445,2.15,446,1.827,447,2.15,448,3.889,449,2.15,450,2.15,451,2.43,452,2.43,453,2.43,454,1.546,455,2.43]],["t/41",[1,3.498,40,1.924,53,2.893,55,5.554,57,3.828,65,2.63,111,6.077,155,4.231,157,3.498,162,3.115,280,3.056,325,2.893,355,4.593,358,3.828,374,3.056,456,4.327,457,4.843,458,5.99,459,6.871,460,3.828,461,4.327,462,3.828,463,3.828,464,3.828,465,5.99]],["t/43",[0,0.508,10,3.618,12,2.636,14,2.636,25,3.442,59,3.153,88,4.067,100,3.031,127,3.153,128,4.649,129,4.649,180,1.016,466,5.412,467,2.273,468,5.412,469,5.412,470,4.375,471,4.067,472,3.442]],["t/45",[0,0.46,14,1.912,52,2.176,88,1.849,127,2.288,131,4.335,180,0.462,222,1.484,225,2.849,296,2.625,328,1.849,345,1.161,355,1.644,457,1.988,467,1.649,473,4.205,474,1.988,475,2.46,476,4.335,477,2.46,478,1.737,479,3.927,480,1.737,481,1.988,482,1.988,483,3.927,484,2.46,485,2.46,486,2.46,487,1.988,488,2.46,489,2.46,490,1.849,491,1.988,492,2.46,493,2.176,494,2.46,495,3.927,496,3.927,497,2.46,498,2.46,499,1.988,500,2.46,501,3.927,502,4.901,503,2.46,504,2.46,505,2.46,506,2.176,507,4.901,508,3.927,509,2.46,510,2.46,511,2.46,512,1.988,513,2.46,514,2.46,515,2.46,516,2.46,517,2.176,518,2.46,519,2.46,520,2.46,521,3.927,522,2.46,523,2.176,524,2.46,525,1.988,526,2.176,527,2.176,528,2.46,529,2.46,530,2.46,531,2.46,532,2.46]],["t/47",[0,0.586,10,4.167,14,3.036,65,3.789,129,4.167,180,1.17,470,5.04,472,3.965,533,5.04,534,4.403,535,5.04]],["t/49",[59,3.283,472,4.54,476,4.984,478,3.979,493,4.984,536,4.984,537,3.979,538,5.635,539,5.635,540,4.984,541,5.635,542,5.635,543,3.979,544,5.635,545,5.635,546,5.635,547,4.235]],["t/51",[0,0.537,61,2.875,63,3.296,128,4.812,180,1.072,478,4.035,537,4.035,548,5.053,549,4.294,550,5.713,551,5.713,552,5.713,553,5.053,554,5.713,555,5.053]],["t/53",[33,2.636,61,2.723,63,2.478,116,4.787,472,3.442,473,4.067,547,4.067,556,4.649,557,5.412,558,3.618,559,5.412,560,5.412,561,4.375,562,5.412,563,4.787,564,3.289,565,5.412,566,5.412,567,5.412,568,5.412]],["t/55",[59,3.112,61,2.688,63,2.445,126,4.015,128,3.57,303,3.772,324,4.724,454,3.398,472,3.398,526,4.724,547,5.184,569,4.724,570,5.341,571,5.341,572,5.341,573,5.341,574,5.341,575,5.341,576,5.341,577,4.318,578,4.724]],["t/57",[63,2.511,128,3.666,129,3.666,215,4.851,232,3.666,471,4.122,472,3.488,473,4.122,561,4.433,579,5.484,580,5.484,581,3.195,582,5.484,583,5.484,584,5.484,585,5.484,586,5.484,587,5.484,588,4.851,589,4.851]],["t/59",[0,0.449,12,2.329,16,2.786,30,1.456,61,2.406,63,2.189,103,1.637,126,3.594,127,2.786,128,4.286,129,4.286,180,0.897,382,3.865,460,4.229,470,3.865,471,3.594,472,3.041,473,3.594,534,3.377,535,3.865,536,4.229,547,3.594,581,3.736,590,3.865,591,4.781,592,4.781,593,4.781,594,4.781]],["t/61",[0,0.439,3,2.89,4,3.287,6,2.84,7,2.972,12,2.276,17,3.3,33,2.276,54,2.52,95,3.777,96,4.459,97,3.123,118,3.123,140,2.972,326,4.133,595,4.672,596,3.777,597,4.672,598,4.672,599,4.133,600,3.512,601,4.133,602,4.672,603,2.972,604,4.133,605,3.777,606,4.672,607,4.672,608,4.672,609,4.133]],["t/63",[3,2.068,4,2.352,6,2.746,7,2.874,23,3.652,30,1.376,33,2.2,59,2.632,153,2.632,161,4.125,176,3.652,596,3.652,603,2.874,610,4.518,611,4.518,612,6.171,613,5.458,614,4.518,615,4.518,616,4.518,617,3.996,618,4.518,619,4.518,620,4.518,621,4.518,622,4.518,623,3.996,624,4.518,625,4.518,626,4.518,627,4.518,628,4.518,629,4.518]],["t/65",[3,2.189,4,2.489,6,2.906,7,3.041,61,2.406,153,2.786,160,3.594,325,3.196,577,3.865,578,4.229,599,4.229,600,4.819,603,3.041,613,4.229,630,4.229,631,3.865,632,4.781,633,4.229,634,4.781,635,4.781,636,6.412,637,4.229,638,4.781,639,4.781,640,4.781,641,4.781,642,4.781,643,4.781,644,4.229]],["t/67",[3,2.89,4,3.287,8,1.963,61,2.351,97,3.123,118,3.123,153,2.722,177,1.91,302,3.777,391,4.133,577,3.777,603,2.972,605,3.777,609,6.324,645,3.777,646,4.672,647,4.672,648,4.133,649,4.672,650,4.133,651,4.672,652,4.672,653,4.672,654,4.672,655,4.672,656,4.672,657,4.672,658,4.672,659,4.672]],["t/69",[3,2.046,4,2.326,30,1.361,59,2.604,97,2.987,118,2.987,153,2.604,154,3.953,155,3.156,176,3.613,299,3.156,349,2.987,356,3.613,553,3.953,603,3.896,604,5.417,617,3.953,623,5.417,637,3.953,660,3.613,661,4.469,662,4.469,663,4.469,664,4.469,665,3.156,666,4.469,667,4.469,668,4.469,669,3.613,670,4.469,671,4.469,672,4.469,673,4.469,674,4.469]],["t/71",[3,2.653,4,3.016,6,3.522,7,3.685,33,2.822,96,4.092,97,3.873,102,4.355,113,4.684,153,3.376,603,3.685,605,4.684,675,5.794,676,4.355,677,5.794,678,5.794]],["t/73",[0,0.395,8,0.653,14,1.306,20,1.169,23,1.257,24,1.894,31,1.257,33,1.722,40,0.691,67,0.758,80,2.497,81,1.04,83,1.257,115,4.504,118,1.04,119,1.376,120,2.657,121,2.168,122,3.719,124,3.127,125,3.127,134,1.63,138,2.811,152,2.016,162,2.334,165,0.81,183,1.169,186,2.268,190,3.835,191,1.63,196,0.839,200,1.098,222,1.336,225,1.997,240,1.563,242,2.016,245,2.372,246,1.098,247,1.04,263,1.098,274,3.663,280,1.098,287,0.906,294,1.376,297,2.497,300,2.858,332,1.257,345,0.734,364,1.098,369,0.989,399,1.098,450,1.376,481,1.257,490,1.169,525,1.257,534,1.098,660,1.257,665,1.098,679,1.555,680,1.376,681,2.372,682,1.376,683,1.257,684,3.399,685,1.555,686,1.376,687,1.257,688,1.169,689,1.376,690,1.555,691,1.04,692,1.098,693,1.376,694,1.257,695,1.555,696,1.555,697,1.555,698,2.682,699,2.372,700,1.793,701,2.682,702,0.712,703,1.555,704,2.372,705,1.376,706,1.555,707,1.555,708,1.555,709,1.555,710,1.376,711,1.376,712,1.555,713,1.376,714,1.555,715,1.555,716,1.555,717,1.555,718,2.372,719,2.016,720,1.376,721,1.555,722,1.376,723,1.475,724,1.376,725,1.376,726,0.945,727,1.257,728,1.555,729,1.555,730,1.555,731,1.555,732,1.555,733,1.376,734,2.682,735,1.555,736,1.555,737,1.555,738,1.555,739,1.257,740,1.555,741,1.555,742,1.555,743,1.555,744,2.682,745,1.376,746,1.555]],["t/76",[0,0.631,16,2.419,18,1.814,40,1.846,67,3.273,150,3.121,163,3.673,186,3.14,222,1.569,225,2.092,238,2.162,345,1.96,369,2.641,549,3.121,669,3.357,691,3.891,700,2.776,747,4.152,748,4.152,749,7.284,750,5.821,751,3.121,752,4.152,753,3.121,754,4.152,755,3.357,756,4.152,757,4.152,758,3.673,759,3.673,760,4.152,761,4.152]],["t/78",[0,0.781,67,3.131,222,2.43,225,2.783,345,3.034,762,6.429]],["t/80",[0,0.696,25,4.712,73,3.542,112,4.975,138,4.424,222,1.895,225,2.944,345,2.367,763,4.436,764,5.854,765,5.015,766,4.436,767,4.436,768,4.436,769,5.015,770,4.436]],["t/82",[0,0.7,18,1.582,101,2.958,165,3.474,186,3.6,200,3.585,222,1.918,225,2.398,240,2.958,243,4.491,319,4.491,345,2.396,364,3.585,474,4.104,691,3.394,700,3.394,727,4.104,771,4.491,772,4.491,773,5.077,774,5.077]],["t/84",[0,0.696,25,4.712,73,3.542,138,4.424,222,1.895,225,2.944,345,2.367,763,4.436,764,5.854,766,4.436,767,4.436,768,4.436,770,4.436,775,6.619,776,5.015,777,5.015]],["t/86",[0,0.583,14,1.45,30,0.907,115,2.103,121,2.407,129,1.99,134,1.81,162,2.328,186,1.606,196,1.606,216,2.633,222,2.094,225,2.406,240,2.657,242,2.238,250,2.407,251,2.633,265,2.9,274,2.103,280,2.103,287,1.735,297,2.103,345,1.405,363,1.99,364,2.103,369,1.894,377,1.894,446,2.238,481,2.407,517,2.633,525,2.407,561,2.407,669,2.407,681,2.633,684,2.407,694,3.686,705,2.633,710,2.633,711,2.633,718,2.633,722,2.633,727,3.686,753,2.238,758,2.633,778,1.894,779,2.977,780,2.103,781,2.238,782,2.977,783,2.633,784,2.977,785,4.033,786,2.977,787,2.633,788,2.977,789,2.633,790,2.977,791,2.977,792,2.407,793,2.103,794,2.407,795,2.407,796,1.894,797,2.977,798,2.977,799,2.977,800,2.977]],["t/89",[0,0.611,3,1.792,4,2.038,8,1.644,10,2.617,21,2.942,65,2.379,162,1.644,179,1.423,180,0.735,191,2.379,222,1.479,225,2.696,240,2.281,263,2.765,286,3.462,345,1.848,366,3.165,369,2.49,377,2.49,429,3.462,432,3.462,533,3.165,719,2.942,781,2.942,787,3.462,794,3.165,795,3.165,796,2.49,801,3.914,802,3.462,803,3.462,804,2.942,805,3.462,806,3.462,807,3.914,808,3.914,809,3.914,810,3.462,811,3.914,812,3.914,813,3.914,814,3.914]],["t/91",[3,1.542,4,1.754,8,1.415,24,2.379,33,1.64,65,2.047,81,2.252,106,2.802,113,2.723,115,3.534,120,2.532,134,3.042,161,2.252,162,1.415,177,1.377,191,2.047,196,2.7,274,3.534,284,2.979,297,4.217,314,2.532,332,2.723,399,2.379,454,2.143,523,2.979,555,2.979,588,2.979,600,2.532,665,2.379,683,2.723,686,2.979,687,2.723,688,2.532,692,2.379,693,2.979,699,2.979,723,1.181,780,4.217,783,2.979,785,2.979,815,3.368,816,2.979,817,5.004,818,2.979,819,3.368,820,3.368,821,5.004,822,3.368,823,3.368,824,2.979,825,3.368,826,3.368,827,3.368,828,2.723,829,2.532,830,3.368]],["t/93",[11,4.178,30,1.693,66,4.916,140,3.536,143,4.916,153,3.239,196,2.999,603,3.536,687,4.494,688,4.178,694,4.494,831,5.558,832,5.558,833,5.558,834,5.558,835,4.916,836,5.558,837,5.558,838,5.558]],["t/95",[0,0.702,16,2.97,21,2.595,40,1.535,56,1.412,80,2.439,162,1.451,177,1.412,178,1.518,179,1.705,180,0.648,191,2.099,222,1.305,225,2.565,240,2.012,263,2.439,296,2.308,345,1.63,349,2.308,350,2.792,351,3.054,366,2.792,369,2.197,467,2.141,512,2.792,719,2.595,723,1.211,726,2.099,794,2.792,795,2.792,796,2.197,802,3.054,803,3.054,804,2.595,805,3.054,806,3.054,829,2.595,839,1.374,840,1.305,841,3.453,842,1.863,843,3.453,844,2.792,845,3.453,846,2.012,847,3.453,848,2.792,849,5.097]],["t/98",[0,0.612,14,2.384,18,2.03,177,2.001,180,0.919,295,3.272,443,3.679,467,3.075,474,3.957,846,3.795,850,4.33,851,4.895,852,4.895,853,4.33,854,2.641,855,4.895,856,4.895,857,4.895,858,4.895,859,4.895,860,4.895,861,4.895,862,4.895,863,4.895]],["t/100",[0,0.327,14,1.696,18,1.598,59,2.029,63,1.594,101,2.029,118,2.328,126,2.618,183,2.618,185,2.459,295,2.328,296,2.328,349,2.328,363,2.328,467,3.339,527,3.08,534,3.622,535,4.147,676,2.618,680,3.08,689,3.08,828,2.815,829,2.618,846,2.029,850,3.08,854,4.178,864,3.483,865,3.483,866,3.483,867,3.483,868,3.483,869,3.483,870,3.483,871,4.147,872,3.483,873,3.483,874,3.483,875,3.483,876,3.483,877,3.483,878,2.618,879,3.483,880,3.483,881,3.08,882,3.08,883,3.483]],["t/102",[0,0.693,14,2.894,42,3.513,180,0.934,222,1.88,225,2.366,255,2.955,266,2.701,283,2.701,344,4.399,345,2.348,349,3.972,350,4.804,363,2.233,443,2.511,467,2.956,512,4.021,534,2.359,540,2.955,692,2.359,751,2.511,771,2.955,846,4.299,854,1.802,884,3.341,885,2.955,886,2.955,887,3.341,888,3.341,889,3.341,890,3.341,891,2.511,892,3.341,893,3.341,894,3.341,895,3.341,896,3.341,897,3.341,898,3.341]],["t/104",[0,0.614,467,2.744,854,4.217,899,6.532,900,5.28,901,6.532,902,6.532]],["t/106",[0,0.575,16,3.569,25,2.843,40,1.986,139,3.953,295,2.987,467,2.935,556,2.987,631,3.613,660,3.613,691,4.094,745,3.953,755,3.613,846,4.38,854,3.304,871,4.951,903,4.469,904,4.951,905,3.953,906,4.469,907,3.953,908,5.417,909,4.469,910,4.469,911,3.953]],["t/108",[25,3.041,40,2.125,93,4.528,103,1.637,196,2.579,337,4.229,467,2.008,549,3.594,564,2.906,755,5.183,835,4.229,846,4.504,854,3.459,907,4.229,912,3.865,913,4.229,914,4.781,915,4.781,916,4.781,917,4.781,918,4.781,919,4.781,920,6.412,921,4.781]],["t/110",[0,0.429,12,3.028,30,1.391,238,2.378,246,3.226,247,3.054,271,3.433,278,4.041,295,3.054,377,2.906,467,1.919,691,3.054,700,4.156,846,4.624,881,5.499,882,4.041,904,3.693,905,4.041,912,3.693,922,4.568,923,4.568,924,4.568,925,6.217,926,4.568,927,4.568,928,4.568,929,4.041]],["t/112",[0,0.429,18,1.424,63,2.847,165,2.378,185,3.226,549,3.433,645,3.693,829,3.433,929,4.041,930,4.568,931,4.568,932,4.568,933,6.133,934,5.714,935,4.568,936,2.777,937,3.693,938,3.693,939,3.693,940,3.693,941,3.693,942,3.693,943,4.568,944,4.568,945,4.568,946,4.568,947,4.568,948,4.568,949,4.568]],["t/114",[0,0.495,53,3.525,70,2.568,179,1.344,180,0.99,303,3.724,558,3.525,723,1.849,804,3.963,840,1.992,886,4.664,933,4.263,934,4.263,940,4.263,941,4.263,942,4.263,950,4.263,951,3.963,952,5.273,953,5.273,954,4.572,955,5.273]],["t/116",[0,0.676,178,2.143,179,1.834,180,1.072,359,4.195,374,4.035,581,3.329,723,2.004,840,2.159,956,1.701,957,2.696,958,4.619,959,5.053]],["t/118",[0,0.492,24,1.3,26,1.384,30,1.221,44,1.489,56,0.753,63,2.151,67,1.508,70,0.897,156,1.3,162,2.662,169,1.384,179,0.789,186,0.993,191,1.882,196,0.993,204,1.3,219,1.489,222,2.281,223,1.384,224,1.629,225,2.759,229,1.384,234,1.384,237,2.328,239,1.384,246,1.3,247,1.231,257,3.798,265,1.171,273,1.489,287,1.804,328,1.384,330,2.187,345,0.869,359,1.073,399,2.83,425,1.231,434,1.384,467,1.301,478,1.3,480,1.3,487,1.489,490,1.384,491,2.504,499,1.489,556,1.231,590,2.504,645,1.489,780,1.3,846,1.073,848,2.504,911,1.629,933,1.489,934,3.24,939,2.504,940,2.504,941,2.504,942,2.504,959,1.629,960,1.384,961,1.841,962,2.739,963,2.739,964,3.545,965,1.629,966,2.739,967,1.629,968,1.629,969,1.629,970,1.629,971,1.841,972,1.841,973,1.841,974,1.841,975,1.841,976,1.841,977,1.841,978,1.841,979,1.841,980,1.841,981,1.841,982,1.841,983,3.097,984,1.841,985,1.841,986,1.841,987,1.841,988,1.629,989,1.841,990,1.629,991,1.629,992,1.629,993,1.841,994,1.841,995,1.629,996,1.629,997,1.384,998,1.841,999,1.629,1000,1.841,1001,1.841,1002,3.097]],["t/121",[0,0.259,3,0.734,17,1.133,18,1.128,31,1.297,37,1.419,49,1.419,54,0.865,59,0.935,61,0.807,63,2.213,67,1.341,70,1.341,79,1.419,83,1.297,88,1.206,92,1.297,93,1.133,102,1.206,158,3.201,165,0.835,177,0.656,178,0.478,190,2.226,192,1.133,196,0.865,213,1.206,258,1.419,302,1.297,317,1.02,320,5.033,330,1.133,368,1.297,399,1.133,537,1.133,543,1.945,556,1.841,564,1.674,569,1.419,589,1.419,596,1.297,631,2.226,633,1.419,644,1.419,648,2.436,650,1.419,665,1.945,723,0.563,792,1.297,818,1.419,871,4.563,885,1.419,950,1.297,951,1.206,954,1.072,996,1.419,1003,3.619,1004,3.619,1005,2.754,1006,3.797,1007,5.269,1008,4.293,1009,1.604,1010,3.201,1011,1.604,1012,1.604,1013,1.604,1014,1.604,1015,4.993,1016,1.604,1017,1.419,1018,1.419,1019,1.419,1020,1.419,1021,1.419,1022,2.226,1023,1.604,1024,2.754,1025,2.754,1026,2.754,1027,1.604,1028,2.754,1029,1.604,1030,1.604,1031,2.754,1032,1.604,1033,1.604,1034,1.604,1035,1.604,1036,1.604,1037,1.604,1038,1.604,1039,1.604,1040,1.604,1041,1.604,1042,2.754,1043,1.604,1044,1.604,1045,3.619,1046,1.604,1047,1.604,1048,1.604,1049,1.604,1050,2.754,1051,1.604,1052,2.754,1053,1.604,1054,1.604,1055,1.604,1056,2.754,1057,2.754,1058,1.419,1059,1.604,1060,1.604,1061,1.604,1062,1.604,1063,1.604,1064,1.604,1065,2.754,1066,1.604,1067,1.604,1068,1.604,1069,1.604,1070,1.604,1071,1.604,1072,1.604,1073,1.604,1074,1.206,1075,1.604]],["t/123",[0,0.537,53,3.819,70,2.783,179,1.456,180,1.072,295,3.819,296,3.819,303,4.035,384,4.619,556,3.819,723,2.004,840,2.159,950,4.619,951,4.294,1022,4.619,1074,4.294,1076,5.713]],["t/125",[0,0.67,178,2.125,179,1.819,180,1.058,359,4.158,374,3.979,425,3.767,581,3.283,723,1.976,840,2.129,956,1.678,957,2.659,958,4.555,960,4.235]],["t/127",[0,0.361,18,0.627,24,0.792,26,0.843,30,0.833,56,0.458,63,1.526,67,0.546,70,0.546,92,0.907,115,0.792,127,0.654,156,0.792,162,2.086,169,0.843,177,0.458,179,0.513,186,0.605,191,0.682,196,0.605,204,0.792,213,0.843,219,0.907,222,1.985,223,0.843,225,3.015,229,0.843,234,0.843,237,1.512,239,0.843,247,0.75,257,2.695,273,0.907,287,1.172,303,0.792,320,1.626,328,0.843,330,1.931,345,0.529,349,0.75,359,0.654,369,0.713,384,0.907,425,0.75,434,0.843,467,0.845,478,0.792,480,0.792,482,0.907,487,0.907,490,0.843,491,1.626,499,0.907,556,2.854,558,1.345,590,1.626,682,0.992,704,0.992,780,0.792,789,0.992,810,1.779,824,0.992,846,0.654,848,1.626,939,0.907,954,0.75,960,0.843,962,2.419,963,2.419,964,2.419,965,0.992,966,1.779,967,0.992,968,0.992,969,0.992,970,0.992,988,0.992,990,0.992,991,0.992,992,0.992,995,0.992,999,0.992,1006,1.779,1007,2.949,1010,0.992,1015,1.779,1017,0.992,1018,0.992,1019,1.779,1020,0.992,1021,0.992,1022,2.211,1074,0.843,1077,1.122,1078,2.011,1079,1.122,1080,1.122,1081,2.011,1082,1.122,1083,1.122,1084,1.122,1085,1.122,1086,2.734,1087,1.122,1088,2.734,1089,1.122,1090,1.122,1091,1.122,1092,1.122,1093,1.122,1094,1.122,1095,1.122,1096,1.122,1097,1.122,1098,1.122,1099,1.122,1100,2.011,1101,1.122,1102,1.122,1103,1.122,1104,1.122,1105,1.122,1106,2.011,1107,1.122,1108,1.122,1109,2.734,1110,1.122,1111,1.122,1112,2.011,1113,3.334,1114,2.011,1115,1.122,1116,1.122,1117,1.122,1118,1.122,1119,1.122,1120,1.122,1121,3.334,1122,2.734,1123,1.122,1124,2.011,1125,1.122,1126,2.011,1127,3.334,1128,2.734,1129,1.122,1130,1.122,1131,1.122,1132,1.122,1133,1.122,1134,1.122,1135,1.122,1136,1.122,1137,1.122,1138,2.011,1139,1.122,1140,1.122,1141,1.122,1142,1.122,1143,1.122,1144,1.122,1145,2.011,1146,1.122,1147,1.122,1148,1.122,1149,1.122,1150,1.122,1151,1.122,1152,1.122,1153,1.122,1154,1.122,1155,1.122,1156,1.122,1157,2.011]],["t/130",[41,3.335,67,1.836,106,2.112,112,2.834,135,3.335,153,2.197,180,0.708,191,3.303,225,2.92,240,2.197,265,3.457,330,2.663,443,2.834,482,3.048,506,3.335,683,4.394,684,3.048,719,2.834,781,2.834,792,3.048,1158,4.807,1159,2.834,1160,3.048,1161,3.771,1162,3.335,1163,3.335,1164,3.633,1165,3.771,1166,5.435,1167,5.435,1168,3.771,1169,3.771,1170,3.771,1171,3.771,1172,3.771,1173,3.771,1174,4.085,1175,3.771,1176,3.771]],["t/133",[20,4.832,54,3.468,162,2.701,265,4.09,336,5.687,1159,4.832,1162,5.687,1164,4.298,1177,6.429]],["t/135",[0,0.434,33,3.051,152,3.472,161,3.088,165,2.405,183,3.472,196,2.492,238,2.405,300,3.735,449,4.086,537,3.263,665,3.263,688,3.472,713,4.086,720,4.086,772,4.086,780,3.263,816,4.086,1160,5.065,1164,4.188,1178,4.62,1179,4.62,1180,4.62,1181,4.62,1182,4.62,1183,4.62,1184,4.086,1185,4.62,1186,4.62,1187,4.62,1188,4.62]],["t/137",[186,4.062,225,2.207,265,3.906,446,4.615,537,4.337,1189,6.141,1190,6.141,1191,6.141,1192,6.141,1193,5.431,1194,6.141]],["t/139",[40,2.65,208,3.793,457,5.977,828,4.82,1158,5.274,1163,5.274,1164,3.985,1195,5.274,1196,5.962,1197,5.962,1198,5.962,1199,5.962,1200,5.962]],["t/141",[225,2.207,265,3.906,368,4.964,543,4.337,563,5.431,891,4.615,1159,4.615,1164,4.105,1201,5.431,1202,6.141,1203,6.141,1204,6.141]],["t/143",[145,5.431,334,5.431,839,2.444,1159,4.615,1164,4.105,1195,5.431,1205,6.141,1206,6.141,1207,6.141,1208,6.141,1209,6.141,1210,6.141]],["t/145",[0,0.67,17,3.979,80,3.979,81,3.767,150,4.235,178,1.678,180,1.339,751,4.235,936,4.338,1211,5.635,1212,4.235,1213,7.137,1214,4.555,1215,4.984]],["t/147",[0,0.429,11,3.433,12,2.225,30,1.391,70,2.225,76,2.777,82,2.777,85,3.433,100,2.558,127,2.662,150,3.433,160,3.433,180,0.857,309,3.433,310,2.906,311,2.906,533,3.693,739,3.693,778,2.906,912,3.693,936,2.777,1058,4.041,1212,3.433,1214,3.693,1216,4.568,1217,6.217,1218,4.568,1219,4.391,1220,4.041,1221,4.041,1222,3.226,1223,4.568,1224,2.464]],["t/149",[0,0.707,61,3.09,178,1.828,179,1.565,180,1.413,723,2.154,726,3.732,840,2.32,936,3.732,1219,4.337]],["t/151",[8,2.619,103,2.134,179,1.936,581,3.632,723,2.186,840,2.356,956,1.856,957,2.942,1225,4.167,1226,3.965]],["t/153",[0,0.568,8,2.541,103,2.071,178,1.801,179,1.542,180,1.136,723,2.122,840,2.286,956,1.801,1227,4.273,1228,4.273,1229,4.044,1230,3.264]],["t/155",[0,0.733,8,2.056,18,2.03,30,1.984,56,2.001,58,2.641,103,1.676,177,2.001,178,2.179,180,1.223,208,3.114,702,2.241,842,3.514,956,1.457,957,3.074,1224,2.641,1231,3.272,1232,3.957,1233,2.384]],["t/157",[0,0.682,18,1.806,101,3.376,103,1.983,179,1.851,180,1.087,222,2.189,238,3.016,839,2.306,956,1.725,1234,4.684,1235,3.873,1236,4.684,1237,4.684]],["t/159",[0,0.706,18,1.909,30,1.361,58,2.411,103,1.53,177,1.827,178,1.823,179,1.139,180,1.15,238,2.326,702,2.046,839,2.781,842,3.304,956,1.33,957,2.891,997,3.359,1230,3.77,1233,2.176,1235,2.987,1238,4.094,1239,2.987,1240,3.613,1241,3.613,1242,2.987]],["t/161",[8,2.159,40,2.285,56,2.101,101,2.995,177,2.101,179,1.911,558,3.436,702,2.354,723,1.803,796,3.27,839,2.984,840,1.943,878,3.864,956,1.53,1174,3.864,1230,2.773,1231,3.436,1243,4.156,1244,4.156,1245,4.156,1246,3.63]],["t/163",[18,1.244,40,1.774,54,3.053,178,1.958,179,1.824,271,2.999,317,2.538,377,2.538,600,4.254,739,3.226,839,2.848,1219,2.818,1225,2.668,1238,2.668,1239,2.668,1242,2.668,1247,3.991,1248,3.991,1249,5.006,1250,3.991,1251,6.33,1252,5.006,1253,4.943,1254,3.53,1255,3.991,1256,3.991,1257,3.991,1258,3.991,1259,3.991,1260,3.226,1261,3.226]],["t/165",[0,0.387,18,0.815,30,0.797,39,2.314,56,1.686,73,2.912,114,3.1,178,2.225,179,1.476,225,2.519,232,2.757,271,3.836,280,1.848,283,2.115,298,1.967,385,2.314,416,2.314,454,1.664,676,1.967,724,2.314,839,1.041,842,2.754,954,1.749,956,0.779,1184,2.314,1233,1.274,1246,1.848,1249,4.515,1251,5.575,1252,3.648,1253,3.1,1254,3.648,1262,2.616,1263,2.616,1264,2.616,1265,2.616,1266,2.616,1267,2.314,1268,2.616,1269,2.616,1270,2.616,1271,2.616,1272,2.616,1273,2.616,1274,2.616,1275,2.616,1276,5.793,1277,2.616,1278,4.124,1279,4.124,1280,2.616,1281,2.616,1282,5.104,1283,2.616,1284,5.104,1285,4.124,1286,2.616]],["t/167",[0,0.522,12,2.707,30,2.155,33,2.707,100,3.113,104,3.925,174,3.716,180,1.328,184,3.716,467,2.335,564,3.378,702,2.545,778,3.536,854,2.999,1224,2.999,1233,2.707,1287,3.925]],["t/169",[0,0.707,61,3.09,178,1.828,179,1.565,180,1.413,723,2.154,726,3.732,840,2.32,936,3.732,1220,5.431]],["t/171",[8,2.619,103,2.134,179,1.936,581,3.632,723,2.186,840,2.356,956,1.856,957,2.942,1225,4.167,1226,3.965]],["t/173",[0,0.568,8,2.541,103,2.071,178,1.801,179,1.542,180,1.136,723,2.122,840,2.286,956,1.801,1227,4.273,1228,4.273,1229,4.044,1230,3.264]],["t/175",[0,0.733,8,2.056,18,2.03,30,1.984,56,2.001,58,2.641,103,1.676,177,2.001,178,2.179,180,1.223,208,3.114,702,2.241,842,3.514,956,1.457,957,3.074,1224,2.641,1231,3.272,1232,3.957,1233,2.384]],["t/177",[0,0.682,18,1.806,101,3.376,103,1.983,179,1.851,180,1.087,222,2.189,238,3.016,839,2.306,956,1.725,1234,4.684,1235,3.873,1236,4.684,1237,4.684]],["t/179",[0,0.706,18,1.909,30,1.361,58,2.411,103,1.53,177,1.827,178,1.823,179,1.139,180,1.15,238,2.326,702,2.046,839,2.781,842,3.304,956,1.33,957,2.891,997,3.359,1230,3.77,1233,2.176,1235,2.987,1238,4.094,1239,2.987,1240,3.613,1241,3.613,1242,2.987]],["t/181",[8,2.159,40,2.285,56,2.101,101,2.995,177,2.101,179,1.911,558,3.436,702,2.354,723,1.803,796,3.27,839,2.984,840,1.943,878,3.864,956,1.53,1174,3.864,1230,2.773,1231,3.436,1243,4.156,1244,4.156,1245,4.156,1246,3.63]],["t/183",[18,1.582,56,2.075,178,1.987,179,2.151,298,3.816,317,3.229,839,2.966,900,4.104,1226,3.229,1238,3.394,1239,3.394,1242,3.394,1253,3.816,1260,4.104,1261,4.104,1288,4.491,1289,5.077,1290,5.077]],["t/185",[0,0.522,12,2.707,30,2.155,33,2.707,100,3.113,104,3.925,174,3.716,180,1.328,184,3.716,467,2.335,564,3.378,702,2.545,778,3.536,854,2.999,1224,2.999,1233,2.707,1287,3.925]],["t/187",[0,0.544,3,2.653,14,2.822,112,4.355,142,4.684,152,4.355,155,4.092,212,4.684,844,4.684,937,4.684,960,4.355,1219,4.092,1267,5.125,1291,5.794,1292,5.794,1293,5.794]],["t/189",[0,0.552,3,2.691,44,4.751,50,5.198,53,3.928,70,2.862,192,4.15,464,5.198,467,2.469,793,4.15,951,4.417,1219,4.15,1294,5.877,1295,5.877,1296,5.877]],["t/191",[3,1.517,16,1.931,25,2.108,40,2.198,47,4.176,56,1.355,58,1.788,81,2.215,85,3.716,103,2.024,127,2.881,162,2.077,178,0.987,234,2.491,299,2.34,309,3.716,333,2.931,463,2.931,691,2.215,796,2.108,804,2.491,853,2.931,908,2.931,956,1.472,1212,2.491,1214,2.679,1297,3.314,1298,3.314,1299,3.314,1300,4.373,1301,4.944,1302,3.314,1303,4.944,1304,3.314,1305,4.944,1306,3.314,1307,3.314,1308,4.944,1309,3.314,1310,3.314,1311,3.314,1312,3.314,1313,3.314,1314,3.314,1315,3.314,1316,3.314,1317,3.314,1318,3.314,1319,3.314,1320,2.931,1321,3.314,1322,3.314,1323,3.314,1324,3.314]],["t/193",[0,0.695,61,3,178,1.775,179,1.519,180,1.388,299,4.211,310,3.793,311,3.793,723,2.091,726,3.624,840,2.253,936,3.624]],["t/195",[103,2.102,179,1.919,310,3.906,311,3.906,581,3.578,723,2.154,840,2.32,956,1.828,957,2.898,1225,4.105,1226,3.906]],["t/197",[0,0.56,103,2.041,178,1.775,179,1.519,180,1.119,310,3.793,311,3.793,723,2.091,840,2.253,956,1.775,1227,4.211,1228,4.211,1229,3.985,1230,3.216]],["t/199",[0,0.713,18,1.643,30,1.606,56,2.155,58,2.844,103,1.805,178,2.036,180,1.284,692,3.724,839,2.098,842,2.844,956,2.036,957,2.489,1224,2.844,1231,3.525,1233,2.568,1325,3.963,1326,4.664]],["t/201",[47,5.603,56,2.969,63,2.653,310,3.685,311,3.685,314,4.355,839,2.306,956,1.725,1325,4.355,1327,5.125,1328,5.125,1329,5.125,1330,5.125]],["t/203",[38,4.758,40,2.814,165,3.296,310,4.027,311,4.027,317,4.027,938,5.117,954,5.127,1331,5.599]],["t/205",[0,0.537,12,2.783,30,2.193,33,2.783,100,3.2,174,3.819,180,1.351,467,2.4,564,3.472,702,2.616,778,3.634,854,3.082,1224,3.082,1233,2.783,1287,4.035]],["t/208",[0,0.567,18,2.321,26,4.536,56,1.788,59,2.548,140,2.782,180,1.297,299,3.089,359,2.548,360,3.089,425,4.034,447,3.868,454,2.782,462,3.868,471,3.287,480,3.089,543,3.089,702,2.002,753,3.287,956,1.302,1332,4.373,1333,4.373,1334,6.035,1335,3.536,1336,4.373,1337,4.373,1338,4.373,1339,4.373,1340,4.373,1341,4.373]],["t/210",[0,0.664,10,3.054,65,2.777,90,3.433,106,2.558,157,3.693,178,1.851,179,1.164,180,1.167,232,3.054,287,4.421,325,3.054,374,4.391,375,4.041,446,3.433,454,2.906,601,4.041,753,3.433,839,1.818,842,2.464,956,1.36,958,3.693,1335,3.693,1342,4.568,1343,4.041,1344,4.568,1345,4.568]],["t/212",[0,0.375,89,3.53,106,3.17,147,3.53,177,2.314,178,1.685,180,1.062,212,3.226,287,3.832,325,2.668,388,4.576,423,3.53,434,2.999,445,3.53,454,2.538,467,1.676,700,2.668,726,2.426,759,3.53,793,2.818,891,4.254,1215,3.53,1346,3.991,1347,5.66,1348,5.66,1349,3.991,1350,3.991,1351,3.991,1352,6.577,1353,3.991,1354,3.991,1355,3.991,1356,3.991,1357,3.991,1358,3.991,1359,3.991]],["t/214",[18,1.806,93,4.092,178,1.725,232,3.873,363,3.873,425,4.855,700,3.873,956,1.725,1212,4.355,1335,4.684,1343,5.125,1360,5.794,1361,5.794,1362,5.794,1363,5.794]],["t/216",[0,0.701,61,3.044,76,3.677,82,3.677,178,1.801,179,1.542,180,1.4,723,2.122,726,3.677,840,2.286,936,3.677]],["t/218",[76,3.732,82,3.732,103,2.102,179,1.919,581,3.578,723,2.154,840,2.32,956,1.828,957,2.898,1225,4.105,1226,3.906]],["t/220",[0,0.56,76,3.624,82,3.624,103,2.041,178,1.775,179,1.519,180,1.119,723,2.091,840,2.253,956,1.775,1227,4.211,1228,4.211,1229,3.985,1230,3.216]],["t/222",[0,0.713,18,1.643,30,1.606,56,2.155,58,2.844,103,1.805,178,2.036,180,1.284,692,3.724,839,2.098,842,2.844,956,2.036,957,2.489,1224,2.844,1231,3.525,1233,2.568,1325,3.963,1326,4.664]],["t/224",[47,5.603,56,2.969,63,2.653,76,3.522,82,3.522,314,4.355,839,2.306,956,1.725,1325,4.355,1327,5.125,1328,5.125,1329,5.125,1330,5.125]],["t/226",[38,4.758,40,2.814,76,3.847,82,3.847,165,3.296,317,4.027,938,5.117,954,5.127,1331,5.599]],["t/228",[0,0.522,12,2.707,30,2.155,33,2.707,100,3.113,104,3.925,174,3.716,180,1.328,184,3.716,467,2.335,564,3.378,702,2.545,778,3.536,854,2.999,1224,2.999,1233,2.707,1287,3.925]],["t/230",[0,0.707,61,3.09,178,1.828,179,1.565,180,1.413,723,2.154,726,3.732,840,2.32,936,3.732,1221,5.431]],["t/232",[8,2.619,103,2.134,179,1.936,581,3.632,723,2.186,840,2.356,956,1.856,957,2.942,1225,4.167,1226,3.965]],["t/234",[0,0.568,8,2.541,103,2.071,178,1.801,179,1.542,180,1.136,723,2.122,840,2.286,956,1.801,1227,4.273,1228,4.273,1229,4.044,1230,3.264]],["t/236",[0,0.73,8,2.032,18,2.014,30,1.968,56,1.977,58,3.486,103,1.656,177,1.977,178,2.166,180,1.213,208,3.077,702,2.215,842,3.486,956,1.44,957,3.05,1224,2.61,1232,3.911,1233,2.356,1364,3.911]],["t/238",[0,0.682,18,1.806,101,3.376,103,1.983,179,1.851,180,1.087,222,2.189,238,3.016,839,2.306,956,1.725,1234,4.684,1235,3.873,1236,4.684,1237,4.684]],["t/240",[0,0.706,18,1.909,30,1.361,58,2.411,103,1.53,177,1.827,178,1.823,179,1.139,180,1.15,238,2.326,702,2.046,839,2.781,842,3.304,956,1.33,957,2.891,997,3.359,1230,3.77,1233,2.176,1235,2.987,1238,4.094,1239,2.987,1240,3.613,1241,3.613,1242,2.987]],["t/242",[8,2.133,40,2.257,56,2.075,58,2.739,101,2.958,177,2.075,179,1.899,558,3.394,702,2.324,723,1.781,796,3.229,839,2.966,840,1.918,878,3.816,956,1.511,1174,3.816,1230,2.739,1243,4.104,1244,4.104,1245,4.104,1246,3.585,1364,4.104]],["t/244",[56,2.272,179,2.088,298,4.178,317,3.536,839,3.098,900,4.494,1226,3.536,1238,3.716,1239,3.716,1242,3.716,1253,4.178,1260,4.494,1261,4.494,1288,4.916]],["t/246",[0,0.522,12,2.707,30,2.155,33,2.707,100,3.113,104,3.925,174,3.716,180,1.328,184,3.716,467,2.335,564,3.378,702,2.545,778,3.536,854,2.999,1224,2.999,1233,2.707,1287,3.925]],["t/248",[0,0.586,14,3.036,67,3.036,70,3.036,751,4.685,1222,4.403,1365,6.234,1366,5.04,1367,6.234,1368,5.514,1369,5.514]],["t/250",[0,0.358,3,1.742,30,1.159,40,1.692,46,3.077,53,2.544,67,3.12,70,3.12,142,4.423,197,3.366,250,3.077,296,2.544,309,2.86,480,2.688,543,2.688,733,3.366,781,2.86,839,1.515,844,3.077,891,2.86,904,3.077,913,3.366,937,3.077,1222,4.524,1229,2.544,1246,2.688,1320,4.839,1364,3.077,1366,3.077,1368,5.666,1369,3.366,1370,3.806,1371,3.806,1372,3.806,1373,3.806,1374,3.806,1375,3.806,1376,3.806,1377,5.471,1378,3.806,1379,3.806,1380,3.366]],["t/252",[67,3.036,85,4.685,103,2.134,167,5.514,1074,4.685,1366,5.04,1380,5.514,1381,6.234,1382,6.234,1383,6.234,1384,6.234]],["t/254",[70,2.918,100,2.423,103,1.481,151,3.828,185,5.237,228,3.498,325,2.893,355,2.893,725,3.828,793,3.056,1201,3.828,1222,5.237,1385,4.327,1386,5.99,1387,4.327,1388,4.327,1389,4.327,1390,4.327,1391,4.327,1392,5.99,1393,5.99,1394,5.99,1395,7.416,1396,4.327,1397,4.327,1398,4.327]],["t/256",[0,0.471,14,2.443,38,4.975,42,3.542,54,2.705,62,4.436,102,3.769,177,2.05,192,3.542,548,4.436,630,4.436,676,3.769,793,3.542,1160,4.054,1193,4.436,1222,3.542,1300,4.436,1399,5.015,1400,6.619,1401,5.015,1402,5.015,1403,5.015,1404,5.015,1405,5.015,1406,5.015]]],"invertedIndex":[["",{"_index":225,"t":{"19":{"position":[[987,1],[1066,1],[1088,1],[1154,1],[1167,1],[1215,1],[1262,1],[1320,1],[1404,1],[1474,1]]},"21":{"position":[[574,1],[664,1],[741,1],[781,1],[832,1],[853,1],[922,2],[937,1],[1002,2],[1016,1],[1081,2],[1100,1],[1147,1],[1217,1]]},"23":{"position":[[535,1],[616,1],[668,1],[715,1],[758,1],[779,1],[848,1],[888,1],[951,1],[972,1],[1062,1],[1112,1],[1166,1]]},"29":{"position":[[172,1]]},"33":{"position":[[154,1],[174,1],[257,1]]},"35":{"position":[[330,1],[352,1],[406,1],[419,1],[478,1],[524,1]]},"37":{"position":[[348,1],[422,1]]},"39":{"position":[[724,1],[788,1],[801,2],[804,2]]},"45":{"position":[[207,1],[230,1],[314,1],[389,1],[445,1],[535,1],[615,1],[643,1],[699,1],[768,1],[844,1],[898,1],[968,1]]},"73":{"position":[[972,1],[998,1],[1101,1],[1158,1],[1259,1],[1355,1],[2107,1]]},"76":{"position":[[349,1],[374,1]]},"78":{"position":[[39,1],[64,1]]},"80":{"position":[[39,1],[55,1],[99,1],[121,1],[176,1]]},"82":{"position":[[248,1],[276,1]]},"84":{"position":[[39,1],[55,1],[103,1],[129,1],[188,1]]},"86":{"position":[[654,1],[672,1],[835,1],[902,1],[984,1]]},"89":{"position":[[109,1],[129,1],[207,1],[241,1],[294,1]]},"95":{"position":[[384,1],[404,1],[482,1],[516,1],[569,1]]},"102":{"position":[[417,1],[488,1],[716,1],[754,1]]},"118":{"position":[[356,1],[389,1],[424,1],[611,1],[621,1],[652,1],[679,1],[809,1],[868,1],[977,1],[1002,1],[1063,1],[1099,1],[1171,1],[1199,2],[1383,1]]},"127":{"position":[[469,1],[502,1],[537,1],[818,1],[848,1],[867,1],[893,1],[946,1],[1047,1],[1186,1],[1190,1],[1217,1],[1222,1],[1278,1],[1325,2],[1341,1],[1395,1],[1420,1],[1525,1],[1630,1],[1639,1],[1641,2],[1654,1],[1656,2],[1677,1],[1737,1],[1838,1],[1938,1],[2104,1],[2159,2],[2199,2],[2236,1],[2256,1],[2268,1],[2287,1],[2371,1],[2403,1],[2418,1],[2534,1],[2536,2],[2552,1],[2590,2],[2627,2],[2630,3],[2648,1],[2705,2],[2889,1],[2891,2]]},"130":{"position":[[72,1],[211,1],[328,1],[342,1],[403,1],[560,2],[572,3],[584,1]]},"137":{"position":[[87,1]]},"141":{"position":[[30,1]]},"165":{"position":[[312,1],[367,1],[447,1],[579,1],[651,1],[700,1],[806,1]]}}}],["0",{"_index":231,"t":{"19":{"position":[[1108,2]]},"35":{"position":[[372,2]]},"37":{"position":[[172,1]]}}}],["0.0",{"_index":395,"t":{"37":{"position":[[183,3]]}}}],["0.95",{"_index":701,"t":{"73":{"position":[[811,5],[1338,4]]}}}],["1",{"_index":437,"t":{"39":{"position":[[807,2]]}}}],["1.0",{"_index":396,"t":{"37":{"position":[[187,3]]}}}],["10",{"_index":73,"t":{"9":{"position":[[180,4]]},"19":{"position":[[1416,2]]},"80":{"position":[[69,2]]},"84":{"position":[[69,2]]},"165":{"position":[[576,2],[803,2]]}}}],["100",{"_index":1134,"t":{"127":{"position":[[2270,3]]}}}],["1024",{"_index":973,"t":{"118":{"position":[[613,4]]}}}],["17",{"_index":1110,"t":{"127":{"position":[[1219,2]]}}}],["18.04",{"_index":1254,"t":{"163":{"position":[[167,5]]},"165":{"position":[[7,5],[218,5]]}}}],["1st",{"_index":767,"t":{"80":{"position":[[135,3]]},"84":{"position":[[143,3]]}}}],["255",{"_index":394,"t":{"37":{"position":[[174,3]]}}}],["3",{"_index":1268,"t":{"165":{"position":[[197,1]]}}}],["3)).astype(np.uint8",{"_index":412,"t":{"37":{"position":[[401,20]]}}}],["3.10",{"_index":1264,"t":{"165":{"position":[[105,5]]}}}],["3.6",{"_index":1262,"t":{"165":{"position":[[31,3]]}}}],["3.7",{"_index":840,"t":{"95":{"position":[[53,3]]},"114":{"position":[[28,3]]},"116":{"position":[[23,3]]},"123":{"position":[[28,3]]},"125":{"position":[[23,3]]},"149":{"position":[[99,3]]},"151":{"position":[[68,3]]},"153":{"position":[[25,3]]},"161":{"position":[[124,5]]},"169":{"position":[[99,3]]},"171":{"position":[[68,3]]},"173":{"position":[[25,3]]},"181":{"position":[[124,5]]},"193":{"position":[[115,3]]},"195":{"position":[[75,3]]},"197":{"position":[[25,3]]},"216":{"position":[[106,3]]},"218":{"position":[[74,3]]},"220":{"position":[[25,3]]},"230":{"position":[[101,3]]},"232":{"position":[[68,3]]},"234":{"position":[[25,3]]},"242":{"position":[[130,5]]}}}],["3.7.5",{"_index":1244,"t":{"161":{"position":[[147,7]]},"181":{"position":[[147,7]]},"242":{"position":[[153,7]]}}}],["3.8",{"_index":1269,"t":{"165":{"position":[[234,4]]}}}],["3.9.0",{"_index":1245,"t":{"161":{"position":[[158,9]]},"181":{"position":[[158,9]]},"242":{"position":[[164,9]]}}}],["3000:3000",{"_index":1306,"t":{"191":{"position":[[277,11]]}}}],["3pm",{"_index":1140,"t":{"127":{"position":[[2410,3]]}}}],["400",{"_index":505,"t":{"45":{"position":[[645,3]]}}}],["401",{"_index":510,"t":{"45":{"position":[[701,3]]}}}],["403",{"_index":514,"t":{"45":{"position":[[770,3]]}}}],["404",{"_index":520,"t":{"45":{"position":[[846,3]]}}}],["429",{"_index":524,"t":{"45":{"position":[[900,3]]}}}],["5",{"_index":768,"t":{"80":{"position":[[147,1]]},"84":{"position":[[155,1]]}}}],["500",{"_index":529,"t":{"45":{"position":[[970,3]]}}}],["587",{"_index":1096,"t":{"127":{"position":[[981,4]]}}}],["5pm",{"_index":1111,"t":{"127":{"position":[[1229,3]]}}}],["60",{"_index":704,"t":{"73":{"position":[[855,2],[1289,2]]},"127":{"position":[[1632,2]]}}}],["80",{"_index":1181,"t":{"135":{"position":[[117,3]]}}}],["800",{"_index":411,"t":{"37":{"position":[[396,4]]}}}],["8000:8000",{"_index":1310,"t":{"191":{"position":[[404,11]]}}}],["800x600",{"_index":404,"t":{"37":{"position":[[291,7]]}}}],["9",{"_index":1107,"t":{"127":{"position":[[1188,1]]}}}],["9am",{"_index":1108,"t":{"127":{"position":[[1197,3]]}}}],["_",{"_index":235,"t":{"19":{"position":[[1145,2]]},"35":{"position":[[397,2]]}}}],["above",{"_index":773,"t":{"82":{"position":[[176,5]]}}}],["accept",{"_index":362,"t":{"33":{"position":[[24,6]]},"37":{"position":[[24,6]]}}}],["acceptable",{"_index":205,"t":{"19":{"position":[[517,10]]}}}],["accepts",{"_index":354,"t":{"31":{"position":[[18,7]]}}}],["access",{"_index":296,"t":{"25":{"position":[[20,6]]},"45":{"position":[[90,6],[288,6]]},"95":{"position":[[244,6]]},"100":{"position":[[511,6]]},"123":{"position":[[113,6]]},"250":{"position":[[382,6]]}}}],["accessible",{"_index":628,"t":{"63":{"position":[[309,10]]}}}],["accessing",{"_index":928,"t":{"110":{"position":[[239,9]]}}}],["accidentally",{"_index":889,"t":{"102":{"position":[[216,12]]}}}],["according",{"_index":1190,"t":{"137":{"position":[[51,9]]}}}],["account",{"_index":295,"t":{"25":{"position":[[8,7]]},"98":{"position":[[177,8]]},"100":{"position":[[249,8]]},"106":{"position":[[27,7]]},"110":{"position":[[266,8]]},"123":{"position":[[95,7]]}}}],["account/api",{"_index":902,"t":{"104":{"position":[[98,11]]}}}],["accuracy",{"_index":122,"t":{"15":{"position":[[419,8]]},"73":{"position":[[79,9],[159,8],[1497,8],[1557,9]]}}}],["action",{"_index":173,"t":{"17":{"position":[[415,6]]},"21":{"position":[[252,6],[860,6]]}}}],["add",{"_index":788,"t":{"86":{"position":[[401,3]]}}}],["adding",{"_index":1270,"t":{"165":{"position":[[281,6]]}}}],["addition",{"_index":579,"t":{"57":{"position":[[3,8]]}}}],["additionally",{"_index":668,"t":{"69":{"position":[[208,13]]}}}],["address",{"_index":1324,"t":{"191":{"position":[[783,7]]}}}],["addressing",{"_index":1060,"t":{"121":{"position":[[1501,10]]}}}],["affordable",{"_index":74,"t":{"9":{"position":[[215,10]]}}}],["again",{"_index":911,"t":{"106":{"position":[[290,6]]},"118":{"position":[[1420,5]]}}}],["against",{"_index":121,"t":{"15":{"position":[[411,7]]},"73":{"position":[[71,7],[1506,7]]},"86":{"position":[[58,7]]}}}],["aggregating",{"_index":1118,"t":{"127":{"position":[[1586,11]]}}}],["ago",{"_index":421,"t":{"39":{"position":[[181,3]]}}}],["ahead",{"_index":1266,"t":{"165":{"position":[[156,6]]}}}],["ai",{"_index":66,"t":{"9":{"position":[[106,2],[226,2]]},"93":{"position":[[69,2]]}}}],["algorithm",{"_index":1358,"t":{"212":{"position":[[315,11]]}}}],["allocation",{"_index":1025,"t":{"121":{"position":[[534,10],[651,10]]}}}],["allow",{"_index":1376,"t":{"250":{"position":[[363,5]]}}}],["allowed",{"_index":516,"t":{"45":{"position":[[804,7]]}}}],["allowing",{"_index":671,"t":{"69":{"position":[[327,8]]}}}],["allows",{"_index":64,"t":{"9":{"position":[[76,6]]},"25":{"position":[[104,6]]}}}],["along",{"_index":835,"t":{"93":{"position":[[94,5]]},"108":{"position":[[67,5]]}}}],["already",{"_index":753,"t":{"76":{"position":[[114,7]]},"86":{"position":[[451,7]]},"208":{"position":[[175,7]]},"210":{"position":[[342,7]]}}}],["alternatively",{"_index":894,"t":{"102":{"position":[[526,14]]}}}],["alternatives",{"_index":1279,"t":{"165":{"position":[[509,12],[745,12]]}}}],["always",{"_index":289,"t":{"23":{"position":[[791,6]]}}}],["ambiguous",{"_index":1163,"t":{"130":{"position":[[144,9]]},"139":{"position":[[26,10]]}}}],["analysis",{"_index":24,"t":{"3":{"position":[[274,9]]},"73":{"position":[[299,8],[1961,9]]},"91":{"position":[[275,8]]},"118":{"position":[[1553,9]]},"127":{"position":[[3024,9]]}}}],["analytics",{"_index":1004,"t":{"121":{"position":[[69,9],[471,9],[1706,9]]}}}],["analyzed",{"_index":815,"t":{"91":{"position":[[22,8]]}}}],["analyzing",{"_index":49,"t":{"7":{"position":[[122,9]]},"121":{"position":[[564,9]]}}}],["another",{"_index":250,"t":{"21":{"position":[[147,7]]},"86":{"position":[[561,7]]},"250":{"position":[[522,7]]}}}],["answer",{"_index":191,"t":{"19":{"position":[[295,6]]},"73":{"position":[[120,6],[1425,6]]},"89":{"position":[[355,6]]},"91":{"position":[[166,7]]},"95":{"position":[[630,6]]},"118":{"position":[[1164,6],[1192,6]]},"127":{"position":[[2097,6]]},"130":{"position":[[84,6],[464,6]]}}}],["answered",{"_index":336,"t":{"27":{"position":[[623,8],[712,8]]},"133":{"position":[[35,8]]}}}],["answers",{"_index":329,"t":{"27":{"position":[[532,7]]}}}],["anybody",{"_index":868,"t":{"100":{"position":[[168,7]]}}}],["api",{"_index":467,"t":{"43":{"position":[[92,3]]},"45":{"position":[[36,3],[946,3]]},"95":{"position":[[162,3],[255,4]]},"98":{"position":[[30,4],[78,4],[186,3]]},"100":{"position":[[17,3],[145,3],[186,3],[300,3],[318,3],[414,3],[521,3],[540,3]]},"102":{"position":[[49,3],[137,3],[315,3],[429,3],[558,3]]},"104":{"position":[[20,3]]},"106":{"position":[[55,3],[94,3],[339,3]]},"108":{"position":[[7,3]]},"110":{"position":[[155,3]]},"118":{"position":[[56,3],[1545,3]]},"127":{"position":[[56,3],[3016,3]]},"167":{"position":[[122,3]]},"185":{"position":[[122,3]]},"189":{"position":[[87,3]]},"205":{"position":[[122,3]]},"212":{"position":[[335,3]]},"228":{"position":[[122,3]]},"246":{"position":[[122,3]]}}}],["api_2gdxmflhj",{"_index":855,"t":{"98":{"position":[[207,16]]}}}],["apiexception",{"_index":476,"t":{"45":{"position":[[68,13],[178,13],[370,12]]},"49":{"position":[[73,13]]}}}],["app",{"_index":845,"t":{"95":{"position":[[145,3]]}}}],["appear",{"_index":342,"t":{"27":{"position":[[810,6]]}}}],["application",{"_index":63,"t":{"9":{"position":[[64,11]]},"11":{"position":[[78,11],[160,11]]},"21":{"position":[[292,11],[355,11],[972,11],[1051,11],[1135,11]]},"27":{"position":[[428,11]]},"51":{"position":[[52,11],[185,12]]},"53":{"position":[[194,12]]},"55":{"position":[[155,11]]},"57":{"position":[[78,11]]},"59":{"position":[[124,11]]},"100":{"position":[[462,12]]},"112":{"position":[[163,12],[217,11]]},"118":{"position":[[33,11],[111,12],[956,11],[1446,11]]},"121":{"position":[[30,11],[172,11],[481,11],[804,11],[1915,12]]},"127":{"position":[[33,11],[111,12],[1374,11],[2917,11]]},"201":{"position":[[150,11]]},"224":{"position":[[149,11]]}}}],["applications",{"_index":12,"t":{"3":{"position":[[118,12],[191,12],[333,12]]},"5":{"position":[[73,13]]},"13":{"position":[[111,13]]},"15":{"position":[[56,12],[331,13],[919,13],[1035,13],[1089,13],[1158,12]]},"43":{"position":[[14,12]]},"59":{"position":[[251,12]]},"61":{"position":[[91,12]]},"110":{"position":[[212,12],[298,12]]},"147":{"position":[[308,12]]},"167":{"position":[[146,12]]},"185":{"position":[[146,12]]},"205":{"position":[[147,12]]},"228":{"position":[[146,12]]},"246":{"position":[[146,12]]}}}],["apply",{"_index":94,"t":{"13":{"position":[[27,5]]},"15":{"position":[[946,5]]}}}],["appropriate",{"_index":557,"t":{"53":{"position":[[20,11]]}}}],["apt",{"_index":1252,"t":{"163":{"position":[[119,3],[135,3]]},"165":{"position":[[352,3],[393,3]]}}}],["arch",{"_index":1257,"t":{"163":{"position":[[245,4]]}}}],["arduino",{"_index":1400,"t":{"256":{"position":[[33,7],[223,8]]}}}],["area",{"_index":1071,"t":{"121":{"position":[[1830,5]]}}}],["areas",{"_index":1056,"t":{"121":{"position":[[1395,5],[1539,6]]}}}],["argument",{"_index":893,"t":{"102":{"position":[[516,9]]}}}],["arm",{"_index":1325,"t":{"199":{"position":[[114,3]]},"201":{"position":[[121,3]]},"222":{"position":[[114,3]]},"224":{"position":[[120,3]]}}}],["arms",{"_index":662,"t":{"69":{"position":[[93,5]]}}}],["array",{"_index":433,"t":{"39":{"position":[[642,6]]}}}],["arrays",{"_index":361,"t":{"31":{"position":[[91,7]]},"35":{"position":[[125,7]]},"37":{"position":[[47,7]]},"39":{"position":[[95,6],[388,6]]}}}],["ask",{"_index":1158,"t":{"130":{"position":[[38,3],[137,3]]},"139":{"position":[[126,3]]}}}],["ask.py",{"_index":849,"t":{"95":{"position":[[338,6],[678,6]]}}}],["ask_async",{"_index":181,"t":{"19":{"position":[[139,9],[195,9],[443,9]]}}}],["asked",{"_index":290,"t":{"23":{"position":[[815,5]]}}}],["aspects",{"_index":99,"t":{"15":{"position":[[36,7]]}}}],["assembly",{"_index":640,"t":{"65":{"position":[[251,9]]}}}],["assigned",{"_index":914,"t":{"108":{"position":[[142,8]]}}}],["assist",{"_index":610,"t":{"63":{"position":[[45,6]]}}}],["assistance",{"_index":1402,"t":{"256":{"position":[[159,10]]}}}],["assume",{"_index":218,"t":{"19":{"position":[[808,6]]},"21":{"position":[[343,6]]}}}],["assuming",{"_index":1227,"t":{"153":{"position":[[0,8]]},"173":{"position":[[0,8]]},"197":{"position":[[0,8]]},"220":{"position":[[0,8]]},"234":{"position":[[0,8]]}}}],["async",{"_index":279,"t":{"23":{"position":[[160,5],[724,5]]}}}],["asynchronous",{"_index":133,"t":{"15":{"position":[[610,12],[668,12]]},"17":{"position":[[55,12]]}}}],["asynchronously",{"_index":136,"t":{"15":{"position":[[718,14]]},"19":{"position":[[114,14]]},"23":{"position":[[31,15],[821,14]]}}}],["attempting",{"_index":277,"t":{"23":{"position":[[94,10]]}}}],["attention",{"_index":949,"t":{"112":{"position":[[387,9]]}}}],["audit",{"_index":790,"t":{"86":{"position":[[511,5]]}}}],["authenticate",{"_index":851,"t":{"98":{"position":[[97,12]]}}}],["authorize",{"_index":852,"t":{"98":{"position":[[133,9]]}}}],["automatically",{"_index":692,"t":{"73":{"position":[[460,13]]},"91":{"position":[[73,13]]},"102":{"position":[[288,13]]},"199":{"position":[[142,13]]},"222":{"position":[[142,13]]}}}],["automating",{"_index":611,"t":{"63":{"position":[[55,10]]}}}],["automation",{"_index":599,"t":{"61":{"position":[[148,10]]},"65":{"position":[[60,10]]}}}],["available",{"_index":192,"t":{"19":{"position":[[308,9]]},"23":{"position":[[431,9]]},"121":{"position":[[713,9]]},"189":{"position":[[95,10]]},"256":{"position":[[84,9]]}}}],["avoid",{"_index":540,"t":{"49":{"position":[[87,5]]},"102":{"position":[[210,5]]}}}],["away",{"_index":824,"t":{"91":{"position":[[392,4]]},"127":{"position":[[1538,4]]}}}],["back",{"_index":588,"t":{"57":{"position":[[192,4]]},"91":{"position":[[617,4]]}}}],["backend",{"_index":1308,"t":{"191":{"position":[[303,7],[311,8]]}}}],["backend:latest",{"_index":1309,"t":{"191":{"position":[[380,14]]}}}],["backoff",{"_index":572,"t":{"55":{"position":[[65,7]]}}}],["bad",{"_index":506,"t":{"45":{"position":[[649,3]]},"130":{"position":[[580,3]]}}}],["balance",{"_index":450,"t":{"39":{"position":[[1031,7]]},"73":{"position":[[1489,7]]}}}],["bandwidth",{"_index":304,"t":{"25":{"position":[[190,10]]}}}],["based",{"_index":54,"t":{"7":{"position":[[159,5]]},"11":{"position":[[132,5]]},"13":{"position":[[57,5]]},"15":{"position":[[976,5]]},"17":{"position":[[422,5]]},"21":{"position":[[259,5],[867,5],[958,5],[1037,5],[1121,5]]},"61":{"position":[[24,5]]},"121":{"position":[[1909,5]]},"133":{"position":[[86,5]]},"163":{"position":[[99,5],[201,5]]},"256":{"position":[[41,5]]}}}],["basics",{"_index":1274,"t":{"165":{"position":[[381,6]]}}}],["become",{"_index":627,"t":{"63":{"position":[[297,6]]}}}],["before",{"_index":246,"t":{"19":{"position":[[1427,6]]},"39":{"position":[[476,6],[684,6]]},"73":{"position":[[708,6]]},"110":{"position":[[328,6]]},"118":{"position":[[1404,6]]}}}],["behavior",{"_index":589,"t":{"57":{"position":[[210,9]]},"121":{"position":[[853,9]]}}}],["being",{"_index":1013,"t":{"121":{"position":[[240,5]]}}}],["below",{"_index":739,"t":{"73":{"position":[[1890,5]]},"147":{"position":[[35,5]]},"163":{"position":[[182,7]]}}}],["belt",{"_index":1166,"t":{"130":{"position":[[255,4],[321,6]]}}}],["beneficial",{"_index":1023,"t":{"121":{"position":[[500,10]]}}}],["best",{"_index":534,"t":{"47":{"position":[[52,4]]},"59":{"position":[[199,4]]},"73":{"position":[[231,4]]},"100":{"position":[[111,4],[272,4]]},"102":{"position":[[101,4]]}}}],["beta",{"_index":808,"t":{"89":{"position":[[418,6]]}}}],["better",{"_index":681,"t":{"73":{"position":[[152,6],[529,6]]},"86":{"position":[[285,6]]}}}],["between",{"_index":553,"t":{"51":{"position":[[113,7]]},"69":{"position":[[181,7]]}}}],["bgr",{"_index":378,"t":{"35":{"position":[[158,3]]},"37":{"position":[[100,3],[463,3]]},"39":{"position":[[30,3],[133,3],[212,3],[770,3]]}}}],["bgr_img",{"_index":435,"t":{"39":{"position":[[780,7]]}}}],["binary",{"_index":1159,"t":{"130":{"position":[[42,6]]},"133":{"position":[[17,6]]},"141":{"position":[[14,6]]},"143":{"position":[[23,7]]}}}],["black",{"_index":1180,"t":{"135":{"position":[[91,5]]}}}],["blocked",{"_index":486,"t":{"45":{"position":[[300,10]]}}}],["blue",{"_index":441,"t":{"39":{"position":[[865,4]]}}}],["board",{"_index":1368,"t":{"248":{"position":[[84,6]]},"250":{"position":[[108,6],[229,5],[341,6]]}}}],["boards",{"_index":1386,"t":{"254":{"position":[[26,7],[51,6]]}}}],["body",{"_index":1087,"t":{"127":{"position":[[807,6]]}}}],["body=daily_summary",{"_index":1152,"t":{"127":{"position":[[2859,19]]}}}],["bottlenecks",{"_index":632,"t":{"65":{"position":[[97,12]]}}}],["boxes",{"_index":1167,"t":{"130":{"position":[[260,7],[299,5]]}}}],["breaking",{"_index":813,"t":{"89":{"position":[[521,8]]}}}],["brew",{"_index":1290,"t":{"183":{"position":[[117,4]]}}}],["broad",{"_index":542,"t":{"49":{"position":[[102,5]]}}}],["browser",{"_index":1320,"t":{"191":{"position":[[711,8]]},"250":{"position":[[374,7],[530,7]]}}}],["build",{"_index":10,"t":{"3":{"position":[[105,5]]},"9":{"position":[[90,5]]},"43":{"position":[[150,5]]},"47":{"position":[[92,5]]},"89":{"position":[[0,5]]},"210":{"position":[[223,5]]}}}],["building",{"_index":100,"t":{"15":{"position":[[47,8],[1133,8]]},"21":{"position":[[312,9]]},"43":{"position":[[5,8]]},"147":{"position":[[292,8]]},"167":{"position":[[137,8]]},"185":{"position":[[137,8]]},"205":{"position":[[137,9]]},"228":{"position":[[137,8]]},"246":{"position":[[137,8]]},"254":{"position":[[95,8]]}}}],["built",{"_index":29,"t":{"3":{"position":[[346,5]]}}}],["bunch",{"_index":1342,"t":{"210":{"position":[[25,5]]}}}],["busier",{"_index":1032,"t":{"121":{"position":[[871,6]]}}}],["business",{"_index":91,"t":{"11":{"position":[[272,8]]}}}],["business's",{"_index":1104,"t":{"127":{"position":[[1136,10]]}}}],["button",{"_index":905,"t":{"106":{"position":[[105,7]]},"110":{"position":[[68,6]]}}}],["c",{"_index":1236,"t":{"157":{"position":[[125,1]]},"177":{"position":[[125,1]]},"238":{"position":[[125,1]]}}}],["cable",{"_index":1373,"t":{"250":{"position":[[265,6]]}}}],["call",{"_index":474,"t":{"45":{"position":[[40,5]]},"82":{"position":[[203,5]]},"98":{"position":[[70,4]]}}}],["called",{"_index":1298,"t":{"191":{"position":[[91,6]]}}}],["calls",{"_index":468,"t":{"43":{"position":[[96,6]]}}}],["cam",{"_index":228,"t":{"19":{"position":[[1062,3]]},"35":{"position":[[326,3]]},"254":{"position":[[272,3]]}}}],["cam.read",{"_index":236,"t":{"19":{"position":[[1156,10]]},"35":{"position":[[408,10]]}}}],["cam.release",{"_index":248,"t":{"19":{"position":[[1460,13]]},"35":{"position":[[510,13]]}}}],["camera",{"_index":70,"t":{"9":{"position":[[151,7]]},"17":{"position":[[306,6]]},"19":{"position":[[1101,6],[1196,6],[1488,6]]},"35":{"position":[[365,6],[538,6]]},"114":{"position":[[79,6]]},"118":{"position":[[310,6]]},"121":{"position":[[1768,6],[1840,6]]},"123":{"position":[[79,6]]},"127":{"position":[[423,6]]},"147":{"position":[[192,6]]},"189":{"position":[[52,6]]},"248":{"position":[[77,6]]},"250":{"position":[[101,6],[222,6],[334,6]]},"254":{"position":[[192,6],[241,6]]}}}],["cameras",{"_index":55,"t":{"7":{"position":[[165,8]]},"39":{"position":[[242,7]]},"41":{"position":[[185,7],[314,7],[325,7]]}}}],["campaigns",{"_index":1039,"t":{"121":{"position":[[1001,9]]}}}],["cap",{"_index":965,"t":{"118":{"position":[[352,3]]},"127":{"position":[[465,3]]}}}],["cap.read",{"_index":967,"t":{"118":{"position":[[391,10]]},"127":{"position":[[504,10]]}}}],["cap.release",{"_index":968,"t":{"118":{"position":[[402,13]]},"127":{"position":[[515,13]]}}}],["capabilities",{"_index":154,"t":{"15":{"position":[[1228,13]]},"69":{"position":[[142,12]]}}}],["capture",{"_index":237,"t":{"19":{"position":[[1169,7]]},"35":{"position":[[421,7]]},"118":{"position":[[284,7],[1367,7]]},"127":{"position":[[397,7],[1887,7]]}}}],["capture_image",{"_index":964,"t":{"118":{"position":[[335,16],[1065,15],[1486,13]]},"127":{"position":[[448,16],[1840,15],[2957,13]]}}}],["captures",{"_index":999,"t":{"118":{"position":[[1458,8]]},"127":{"position":[[2929,8]]}}}],["cardboard",{"_index":1169,"t":{"130":{"position":[[289,9]]}}}],["case",{"_index":206,"t":{"19":{"position":[[541,4]]}}}],["cases",{"_index":19,"t":{"3":{"position":[[220,6]]}}}],["catch",{"_index":536,"t":{"49":{"position":[[0,5]]},"59":{"position":[[84,5]]}}}],["catching",{"_index":541,"t":{"49":{"position":[[93,8]]}}}],["cause",{"_index":1361,"t":{"214":{"position":[[123,5]]}}}],["cautious",{"_index":895,"t":{"102":{"position":[[621,8]]}}}],["centers",{"_index":619,"t":{"63":{"position":[[154,8]]}}}],["change",{"_index":429,"t":{"39":{"position":[[528,6]]},"89":{"position":[[458,6]]}}}],["changes",{"_index":814,"t":{"89":{"position":[[530,8]]}}}],["changing",{"_index":1388,"t":{"254":{"position":[[133,8]]}}}],["channel",{"_index":413,"t":{"37":{"position":[[430,7]]},"39":{"position":[[462,7],[670,7],[753,7]]}}}],["channels=wf.getnchannels",{"_index":980,"t":{"118":{"position":[[739,27]]}}}],["check",{"_index":101,"t":{"15":{"position":[[87,5]]},"82":{"position":[[29,5]]},"100":{"position":[[50,5]]},"157":{"position":[[3,5]]},"161":{"position":[[3,5]]},"177":{"position":[[3,5]]},"181":{"position":[[3,5]]},"238":{"position":[[3,5]]},"242":{"position":[[3,5]]}}}],["checker",{"_index":484,"t":{"45":{"position":[[265,9]]}}}],["checking",{"_index":997,"t":{"118":{"position":[[1411,8]]},"159":{"position":[[259,9]]},"179":{"position":[[259,9]]},"240":{"position":[[259,9]]}}}],["checks",{"_index":1016,"t":{"121":{"position":[[273,6]]}}}],["choose",{"_index":1216,"t":{"147":{"position":[[0,6]]}}}],["chrome",{"_index":1379,"t":{"250":{"position":[[512,6]]}}}],["chunk",{"_index":972,"t":{"118":{"position":[[605,5]]}}}],["classes",{"_index":551,"t":{"51":{"position":[[35,7]]}}}],["cleanliness",{"_index":1205,"t":{"143":{"position":[[31,13]]}}}],["clear",{"_index":368,"t":{"33":{"position":[[213,7],[240,8]]},"121":{"position":[[1812,5]]},"141":{"position":[[96,5]]}}}],["click",{"_index":904,"t":{"106":{"position":[[72,5],[189,5]]},"110":{"position":[[49,5]]},"250":{"position":[[272,5]]}}}],["clicks",{"_index":1371,"t":{"250":{"position":[[158,7]]}}}],["cloud",{"_index":319,"t":{"27":{"position":[[284,5],[408,5],[728,6],[824,5]]},"82":{"position":[[88,5]]}}}],["clouds",{"_index":1199,"t":{"139":{"position":[[147,6]]}}}],["clutter",{"_index":1208,"t":{"143":{"position":[[136,7]]}}}],["cnc",{"_index":617,"t":{"63":{"position":[[132,3]]},"69":{"position":[[269,3]]}}}],["cobot",{"_index":661,"t":{"69":{"position":[[79,5]]}}}],["code",{"_index":14,"t":{"3":{"position":[[144,5]]},"23":{"position":[[276,4]]},"37":{"position":[[273,4]]},"43":{"position":[[163,4]]},"45":{"position":[[571,4],[596,5]]},"47":{"position":[[105,5]]},"73":{"position":[[378,4],[2056,4]]},"86":{"position":[[245,4]]},"98":{"position":[[148,4]]},"100":{"position":[[80,4]]},"102":{"position":[[258,4],[368,4],[649,4]]},"187":{"position":[[145,4]]},"248":{"position":[[35,4]]},"256":{"position":[[11,4]]}}}],["codes",{"_index":504,"t":{"45":{"position":[[636,6]]}}}],["collaboration",{"_index":666,"t":{"69":{"position":[[167,13]]}}}],["color",{"_index":389,"t":{"37":{"position":[[104,5]]},"39":{"position":[[216,5],[1025,5]]}}}],["combines",{"_index":831,"t":{"93":{"position":[[36,8]]}}}],["come",{"_index":830,"t":{"91":{"position":[[612,4]]}}}],["comes",{"_index":1345,"t":{"210":{"position":[[293,5]]}}}],["command",{"_index":58,"t":{"7":{"position":[[210,8]]},"155":{"position":[[60,7]]},"159":{"position":[[88,8]]},"175":{"position":[[60,7]]},"179":{"position":[[88,8]]},"191":{"position":[[601,7]]},"199":{"position":[[60,7]]},"222":{"position":[[60,7]]},"236":{"position":[[60,7],[76,7]]},"240":{"position":[[88,8]]},"242":{"position":[[47,7]]}}}],["commands",{"_index":642,"t":{"65":{"position":[[301,8]]}}}],["commit",{"_index":896,"t":{"102":{"position":[[637,6]]}}}],["committing",{"_index":890,"t":{"102":{"position":[[229,10]]}}}],["common",{"_index":52,"t":{"7":{"position":[[148,6]]},"45":{"position":[[617,6]]}}}],["commonly",{"_index":1360,"t":{"214":{"position":[[6,8]]}}}],["communicate",{"_index":210,"t":{"19":{"position":[[651,11]]}}}],["communicating",{"_index":318,"t":{"27":{"position":[[249,13]]}}}],["communication",{"_index":673,"t":{"69":{"position":[[349,13]]}}}],["compatibility",{"_index":422,"t":{"39":{"position":[[189,13]]}}}],["compatible",{"_index":1326,"t":{"199":{"position":[[118,10]]},"222":{"position":[[118,10]]}}}],["complete",{"_index":938,"t":{"112":{"position":[[154,8]]},"203":{"position":[[6,8]]},"226":{"position":[[6,8]]}}}],["completing",{"_index":1223,"t":{"147":{"position":[[212,10]]}}}],["complex",{"_index":23,"t":{"3":{"position":[[259,7]]},"63":{"position":[[267,7]]},"73":{"position":[[318,7]]}}}],["compose",{"_index":1318,"t":{"191":{"position":[[643,7]]}}}],["compose.yml",{"_index":1299,"t":{"191":{"position":[[105,11]]}}}],["compress/2174925f24362c479b2.jpg",{"_index":798,"t":{"86":{"position":[[795,33]]}}}],["compression",{"_index":1356,"t":{"212":{"position":[[279,11]]}}}],["computer",{"_index":3,"t":{"3":{"position":[[32,9]]},"13":{"position":[[63,8]]},"15":{"position":[[982,8],[1191,8]]},"61":{"position":[[30,8],[200,8]]},"63":{"position":[[14,8]]},"65":{"position":[[26,8]]},"67":{"position":[[14,8],[196,8]]},"69":{"position":[[14,8]]},"71":{"position":[[55,8]]},"89":{"position":[[16,8]]},"91":{"position":[[343,8]]},"121":{"position":[[1876,8]]},"187":{"position":[[72,9]]},"189":{"position":[[25,8]]},"191":{"position":[[23,9]]},"250":{"position":[[245,8]]}}}],["computer's",{"_index":943,"t":{"112":{"position":[[269,10]]}}}],["computing",{"_index":143,"t":{"15":{"position":[[839,9]]},"93":{"position":[[123,10]]}}}],["confidence",{"_index":115,"t":{"15":{"position":[[345,10],[455,10]]},"73":{"position":[[564,10],[662,10],[791,10],[1319,10],[1469,10],[1530,10],[1617,10],[1908,10],[2235,10],[2294,10]]},"86":{"position":[[497,10]]},"91":{"position":[[142,11],[641,11]]},"127":{"position":[[1563,10]]}}}],["confidence_threshold=0.8",{"_index":1119,"t":{"127":{"position":[[1598,25]]}}}],["confidence_threshold=0.95",{"_index":714,"t":{"73":{"position":[[1232,26]]}}}],["confident",{"_index":294,"t":{"23":{"position":[[1125,9]]},"73":{"position":[[875,9]]}}}],["configuration",{"_index":1291,"t":{"187":{"position":[[86,13]]}}}],["configure",{"_index":114,"t":{"15":{"position":[[274,10]]},"27":{"position":[[332,9]]},"29":{"position":[[3,9]]},"165":{"position":[[449,9],[702,9]]}}}],["configuring",{"_index":123,"t":{"15":{"position":[[431,11]]}}}],["confirm",{"_index":924,"t":{"110":{"position":[[94,7]]}}}],["conflicts",{"_index":1362,"t":{"214":{"position":[[129,9]]}}}],["connected",{"_index":951,"t":{"114":{"position":[[69,9]]},"121":{"position":[[1861,9]]},"123":{"position":[[69,9]]},"189":{"position":[[9,9]]}}}],["consider",{"_index":548,"t":{"51":{"position":[[0,8]]},"256":{"position":[[239,8]]}}}],["considered",{"_index":1194,"t":{"137":{"position":[[114,10]]}}}],["consist",{"_index":856,"t":{"98":{"position":[[228,7]]}}}],["constrained",{"_index":1348,"t":{"212":{"position":[[27,12],[394,11]]}}}],["constructor",{"_index":344,"t":{"29":{"position":[[115,11]]},"102":{"position":[[504,11],[596,12]]}}}],["container",{"_index":48,"t":{"7":{"position":[[108,9]]}}}],["containers",{"_index":308,"t":{"27":{"position":[[42,10]]}}}],["contains",{"_index":496,"t":{"45":{"position":[[456,8],[546,8]]}}}],["content",{"_index":1177,"t":{"133":{"position":[[105,8]]}}}],["content/uploads/2010/11/over_flowing_garbage_can.jpg",{"_index":709,"t":{"73":{"position":[[1041,53]]}}}],["context",{"_index":563,"t":{"53":{"position":[[93,7]]},"141":{"position":[[72,8]]}}}],["continue",{"_index":1128,"t":{"127":{"position":[[1823,8],[1921,8],[2088,8]]}}}],["control",{"_index":118,"t":{"15":{"position":[[378,7]]},"61":{"position":[[344,8]]},"67":{"position":[[252,8]]},"69":{"position":[[367,7]]},"73":{"position":[[38,7]]},"100":{"position":[[219,7]]}}}],["conversion",{"_index":1359,"t":{"212":{"position":[[432,10]]}}}],["convert",{"_index":434,"t":{"39":{"position":[[726,7]]},"118":{"position":[[426,7]]},"127":{"position":[[539,7]]},"212":{"position":[[190,7]]}}}],["convey",{"_index":1188,"t":{"135":{"position":[[372,8]]}}}],["conveyor",{"_index":1170,"t":{"130":{"position":[[312,8]]}}}],["copy",{"_index":908,"t":{"106":{"position":[[211,4],[326,4]]},"191":{"position":[[144,4]]}}}],["corresponding",{"_index":1218,"t":{"147":{"position":[[76,13]]}}}],["cost",{"_index":71,"t":{"9":{"position":[[166,4]]},"25":{"position":[[176,5]]}}}],["costs",{"_index":730,"t":{"73":{"position":[[1677,6]]}}}],["couch",{"_index":934,"t":{"112":{"position":[[99,6],[206,6],[325,6]]},"114":{"position":[[140,5]]},"118":{"position":[[1028,5],[1236,8],[1593,6]]}}}],["counter",{"_index":1007,"t":{"121":{"position":[[127,7],[392,7],[608,8],[1151,7],[1370,7],[1477,7],[1792,8],[1989,7]]},"127":{"position":[[1514,10],[2481,7],[2839,7],[3067,8]]}}}],["counter's",{"_index":1155,"t":{"127":{"position":[[3134,9]]}}}],["couple",{"_index":884,"t":{"102":{"position":[[12,6]]}}}],["covers",{"_index":469,"t":{"43":{"position":[[113,6]]}}}],["create",{"_index":16,"t":{"3":{"position":[[184,6]]},"9":{"position":[[193,6]]},"15":{"position":[[266,7]]},"37":{"position":[[281,6]]},"59":{"position":[[223,6]]},"76":{"position":[[153,6]]},"95":{"position":[[152,6],[314,6]]},"106":{"position":[[82,7],[195,7]]},"191":{"position":[[73,6]]}}}],["create_detector(name",{"_index":760,"t":{"76":{"position":[[264,21]]}}}],["created",{"_index":754,"t":{"76":{"position":[[122,7]]}}}],["creates",{"_index":1011,"t":{"121":{"position":[[184,7]]}}}],["creating",{"_index":549,"t":{"51":{"position":[[9,8]]},"76":{"position":[[219,8]]},"108":{"position":[[156,8]]},"112":{"position":[[143,8]]}}}],["creation",{"_index":424,"t":{"39":{"position":[[299,10]]}}}],["crowded",{"_index":1062,"t":{"121":{"position":[[1531,7]]}}}],["curl",{"_index":1278,"t":{"165":{"position":[[442,4],[609,4]]}}}],["current",{"_index":913,"t":{"108":{"position":[[51,7]]},"250":{"position":[[493,7]]}}}],["current_hour",{"_index":1113,"t":{"127":{"position":[[1265,12],[1328,12],[2539,12],[2577,12]]}}}],["current_time",{"_index":1135,"t":{"127":{"position":[[2274,12]]}}}],["current_time.strftime(\"%i%p",{"_index":1139,"t":{"127":{"position":[[2373,29]]}}}],["currently",{"_index":807,"t":{"89":{"position":[[405,9]]}}}],["custom",{"_index":550,"t":{"51":{"position":[[18,6]]}}}],["customer",{"_index":1015,"t":{"121":{"position":[[260,9],[844,8],[1047,8],[1415,8],[1568,8],[1614,8],[2103,8]]},"127":{"position":[[1490,8],[3039,8]]}}}],["customers",{"_index":1008,"t":{"121":{"position":[[138,9],[769,10],[1125,9],[1339,9]]}}}],["customize",{"_index":1084,"t":{"127":{"position":[[709,9]]}}}],["cutting",{"_index":602,"t":{"61":{"position":[[187,7]]}}}],["cv2",{"_index":223,"t":{"19":{"position":[[951,3]]},"35":{"position":[[322,3]]},"118":{"position":[[174,3]]},"127":{"position":[[174,3]]}}}],["cv2.color_bgr2rgb",{"_index":970,"t":{"118":{"position":[[490,19]]},"127":{"position":[[603,19]]}}}],["cv2.videocapture(0",{"_index":229,"t":{"19":{"position":[[1068,19]]},"35":{"position":[[332,19]]},"118":{"position":[[358,19]]},"127":{"position":[[471,19]]}}}],["d",{"_index":481,"t":{"45":{"position":[[228,1]]},"73":{"position":[[1156,1]]},"86":{"position":[[670,1]]}}}],["daily",{"_index":1022,"t":{"121":{"position":[[448,5],[2009,5]]},"123":{"position":[[132,5]]},"127":{"position":[[671,5],[2650,6],[3203,5]]}}}],["daily_log",{"_index":1121,"t":{"127":{"position":[[1644,9],[2617,9],[2680,10],[2879,9]]}}}],["daily_log.append(msg",{"_index":1144,"t":{"127":{"position":[[2508,21]]}}}],["daily_summary",{"_index":1145,"t":{"127":{"position":[[2634,13],[2691,13]]}}}],["dashboard",{"_index":343,"t":{"27":{"position":[[830,10]]}}}],["data",{"_index":399,"t":{"37":{"position":[[212,4]]},"73":{"position":[[2016,4]]},"91":{"position":[[103,5]]},"118":{"position":[[804,4],[838,5],[863,4]]},"121":{"position":[[1269,4]]}}}],["database",{"_index":214,"t":{"19":{"position":[[735,9],[831,8],[1351,8]]},"21":{"position":[[415,8]]}}}],["dataset",{"_index":783,"t":{"86":{"position":[[160,8]]},"91":{"position":[[446,8]]}}}],["date",{"_index":921,"t":{"108":{"position":[[250,4]]}}}],["datetime",{"_index":1078,"t":{"127":{"position":[[256,8],[272,9]]}}}],["datetime.now",{"_index":1130,"t":{"127":{"position":[[2144,14]]}}}],["datetime.now().hour",{"_index":1114,"t":{"127":{"position":[[1280,19],[2554,19]]}}}],["datetime.now().replace(hour=start_of_business",{"_index":1136,"t":{"127":{"position":[[2289,46]]}}}],["datetime.now().replace(minute=0",{"_index":1123,"t":{"127":{"position":[[1679,32]]}}}],["day",{"_index":1010,"t":{"121":{"position":[[163,4],[429,4],[891,3]]},"127":{"position":[[3184,4]]}}}],["days",{"_index":1033,"t":{"121":{"position":[[907,4]]}}}],["db.get_next_image_query_id",{"_index":256,"t":{"21":{"position":[[428,28],[666,28],[1219,28]]}}}],["db.save(image_query.id",{"_index":221,"t":{"19":{"position":[[883,24],[1296,23]]}}}],["debian",{"_index":1250,"t":{"163":{"position":[[92,6]]}}}],["debug",{"_index":565,"t":{"53":{"position":[[133,5]]}}}],["debugging",{"_index":493,"t":{"45":{"position":[[413,9]]},"49":{"position":[[150,9]]}}}],["decades",{"_index":420,"t":{"39":{"position":[[173,7]]}}}],["decisions",{"_index":1052,"t":{"121":{"position":[[1281,9],[2061,9]]}}}],["def",{"_index":963,"t":{"118":{"position":[[331,3],[578,3]]},"127":{"position":[[444,3],[765,3],[1233,3]]}}}],["default",{"_index":232,"t":{"19":{"position":[[1118,7]]},"35":{"position":[[382,7]]},"57":{"position":[[202,7]]},"165":{"position":[[38,8],[489,7]]},"210":{"position":[[199,7]]},"214":{"position":[[51,8]]}}}],["defaults",{"_index":763,"t":{"80":{"position":[[57,8]]},"84":{"position":[[57,8]]}}}],["defects",{"_index":651,"t":{"67":{"position":[[153,7]]}}}],["define",{"_index":962,"t":{"118":{"position":[[263,6],[528,6]]},"127":{"position":[[376,6],[641,6],[1119,6]]}}}],["definitions",{"_index":1391,"t":{"254":{"position":[[153,12]]}}}],["degrade",{"_index":1339,"t":{"208":{"position":[[336,8]]}}}],["delay",{"_index":1120,"t":{"127":{"position":[[1624,5]]}}}],["delayed",{"_index":690,"t":{"73":{"position":[[408,7]]}}}],["delete",{"_index":923,"t":{"110":{"position":[[59,8]]}}}],["demonstrates",{"_index":79,"t":{"11":{"position":[[90,12]]},"121":{"position":[[13,12]]}}}],["dependent",{"_index":1363,"t":{"214":{"position":[[150,9]]}}}],["depends_on",{"_index":1307,"t":{"191":{"position":[[289,11]]}}}],["deploy",{"_index":142,"t":{"15":{"position":[[812,6]]},"187":{"position":[[27,6]]},"250":{"position":[[56,6],[123,6]]}}}],["deployed",{"_index":167,"t":{"17":{"position":[[288,8]]},"252":{"position":[[62,8]]}}}],["deployment",{"_index":1367,"t":{"248":{"position":[[40,10]]}}}],["depth",{"_index":98,"t":{"15":{"position":[[12,5]]}}}],["described",{"_index":1260,"t":{"163":{"position":[[375,9]]},"183":{"position":[[233,9]]},"244":{"position":[[178,9]]}}}],["description",{"_index":498,"t":{"45":{"position":[[475,11]]}}}],["descriptive",{"_index":907,"t":{"106":{"position":[[134,11]]},"108":{"position":[[121,11]]}}}],["designed",{"_index":1370,"t":{"250":{"position":[[13,8]]}}}],["desired",{"_index":124,"t":{"15":{"position":[[447,7]]},"73":{"position":[[556,7],[783,7],[1900,7]]}}}],["desk",{"_index":1012,"t":{"121":{"position":[[232,4]]}}}],["despite",{"_index":584,"t":{"57":{"position":[[109,7]]}}}],["det",{"_index":366,"t":{"33":{"position":[[170,3]]},"89":{"position":[[125,3]]},"95":{"position":[[400,3]]}}}],["detailed",{"_index":34,"t":{"3":{"position":[[396,8]]}}}],["detect",{"_index":453,"t":{"39":{"position":[[1119,6]]}}}],["detected",{"_index":939,"t":{"112":{"position":[[190,8]]},"118":{"position":[[1220,8],[1577,8]]},"127":{"position":[[3051,8]]}}}],["detection",{"_index":22,"t":{"3":{"position":[[246,9]]}}}],["detector",{"_index":67,"t":{"9":{"position":[[116,8]]},"19":{"position":[[978,8]]},"21":{"position":[[565,8]]},"23":{"position":[[526,8]]},"73":{"position":[[624,9]]},"76":{"position":[[98,8],[234,8],[365,8]]},"78":{"position":[[55,8]]},"118":{"position":[[993,8],[1034,10]]},"121":{"position":[[194,8],[284,8]]},"127":{"position":[[1411,8]]},"130":{"position":[[202,8]]},"248":{"position":[[56,8]]},"250":{"position":[[80,8],[135,8],[311,8]]},"252":{"position":[[71,9]]}}}],["detector=detector",{"_index":991,"t":{"118":{"position":[[1136,18]]},"127":{"position":[[1975,18]]}}}],["detectors",{"_index":112,"t":{"15":{"position":[[242,10],[293,9],[481,10]]},"80":{"position":[[89,9],[166,9]]},"130":{"position":[[19,10]]},"187":{"position":[[51,9]]}}}],["detects",{"_index":1336,"t":{"208":{"position":[[224,7]]}}}],["determines",{"_index":696,"t":{"73":{"position":[[639,10]]}}}],["dev/bus/usb:/dev/bus/usb",{"_index":1317,"t":{"191":{"position":[[557,25]]}}}],["dev/video0:/dev/video0",{"_index":1311,"t":{"191":{"position":[[427,23]]}}}],["dev/video1:/dev/video1",{"_index":1312,"t":{"191":{"position":[[453,23]]}}}],["dev/video2:/dev/video2",{"_index":1313,"t":{"191":{"position":[[479,23]]}}}],["dev/video3:/dev/video3",{"_index":1314,"t":{"191":{"position":[[505,23]]}}}],["developed",{"_index":419,"t":{"39":{"position":[[163,9]]}}}],["development",{"_index":1293,"t":{"187":{"position":[[150,11]]}}}],["device",{"_index":309,"t":{"27":{"position":[[65,8],[84,6],[115,7]]},"147":{"position":[[199,6]]},"191":{"position":[[745,7],[799,7]]},"250":{"position":[[436,7]]}}}],["devices",{"_index":299,"t":{"25":{"position":[[90,8]]},"69":{"position":[[291,7]]},"191":{"position":[[416,8]]},"193":{"position":[[70,8]]},"208":{"position":[[54,8]]}}}],["difference",{"_index":335,"t":{"27":{"position":[[590,10]]},"39":{"position":[[814,10],[1080,10]]}}}],["different",{"_index":457,"t":{"41":{"position":[[32,9],[265,9]]},"45":{"position":[[97,9]]},"139":{"position":[[37,9],[63,9]]}}}],["differentiate",{"_index":552,"t":{"51":{"position":[[99,13]]}}}],["difficult",{"_index":544,"t":{"49":{"position":[[160,9]]}}}],["directly",{"_index":363,"t":{"33":{"position":[[42,8]]},"35":{"position":[[272,8]]},"86":{"position":[[415,9]]},"100":{"position":[[61,8]]},"102":{"position":[[568,8]]},"214":{"position":[[209,9]]}}}],["directory",{"_index":1301,"t":{"191":{"position":[[133,10],[625,10]]}}}],["discover",{"_index":141,"t":{"15":{"position":[[796,8]]}}}],["display",{"_index":1234,"t":{"157":{"position":[[52,7]]},"177":{"position":[[52,7]]},"238":{"position":[[52,7]]}}}],["displaying",{"_index":585,"t":{"57":{"position":[[144,10]]}}}],["distribution's",{"_index":1247,"t":{"163":{"position":[[9,14]]}}}],["distutils",{"_index":1277,"t":{"165":{"position":[[432,9]]}}}],["dnf",{"_index":1256,"t":{"163":{"position":[[221,3]]}}}],["docker",{"_index":47,"t":{"7":{"position":[[101,6],[203,6],[228,6]]},"27":{"position":[[35,6]]},"191":{"position":[[8,6],[98,6],[636,6]]},"201":{"position":[[12,6],[74,6],[165,6]]},"224":{"position":[[12,6],[73,6],[164,6]]}}}],["docker's",{"_index":1297,"t":{"191":{"position":[[37,8]]}}}],["docker.io/groundlight/monitoring",{"_index":1303,"t":{"191":{"position":[[199,32],[327,32]]}}}],["docs/static/img/doorway.jpg",{"_index":803,"t":{"89":{"position":[[209,31]]},"95":{"position":[[484,31]]}}}],["document",{"_index":935,"t":{"112":{"position":[[111,8]]}}}],["documentation",{"_index":184,"t":{"19":{"position":[[174,13]]},"23":{"position":[[448,13]]},"167":{"position":[[159,13]]},"185":{"position":[[159,13]]},"228":{"position":[[159,13]]},"246":{"position":[[159,13]]}}}],["doesn't",{"_index":756,"t":{"76":{"position":[[176,7]]}}}],["dog",{"_index":933,"t":{"112":{"position":[[87,3],[183,3],[306,3],[378,3]]},"114":{"position":[[152,3]]},"118":{"position":[[1570,3]]}}}],["dog_on_couch_detector.py",{"_index":1002,"t":{"118":{"position":[[1682,24],[1726,24]]}}}],["domain.com/wp",{"_index":708,"t":{"73":{"position":[[1027,13]]}}}],["don't",{"_index":891,"t":{"102":{"position":[[339,5]]},"141":{"position":[[47,5]]},"212":{"position":[[474,5],[520,5]]},"250":{"position":[[451,5]]}}}],["done",{"_index":212,"t":{"19":{"position":[[724,4]]},"187":{"position":[[103,4]]},"212":{"position":[[446,4]]}}}],["door",{"_index":77,"t":{"11":{"position":[[56,4],[138,4],[183,4],[220,4]]}}}],["doorway",{"_index":795,"t":{"86":{"position":[[730,7]]},"89":{"position":[[187,7]]},"95":{"position":[[462,7]]}}}],["download",{"_index":298,"t":{"25":{"position":[[51,8]]},"165":{"position":[[581,8]]},"183":{"position":[[0,8]]},"244":{"position":[[0,8]]}}}],["downloading",{"_index":316,"t":{"27":{"position":[[205,11]]}}}],["driven",{"_index":1051,"t":{"121":{"position":[[1274,6]]}}}],["due",{"_index":517,"t":{"45":{"position":[[812,3]]},"86":{"position":[[483,3]]}}}],["during",{"_index":88,"t":{"11":{"position":[[252,6]]},"43":{"position":[[85,6]]},"45":{"position":[[26,6]]},"121":{"position":[[723,6]]}}}],["e",{"_index":491,"t":{"45":{"position":[[386,2]]},"118":{"position":[[1297,2],[1338,5]]},"127":{"position":[[2023,2],[2064,5]]}}}],["e.g",{"_index":558,"t":{"53":{"position":[[43,6]]},"114":{"position":[[112,6]]},"127":{"position":[[1192,4],[1224,4]]},"161":{"position":[[140,6]]},"181":{"position":[[140,6]]},"242":{"position":[[146,6]]}}}],["e.reason",{"_index":495,"t":{"45":{"position":[[447,8],[522,12]]}}}],["e.status",{"_index":501,"t":{"45":{"position":[[537,8],[602,12]]}}}],["each",{"_index":919,"t":{"108":{"position":[[224,4]]}}}],["earlier",{"_index":1261,"t":{"163":{"position":[[385,8]]},"183":{"position":[[243,8]]},"244":{"position":[[188,8]]}}}],["early",{"_index":460,"t":{"41":{"position":[[115,5]]},"59":{"position":[[97,5]]}}}],["easiest",{"_index":1267,"t":{"165":{"position":[[171,7]]},"187":{"position":[[12,7]]}}}],["easily",{"_index":660,"t":{"69":{"position":[[48,6]]},"73":{"position":[[387,6]]},"106":{"position":[[163,6]]}}}],["easy",{"_index":46,"t":{"7":{"position":[[89,4]]},"15":{"position":[[653,4]]},"250":{"position":[[36,4]]}}}],["edge",{"_index":140,"t":{"15":{"position":[[790,5],[834,4]]},"25":{"position":[[30,4],[85,4],[152,5]]},"27":{"position":[[4,4],[59,5],[79,4],[172,4],[310,4],[373,4],[502,4],[639,4],[764,6],[771,4]]},"29":{"position":[[44,4]]},"61":{"position":[[195,4]]},"93":{"position":[[118,4]]},"208":{"position":[[49,4]]}}}],["effectively",{"_index":566,"t":{"53":{"position":[[151,11]]}}}],["effectiveness",{"_index":1048,"t":{"121":{"position":[[1189,13]]}}}],["efficiency",{"_index":607,"t":{"61":{"position":[[306,11]]}}}],["efficient",{"_index":629,"t":{"63":{"position":[[324,10]]}}}],["elif",{"_index":269,"t":{"21":{"position":[[984,4],[1063,4]]}}}],["email",{"_index":1074,"t":{"121":{"position":[[2023,6]]},"123":{"position":[[89,5]]},"127":{"position":[[685,6]]},"252":{"position":[[81,5]]}}}],["email.mime.multipart",{"_index":1080,"t":{"127":{"position":[[297,20]]}}}],["email.mime.text",{"_index":1082,"t":{"127":{"position":[[344,15]]}}}],["emails",{"_index":1021,"t":{"121":{"position":[[437,6]]},"127":{"position":[[3192,6]]}}}],["employees",{"_index":1029,"t":{"121":{"position":[[699,9]]}}}],["enables",{"_index":9,"t":{"3":{"position":[[90,7]]}}}],["enabling",{"_index":596,"t":{"61":{"position":[[107,8]]},"63":{"position":[[198,8]]},"121":{"position":[[2030,8]]}}}],["encounter",{"_index":466,"t":{"43":{"position":[[61,9]]}}}],["encourage",{"_index":1054,"t":{"121":{"position":[[1329,9]]}}}],["encrypted",{"_index":874,"t":{"100":{"position":[[362,9]]}}}],["end",{"_index":954,"t":{"114":{"position":[[183,3],[190,3]]},"121":{"position":[[418,3]]},"127":{"position":[[3173,3]]},"165":{"position":[[56,3]]},"203":{"position":[[15,3],[22,3]]},"226":{"position":[[15,3],[22,3]]}}}],["end_of_business",{"_index":1109,"t":{"127":{"position":[[1201,15],[1343,15],[2593,15]]}}}],["endpoint",{"_index":306,"t":{"27":{"position":[[9,8],[177,8],[315,9],[414,9],[507,9],[644,8]]},"29":{"position":[[49,9],[83,8]]}}}],["endpoint's",{"_index":322,"t":{"27":{"position":[[378,10]]}}}],["energy",{"_index":305,"t":{"25":{"position":[[205,7]]}}}],["engagement",{"_index":1043,"t":{"121":{"position":[[1056,11]]}}}],["enhance",{"_index":664,"t":{"69":{"position":[[128,7]]}}}],["enhancing",{"_index":606,"t":{"61":{"position":[[296,9]]}}}],["enough",{"_index":818,"t":{"91":{"position":[[135,6]]},"121":{"position":[[692,6]]}}}],["ensure",{"_index":581,"t":{"57":{"position":[[61,6]]},"59":{"position":[[15,6],[107,6]]},"116":{"position":[[0,6]]},"125":{"position":[[0,6]]},"151":{"position":[[0,6]]},"171":{"position":[[0,6]]},"195":{"position":[[0,6]]},"218":{"position":[[0,6]]},"232":{"position":[[0,6]]}}}],["ensuring",{"_index":648,"t":{"67":{"position":[[66,8]]},"121":{"position":[[678,8],[1801,8]]}}}],["environment",{"_index":349,"t":{"29":{"position":[[259,11]]},"69":{"position":[[401,12]]},"95":{"position":[[220,11]]},"100":{"position":[[383,11]]},"102":{"position":[[60,11],[155,11],[442,11]]},"127":{"position":[[752,12]]}}}],["environments",{"_index":144,"t":{"15":{"position":[[849,12]]}}}],["equipment",{"_index":622,"t":{"63":{"position":[[184,10]]}}}],["error",{"_index":473,"t":{"45":{"position":[[20,5],[494,5],[990,6],[1000,5]]},"53":{"position":[[50,6]]},"57":{"position":[[158,5]]},"59":{"position":[[32,5]]}}}],["errors",{"_index":128,"t":{"15":{"position":[[508,7],[563,6]]},"43":{"position":[[78,6],[139,6]]},"51":{"position":[[73,7],[121,6]]},"55":{"position":[[87,7]]},"57":{"position":[[117,7]]},"59":{"position":[[147,6],[287,6]]}}}],["escalate",{"_index":685,"t":{"73":{"position":[[256,8]]}}}],["escalated",{"_index":699,"t":{"73":{"position":[[734,10],[1939,9]]},"91":{"position":[[238,9]]}}}],["escalation",{"_index":694,"t":{"73":{"position":[[595,10]]},"86":{"position":[[197,10],[466,10]]},"93":{"position":[[14,10]]}}}],["esp32",{"_index":1222,"t":{"147":{"position":[[186,5]]},"248":{"position":[[71,5]]},"250":{"position":[[95,5],[216,5],[328,5]]},"254":{"position":[[45,5],[174,5],[223,5],[266,5]]},"256":{"position":[[70,6]]}}}],["esp32s3",{"_index":1398,"t":{"254":{"position":[[304,7]]}}}],["etc",{"_index":560,"t":{"53":{"position":[[66,5]]}}}],["evaluations",{"_index":301,"t":{"25":{"position":[[133,11]]}}}],["even",{"_index":314,"t":{"27":{"position":[[147,4]]},"91":{"position":[[405,4]]},"201":{"position":[[60,4]]},"224":{"position":[[59,4]]}}}],["event",{"_index":1154,"t":{"127":{"position":[[3088,6]]}}}],["example",{"_index":165,"t":{"17":{"position":[[254,8]]},"19":{"position":[[796,8]]},"21":{"position":[[331,8]]},"33":{"position":[[84,8]]},"39":{"position":[[966,7]]},"73":{"position":[[749,8]]},"82":{"position":[[71,8],[126,8]]},"112":{"position":[[20,7]]},"121":{"position":[[5,7]]},"135":{"position":[[74,8]]},"203":{"position":[[26,7]]},"226":{"position":[[26,7]]}}}],["examples",{"_index":41,"t":{"5":{"position":[[41,8]]},"130":{"position":[[586,9]]}}}],["exceeded",{"_index":528,"t":{"45":{"position":[[959,8]]}}}],["except",{"_index":328,"t":{"27":{"position":[[517,6]]},"45":{"position":[[363,6]]},"118":{"position":[[1277,6]]},"127":{"position":[[2003,6]]}}}],["exception",{"_index":478,"t":{"45":{"position":[[126,10]]},"49":{"position":[[124,10]]},"51":{"position":[[25,9]]},"118":{"position":[[1284,9]]},"127":{"position":[[2010,9]]}}}],["exceptions",{"_index":472,"t":{"43":{"position":[[195,11]]},"47":{"position":[[77,10]]},"49":{"position":[[24,10],[108,10]]},"53":{"position":[[4,10]]},"55":{"position":[[14,11]]},"57":{"position":[[23,11]]},"59":{"position":[[304,10]]}}}],["execute",{"_index":731,"t":{"73":{"position":[[1702,7]]}}}],["executing",{"_index":738,"t":{"73":{"position":[[1855,10]]}}}],["existing",{"_index":669,"t":{"69":{"position":[[260,8]]},"76":{"position":[[89,8]]},"86":{"position":[[151,8]]}}}],["exists",{"_index":757,"t":{"76":{"position":[[184,7]]}}}],["expect",{"_index":538,"t":{"49":{"position":[[44,6]]}}}],["expected",{"_index":382,"t":{"35":{"position":[[227,8]]},"39":{"position":[[613,9]]},"59":{"position":[[56,9]]}}}],["expects",{"_index":415,"t":{"39":{"position":[[12,7]]}}}],["experience",{"_index":1065,"t":{"121":{"position":[[1623,10],[2112,11]]}}}],["explore",{"_index":37,"t":{"5":{"position":[[0,7]]},"121":{"position":[[1381,7]]}}}],["exploring",{"_index":148,"t":{"15":{"position":[[1052,9]]}}}],["exponential",{"_index":571,"t":{"55":{"position":[[53,11]]}}}],["export",{"_index":351,"t":{"29":{"position":[[286,6]]},"95":{"position":[[260,6]]}}}],["extra",{"_index":1271,"t":{"165":{"position":[[292,5]]}}}],["extremely",{"_index":1346,"t":{"212":{"position":[[11,9]]}}}],["f\"hourly",{"_index":1141,"t":{"127":{"position":[[2420,8]]}}}],["f\"{msg}\\n",{"_index":1147,"t":{"127":{"position":[[2708,10]]}}}],["factory",{"_index":1209,"t":{"143":{"position":[[151,7]]}}}],["falling",{"_index":587,"t":{"57":{"position":[[184,7]]}}}],["fast",{"_index":732,"t":{"73":{"position":[[1732,4]]}}}],["faster",{"_index":332,"t":{"27":{"position":[[557,6]]},"73":{"position":[[544,7]]},"91":{"position":[[622,6]]}}}],["features",{"_index":462,"t":{"41":{"position":[[159,8]]},"208":{"position":[[395,9]]}}}],["fedora",{"_index":1255,"t":{"163":{"position":[[194,6]]}}}],["few",{"_index":781,"t":{"86":{"position":[[105,3]]},"89":{"position":[[49,3]]},"130":{"position":[[551,3]]},"250":{"position":[[154,3]]}}}],["field",{"_index":203,"t":{"19":{"position":[[488,5]]}}}],["file",{"_index":804,"t":{"89":{"position":[[258,4]]},"95":{"position":[[533,4]]},"114":{"position":[[107,4]]},"191":{"position":[[86,4]]}}}],["files",{"_index":465,"t":{"41":{"position":[[339,5],[351,5]]}}}],["find",{"_index":751,"t":{"76":{"position":[[81,4]]},"102":{"position":[[39,4]]},"145":{"position":[[73,4]]},"248":{"position":[[99,4]]}}}],["finished",{"_index":737,"t":{"73":{"position":[[1846,8]]}}}],["firmware",{"_index":1387,"t":{"254":{"position":[[108,8]]}}}],["first",{"_index":780,"t":{"86":{"position":[[76,5]]},"91":{"position":[[16,5],[421,5],[458,5]]},"118":{"position":[[0,6]]},"127":{"position":[[0,6]]},"135":{"position":[[307,5]]}}}],["floats",{"_index":397,"t":{"37":{"position":[[194,8]]}}}],["floor",{"_index":1210,"t":{"143":{"position":[[159,7]]}}}],["follow",{"_index":533,"t":{"47":{"position":[[39,6]]},"89":{"position":[[493,6]]},"147":{"position":[[45,6]]}}}],["followed",{"_index":861,"t":{"98":{"position":[[273,8]]}}}],["following",{"_index":103,"t":{"15":{"position":[[101,9]]},"59":{"position":[[183,9]]},"108":{"position":[[82,9]]},"151":{"position":[[25,9]]},"153":{"position":[[90,9]]},"155":{"position":[[50,9]]},"157":{"position":[[89,9]]},"159":{"position":[[74,9]]},"171":{"position":[[25,9]]},"173":{"position":[[90,9]]},"175":{"position":[[50,9]]},"177":{"position":[[89,9]]},"179":{"position":[[74,9]]},"191":{"position":[[153,9],[591,9],[826,9]]},"195":{"position":[[25,9]]},"197":{"position":[[97,9]]},"199":{"position":[[50,9]]},"218":{"position":[[25,9]]},"220":{"position":[[96,9]]},"222":{"position":[[50,9]]},"232":{"position":[[25,9]]},"234":{"position":[[90,9]]},"236":{"position":[[50,9]]},"238":{"position":[[89,9]]},"240":{"position":[[74,9]]},"252":{"position":[[22,9]]},"254":{"position":[[16,9]]}}}],["follows",{"_index":385,"t":{"35":{"position":[[306,8]]},"165":{"position":[[265,7]]}}}],["forbidden",{"_index":515,"t":{"45":{"position":[[774,10]]}}}],["force",{"_index":759,"t":{"76":{"position":[[213,5]]},"212":{"position":[[488,5]]}}}],["format",{"_index":388,"t":{"37":{"position":[[90,6]]},"39":{"position":[[222,6]]},"212":{"position":[[220,6],[369,7]]}}}],["formats",{"_index":357,"t":{"31":{"position":[[49,8]]}}}],["formatted_time",{"_index":1138,"t":{"127":{"position":[[2356,14],[2441,17]]}}}],["forward",{"_index":166,"t":{"17":{"position":[[280,7]]}}}],["found",{"_index":521,"t":{"45":{"position":[[854,6],[892,5]]}}}],["frame",{"_index":239,"t":{"19":{"position":[[1181,5],[1275,5]]},"35":{"position":[[400,5],[433,5],[471,6],[489,5]]},"118":{"position":[[383,5]]},"127":{"position":[[496,5]]}}}],["framegrab",{"_index":459,"t":{"41":{"position":[[74,9],[93,9],[218,9]]}}}],["frontend",{"_index":1302,"t":{"191":{"position":[[182,9]]}}}],["frontend:latest",{"_index":1304,"t":{"191":{"position":[[252,15]]}}}],["full",{"_index":183,"t":{"19":{"position":[[169,4]]},"73":{"position":[[1224,7]]},"100":{"position":[[214,4]]},"135":{"position":[[121,6]]}}}],["function",{"_index":257,"t":{"21":{"position":[[471,8]]},"118":{"position":[[272,8],[537,8],[1500,9],[1653,9]]},"127":{"position":[[385,8],[650,8],[2971,9],[3234,9]]}}}],["functional",{"_index":583,"t":{"57":{"position":[[98,10]]}}}],["functionality",{"_index":1350,"t":{"212":{"position":[[144,14]]}}}],["further",{"_index":740,"t":{"73":{"position":[[1953,7]]}}}],["future",{"_index":787,"t":{"86":{"position":[[309,7]]},"89":{"position":[[468,6]]}}}],["gather",{"_index":826,"t":{"91":{"position":[[427,6]]}}}],["generally",{"_index":724,"t":{"73":{"position":[[1576,9]]},"165":{"position":[[72,9]]}}}],["generated",{"_index":745,"t":{"73":{"position":[[2191,9]]},"106":{"position":[[220,9]]}}}],["generative",{"_index":833,"t":{"93":{"position":[[58,10]]}}}],["get_image",{"_index":489,"t":{"45":{"position":[[341,12]]}}}],["get_image_query",{"_index":251,"t":{"21":{"position":[[169,16]]},"86":{"position":[[375,17]]}}}],["get_off_couch.mp3",{"_index":952,"t":{"114":{"position":[[119,18]]}}}],["get_or_create_detector(name",{"_index":748,"t":{"76":{"position":[[25,28]]}}}],["get_token_from_secure_location",{"_index":897,"t":{"102":{"position":[[718,32]]}}}],["gets",{"_index":869,"t":{"100":{"position":[[176,4]]}}}],["github",{"_index":38,"t":{"5":{"position":[[14,6]]},"203":{"position":[[75,6]]},"226":{"position":[[73,6]]},"256":{"position":[[97,6],[272,6]]}}}],["give",{"_index":906,"t":{"106":{"position":[[113,4]]}}}],["gives",{"_index":679,"t":{"73":{"position":[[12,5]]}}}],["gl",{"_index":345,"t":{"29":{"position":[[169,2]]},"33":{"position":[[151,2]]},"45":{"position":[[204,2]]},"73":{"position":[[969,2]]},"76":{"position":[[346,2]]},"78":{"position":[[36,2]]},"80":{"position":[[36,2]]},"82":{"position":[[245,2]]},"84":{"position":[[36,2]]},"86":{"position":[[651,2]]},"89":{"position":[[106,2]]},"95":{"position":[[381,2]]},"102":{"position":[[485,2],[751,2]]},"118":{"position":[[974,2]]},"127":{"position":[[1392,2]]}}}],["gl.add_label(image_query",{"_index":799,"t":{"86":{"position":[[951,25]]}}}],["gl.ask_async(detector=detector",{"_index":241,"t":{"19":{"position":[[1217,31]]},"23":{"position":[[670,31]]}}}],["gl.create_detector(name=\"your_detector_name",{"_index":761,"t":{"76":{"position":[[376,45]]}}}],["gl.get_detector(\"dog",{"_index":989,"t":{"118":{"position":[[1004,20]]}}}],["gl.get_detector(id=\"your_detector_id",{"_index":762,"t":{"78":{"position":[[66,38]]}}}],["gl.get_image_query(id=\"iq_your_image_query_id",{"_index":774,"t":{"82":{"position":[[278,47]]}}}],["gl.get_image_query(id=image_query.id",{"_index":291,"t":{"23":{"position":[[850,37]]}}}],["gl.get_image_query(id=image_query_id",{"_index":262,"t":{"21":{"position":[[743,37]]}}}],["gl.get_or_create_detector",{"_index":482,"t":{"45":{"position":[[232,26]]},"127":{"position":[[1422,26]]},"130":{"position":[[213,26]]}}}],["gl.get_or_create_detector(name=\"doorway",{"_index":794,"t":{"86":{"position":[[674,41]]},"89":{"position":[[131,41]]},"95":{"position":[[406,41]]}}}],["gl.get_or_create_detector(name=\"path",{"_index":367,"t":{"33":{"position":[[176,36]]}}}],["gl.get_or_create_detector(name=\"trash",{"_index":712,"t":{"73":{"position":[[1160,39]]}}}],["gl.get_or_create_detector(name=\"your_detector_name",{"_index":226,"t":{"19":{"position":[[989,52]]},"21":{"position":[[576,52]]},"23":{"position":[[537,52]]}}}],["gl.list_detectors",{"_index":765,"t":{"80":{"position":[[101,19]]}}}],["gl.list_detectors(page=1",{"_index":769,"t":{"80":{"position":[[178,25]]}}}],["gl.list_image_queries",{"_index":776,"t":{"84":{"position":[[105,23]]}}}],["gl.list_image_queries(page=1",{"_index":777,"t":{"84":{"position":[[190,29]]}}}],["gl.submit_image_query(d",{"_index":488,"t":{"45":{"position":[[316,24]]}}}],["gl.submit_image_query(det",{"_index":373,"t":{"33":{"position":[[303,26]]}}}],["gl.submit_image_query(detector",{"_index":386,"t":{"35":{"position":[[439,31]]},"37":{"position":[[475,31]]}}}],["gl.submit_image_query(detector=d",{"_index":718,"t":{"73":{"position":[[1357,33],[2109,33]]},"86":{"position":[[904,33]]}}}],["gl.submit_image_query(detector=det",{"_index":805,"t":{"89":{"position":[[296,35]]},"95":{"position":[[571,35]]}}}],["gl.submit_image_query(detector=detector",{"_index":1171,"t":{"130":{"position":[[344,40]]}}}],["gl.submit_image_query(image=image",{"_index":990,"t":{"118":{"position":[[1101,34]]},"127":{"position":[[1940,34]]}}}],["gl.wait_for_confident_result(id=image_query.id",{"_index":292,"t":{"23":{"position":[[1064,47]]}}}],["go",{"_index":1246,"t":{"161":{"position":[[183,3]]},"165":{"position":[[153,2]]},"181":{"position":[[183,3]]},"242":{"position":[[189,3]]},"250":{"position":[[166,2]]}}}],["good",{"_index":1174,"t":{"130":{"position":[[520,4],[555,4]]},"161":{"position":[[175,4]]},"181":{"position":[[175,4]]},"242":{"position":[[181,4]]}}}],["grabbing",{"_index":105,"t":{"15":{"position":[[118,8]]}}}],["gracefully",{"_index":471,"t":{"43":{"position":[[177,10]]},"57":{"position":[[47,10]]},"59":{"position":[[154,10]]},"208":{"position":[[325,10]]}}}],["groundlight",{"_index":0,"t":{"3":{"position":[[0,11],[155,12],[358,11]]},"5":{"position":[[53,11]]},"7":{"position":[[54,11]]},"13":{"position":[[0,11]]},"15":{"position":[[74,12],[216,12],[311,11],[597,12],[632,11],[771,11],[819,11]]},"17":{"position":[[0,11],[343,12]]},"19":{"position":[[56,11],[395,12],[913,11],[932,11],[1284,11]]},"21":{"position":[[55,11],[534,11],[553,11],[813,11]]},"23":{"position":[[215,11],[473,11],[492,11],[739,11],[932,11],[1007,11],[1147,11]]},"27":{"position":[[272,11],[346,11],[490,11]]},"29":{"position":[[17,11],[103,11],[138,11],[157,11]]},"33":{"position":[[4,11],[98,11],[117,11],[156,13]]},"35":{"position":[[194,11],[498,11]]},"37":{"position":[[4,11]]},"39":{"position":[[0,11],[505,12],[559,11],[705,12]]},"43":{"position":[[36,11]]},"45":{"position":[[159,11],[192,11],[209,13]]},"47":{"position":[[22,11]]},"51":{"position":[[149,11]]},"59":{"position":[[330,11]]},"61":{"position":[[168,11]]},"73":{"position":[[0,11],[900,11],[919,11],[974,13]]},"76":{"position":[[315,11],[334,11],[351,13]]},"78":{"position":[[5,11],[24,11],[41,13]]},"80":{"position":[[5,11],[24,11],[41,13]]},"82":{"position":[[214,11],[233,11],[250,13]]},"84":{"position":[[5,11],[24,11],[41,13]]},"86":{"position":[[0,11],[582,11],[601,11],[656,13]]},"89":{"position":[[75,11],[94,11],[111,13]]},"95":{"position":[[12,11],[100,11],[129,11],[350,11],[369,11],[386,13]]},"98":{"position":[[11,11],[117,11]]},"100":{"position":[[237,11]]},"102":{"position":[[386,11],[405,11],[490,13],[584,11],[679,11],[698,11]]},"104":{"position":[[40,11]]},"106":{"position":[[15,11],[297,11]]},"110":{"position":[[254,11]]},"112":{"position":[[49,11]]},"114":{"position":[[0,11]]},"116":{"position":[[69,11],[117,11]]},"118":{"position":[[21,11],[183,11],[202,11],[979,13],[1533,11]]},"121":{"position":[[45,11],[1897,11]]},"123":{"position":[[0,11]]},"125":{"position":[[69,11],[144,11]]},"127":{"position":[[21,11],[198,11],[217,11],[1397,13],[3004,11]]},"135":{"position":[[137,12]]},"145":{"position":[[15,11],[137,11]]},"147":{"position":[[331,11]]},"149":{"position":[[37,11],[67,11]]},"153":{"position":[[132,11]]},"155":{"position":[[15,11],[98,11],[204,11],[220,11]]},"157":{"position":[[16,11],[135,12]]},"159":{"position":[[27,11],[119,11],[180,11],[269,11]]},"165":{"position":[[827,12],[853,11]]},"167":{"position":[[36,11]]},"169":{"position":[[37,11],[67,11]]},"173":{"position":[[132,11]]},"175":{"position":[[15,11],[98,11],[204,11],[220,11]]},"177":{"position":[[16,11],[135,12]]},"179":{"position":[[27,11],[119,11],[180,11],[269,11]]},"185":{"position":[[36,11]]},"187":{"position":[[39,11]]},"189":{"position":[[75,11]]},"193":{"position":[[37,11],[83,11]]},"197":{"position":[[139,11]]},"199":{"position":[[15,11],[99,11],[175,11]]},"205":{"position":[[36,11]]},"208":{"position":[[4,11],[88,11]]},"210":{"position":[[92,11],[236,11],[278,11]]},"212":{"position":[[60,11]]},"216":{"position":[[37,11],[74,11]]},"220":{"position":[[138,11]]},"222":{"position":[[15,11],[99,11],[175,11]]},"228":{"position":[[36,11]]},"230":{"position":[[37,11],[69,11]]},"234":{"position":[[132,11]]},"236":{"position":[[15,11],[104,11],[210,11],[226,11]]},"238":{"position":[[16,11],[135,12]]},"240":{"position":[[27,11],[119,11],[180,11],[269,11]]},"246":{"position":[[36,11]]},"248":{"position":[[0,11]]},"250":{"position":[[68,11]]},"256":{"position":[[206,11]]}}}],["groundlight's",{"_index":153,"t":{"15":{"position":[[1177,13]]},"31":{"position":[[0,13]]},"63":{"position":[[0,13]]},"65":{"position":[[12,13]]},"67":{"position":[[0,13]]},"69":{"position":[[0,13]]},"71":{"position":[[24,13]]},"93":{"position":[[0,13]]},"130":{"position":[[5,13]]}}}],["groundlight(api_token=token",{"_index":898,"t":{"102":{"position":[[756,28]]}}}],["groundlight(endpoint=\"http://localhost:6717",{"_index":346,"t":{"29":{"position":[[174,45]]}}}],["groundlight.ai",{"_index":1296,"t":{"189":{"position":[[111,15]]}}}],["groundlight/stream",{"_index":1327,"t":{"201":{"position":[[85,18]]},"224":{"position":[[84,18]]}}}],["groundlight_api_token",{"_index":512,"t":{"45":{"position":[[724,21]]},"95":{"position":[[198,21]]},"102":{"position":[[176,22],[463,21]]}}}],["groundlight_api_token=api_2gdxmflhji6l_example",{"_index":847,"t":{"95":{"position":[[267,46]]}}}],["groundlight_endpoint",{"_index":348,"t":{"29":{"position":[[238,20]]}}}],["groundlight_endpoint=http://localhost:6717",{"_index":352,"t":{"29":{"position":[[293,42]]}}}],["guide",{"_index":936,"t":{"112":{"position":[[125,5]]},"145":{"position":[[44,6],[59,6]]},"147":{"position":[[90,6]]},"149":{"position":[[5,5]]},"169":{"position":[[5,5]]},"193":{"position":[[5,5]]},"216":{"position":[[5,5]]},"230":{"position":[[5,5]]}}}],["guides",{"_index":35,"t":{"3":{"position":[[405,6]]},"15":{"position":[[18,6]]}}}],["hand",{"_index":636,"t":{"65":{"position":[[186,4],[194,4]]}}}],["handle",{"_index":129,"t":{"15":{"position":[[534,6]]},"43":{"position":[[127,6],[188,6]]},"47":{"position":[[70,6]]},"57":{"position":[[35,6]]},"59":{"position":[[140,6],[273,6]]},"86":{"position":[[186,6]]}}}],["handling",{"_index":126,"t":{"15":{"position":[[492,8]]},"55":{"position":[[5,8]]},"59":{"position":[[38,8]]},"100":{"position":[[291,8]]}}}],["happen",{"_index":743,"t":{"73":{"position":[[2087,7]]}}}],["hardcoding",{"_index":877,"t":{"100":{"position":[[438,10]]}}}],["hardware",{"_index":423,"t":{"39":{"position":[[271,8]]},"212":{"position":[[454,9]]}}}],["hasn't",{"_index":736,"t":{"73":{"position":[[1839,6]]}}}],["head",{"_index":843,"t":{"95":{"position":[[112,4]]}}}],["health",{"_index":568,"t":{"53":{"position":[[179,6]]}}}],["help",{"_index":61,"t":{"7":{"position":[[254,4]]},"51":{"position":[[90,4]]},"53":{"position":[[124,4]]},"55":{"position":[[145,4]]},"59":{"position":[[75,4]]},"65":{"position":[[83,4]]},"67":{"position":[[223,4]]},"121":{"position":[[820,4]]},"149":{"position":[[16,4]]},"169":{"position":[[16,4]]},"193":{"position":[[16,4]]},"216":{"position":[[16,4]]},"230":{"position":[[16,4]]}}}],["helps",{"_index":888,"t":{"102":{"position":[[204,5]]}}}],["here",{"_index":185,"t":{"19":{"position":[[188,6]]},"23":{"position":[[462,5]]},"100":{"position":[[258,4]]},"112":{"position":[[0,4]]},"254":{"position":[[209,5],[260,5],[286,5],[328,5]]}}}],["here's",{"_index":365,"t":{"33":{"position":[[74,6]]},"37":{"position":[[259,6]]},"39":{"position":[[956,6]]}}}],["high",{"_index":817,"t":{"91":{"position":[[130,4],[485,4]]}}}],["high=255",{"_index":409,"t":{"37":{"position":[[375,9]]}}}],["higher",{"_index":723,"t":{"73":{"position":[[1523,6],[1550,6],[1594,6],[1610,6]]},"91":{"position":[[634,6]]},"95":{"position":[[60,7]]},"114":{"position":[[35,6]]},"116":{"position":[[30,6]]},"121":{"position":[[929,6]]},"123":{"position":[[35,6]]},"125":{"position":[[30,6]]},"149":{"position":[[106,7]]},"151":{"position":[[75,6]]},"153":{"position":[[32,6]]},"161":{"position":[[133,6]]},"169":{"position":[[106,7]]},"171":{"position":[[75,6]]},"173":{"position":[[32,6]]},"181":{"position":[[133,6]]},"193":{"position":[[122,7]]},"195":{"position":[[82,6]]},"197":{"position":[[32,6]]},"216":{"position":[[113,7]]},"218":{"position":[[81,6]]},"220":{"position":[[32,6]]},"230":{"position":[[108,7]]},"232":{"position":[[75,6]]},"234":{"position":[[32,6]]},"242":{"position":[[139,6]]}}}],["highest",{"_index":649,"t":{"67":{"position":[[79,7]]}}}],["home",{"_index":931,"t":{"112":{"position":[[69,4]]}}}],["homebrew",{"_index":1289,"t":{"183":{"position":[[89,8]]}}}],["hour",{"_index":1017,"t":{"121":{"position":[[319,5]]},"127":{"position":[[3101,5]]}}}],["hourly",{"_index":1072,"t":{"121":{"position":[[1957,6]]}}}],["hours",{"_index":92,"t":{"11":{"position":[[281,6]]},"121":{"position":[[735,5]]},"127":{"position":[[1157,5]]}}}],["http",{"_index":131,"t":{"15":{"position":[[558,4]]},"45":{"position":[[15,4],[559,4],[624,4]]}}}],["http://localhost:3000",{"_index":1319,"t":{"191":{"position":[[681,21]]}}}],["https://app.groundlight.ai/reef/my",{"_index":901,"t":{"104":{"position":[[63,34]]}}}],["https://bootstrap.pypa.io/get",{"_index":1283,"t":{"165":{"position":[[614,29]]}}}],["https://github.com/groundlight/esp32cam",{"_index":62,"t":{"9":{"position":[[12,39]]},"256":{"position":[[107,39]]}}}],["https://github.com/groundlight/raspberry",{"_index":75,"t":{"11":{"position":[[12,40]]}}}],["https://github.com/groundlight/stream",{"_index":43,"t":{"7":{"position":[[12,37]]}}}],["https://images.selfstorage.com/large",{"_index":797,"t":{"86":{"position":[[757,37]]}}}],["https://iot.groundlight.ai/espcam",{"_index":1369,"t":{"248":{"position":[[110,34]]},"250":{"position":[[172,33]]}}}],["https://www.photos",{"_index":706,"t":{"73":{"position":[[1000,19]]}}}],["hub",{"_index":1330,"t":{"201":{"position":[[172,4]]},"224":{"position":[[171,4]]}}}],["human",{"_index":688,"t":{"73":{"position":[[347,5]]},"91":{"position":[[308,5]]},"93":{"position":[[167,5]]},"135":{"position":[[212,5]]}}}],["humans",{"_index":667,"t":{"69":{"position":[[189,6]]}}}],["hwn",{"_index":387,"t":{"37":{"position":[[86,3]]}}}],["i.e",{"_index":1161,"t":{"130":{"position":[[74,5]]}}}],["identifier",{"_index":918,"t":{"108":{"position":[[209,10]]}}}],["identify",{"_index":631,"t":{"65":{"position":[[88,8]]},"106":{"position":[[170,8]]},"121":{"position":[[206,8],[825,8]]}}}],["identifying",{"_index":650,"t":{"67":{"position":[[141,11]]},"121":{"position":[[780,11]]}}}],["image",{"_index":162,"t":{"17":{"position":[[155,5],[326,5]]},"19":{"position":[[100,5],[1148,5]]},"21":{"position":[[120,5],[385,5],[796,5],[894,5]]},"23":{"position":[[19,5],[520,5],[610,5],[915,5]]},"27":{"position":[[609,5],[698,5],[751,6],[787,5]]},"33":{"position":[[145,5]]},"35":{"position":[[20,5]]},"37":{"position":[[306,5]]},"39":{"position":[[105,5],[254,5],[321,5],[740,5],[993,5]]},"41":{"position":[[51,5],[203,5],[284,5],[345,5]]},"73":{"position":[[135,5],[269,5],[719,5],[947,5],[1095,5],[1866,5],[2269,5]]},"86":{"position":[[82,6],[629,5],[829,5]]},"89":{"position":[[243,5]]},"91":{"position":[[533,5]]},"95":{"position":[[518,5]]},"118":{"position":[[230,5],[295,5],[441,5],[1057,5],[1084,6],[1325,5],[1375,7],[1470,5]]},"127":{"position":[[245,5],[408,5],[554,5],[1832,5],[1863,6],[1895,7],[2051,5],[2941,5]]},"133":{"position":[[99,5]]},"191":{"position":[[192,6],[320,6]]}}}],["image.fromarray(cv2.cvtcolor(frame",{"_index":969,"t":{"118":{"position":[[454,35]]},"127":{"position":[[567,35]]}}}],["image.open(\"./docs/static/img/doorway.jpg",{"_index":372,"t":{"33":{"position":[[259,43]]}}}],["image.open(\"/path/to/your/image.jpg",{"_index":288,"t":{"23":{"position":[[618,37]]}}}],["image.open(requests.get(image_url",{"_index":710,"t":{"73":{"position":[[1103,34]]},"86":{"position":[[837,34]]}}}],["image=image",{"_index":242,"t":{"19":{"position":[[1249,12]]},"23":{"position":[[702,12]]},"73":{"position":[[1391,12],[2143,12]]},"86":{"position":[[938,12]]}}}],["image=img",{"_index":806,"t":{"89":{"position":[[332,10]]},"95":{"position":[[607,10]]}}}],["image=some_image",{"_index":1172,"t":{"130":{"position":[[385,17]]}}}],["image_queries",{"_index":775,"t":{"84":{"position":[[89,13],[174,13]]}}}],["image_query",{"_index":240,"t":{"19":{"position":[[1203,11]]},"21":{"position":[[729,11]]},"23":{"position":[[656,11],[836,11],[1050,11]]},"73":{"position":[[1343,11],[2095,11]]},"82":{"position":[[264,11]]},"86":{"position":[[327,11],[890,11]]},"89":{"position":[[282,11]]},"95":{"position":[[557,11]]},"130":{"position":[[330,11]]}}}],["image_query.id",{"_index":243,"t":{"19":{"position":[[1331,14]]},"82":{"position":[[151,14]]}}}],["image_query.result",{"_index":263,"t":{"21":{"position":[[834,18]]},"23":{"position":[[760,18],[953,18],[1168,18]]},"73":{"position":[[1435,22]]},"89":{"position":[[365,22]]},"95":{"position":[[640,22]]}}}],["image_query.result.confidence",{"_index":746,"t":{"73":{"position":[[2308,33]]}}}],["image_query.result.label",{"_index":1173,"t":{"130":{"position":[[474,28]]}}}],["image_query_id",{"_index":261,"t":{"21":{"position":[[649,14],[701,14],[1156,14],[1202,14]]}}}],["image_url",{"_index":705,"t":{"73":{"position":[[988,9]]},"86":{"position":[[746,10]]}}}],["imagequery",{"_index":201,"t":{"19":{"position":[[425,10]]}}}],["imagequery.id",{"_index":220,"t":{"19":{"position":[[859,13]]}}}],["imagequery.ids",{"_index":211,"t":{"19":{"position":[[667,14]]}}}],["imagequery.result",{"_index":252,"t":{"21":{"position":[[226,17]]}}}],["imagequerys",{"_index":259,"t":{"21":{"position":[[502,11]]}}}],["images",{"_index":106,"t":{"15":{"position":[[127,7],[179,6]]},"31":{"position":[[26,6]]},"33":{"position":[[35,6]]},"35":{"position":[[83,7],[98,6],[253,6]]},"37":{"position":[[31,6]]},"39":{"position":[[20,6],[372,6],[495,6],[889,6]]},"91":{"position":[[5,6],[213,6]]},"130":{"position":[[65,6]]},"210":{"position":[[70,6]]},"212":{"position":[[203,6],[348,6]]}}}],["img",{"_index":802,"t":{"89":{"position":[[203,3]]},"95":{"position":[[478,3]]}}}],["immediately",{"_index":278,"t":{"23":{"position":[[128,11],[890,11]]},"110":{"position":[[170,11]]}}}],["implement",{"_index":569,"t":{"55":{"position":[[26,9]]},"121":{"position":[[1684,9]]}}}],["import",{"_index":222,"t":{"19":{"position":[[925,6],[944,6],[965,6]]},"21":{"position":[[546,6]]},"23":{"position":[[485,6],[513,6]]},"29":{"position":[[150,6]]},"33":{"position":[[110,6],[138,6]]},"35":{"position":[[315,6]]},"37":{"position":[[322,6]]},"45":{"position":[[137,6],[171,6]]},"73":{"position":[[912,6],[940,6],[953,6]]},"76":{"position":[[327,6]]},"78":{"position":[[17,6]]},"80":{"position":[[17,6]]},"82":{"position":[[226,6]]},"84":{"position":[[17,6]]},"86":{"position":[[594,6],[622,6],[635,6]]},"89":{"position":[[87,6]]},"95":{"position":[[362,6]]},"102":{"position":[[398,6],[691,6]]},"118":{"position":[[124,6],[155,6],[167,6],[195,6],[223,6],[236,6],[251,6]]},"127":{"position":[[124,6],[155,6],[167,6],[178,6],[210,6],[238,6],[265,6],[318,6],[360,6]]},"157":{"position":[[127,7]]},"177":{"position":[[127,7]]},"238":{"position":[[127,7]]}}}],["impossible",{"_index":452,"t":{"39":{"position":[[1105,10]]}}}],["improve",{"_index":665,"t":{"69":{"position":[[159,7]]},"73":{"position":[[2024,7]]},"91":{"position":[[593,7]]},"121":{"position":[[1560,7],[2074,7]]},"135":{"position":[[239,7]]}}}],["improved",{"_index":145,"t":{"15":{"position":[[866,8]]},"143":{"position":[[76,8]]}}}],["improving",{"_index":1044,"t":{"121":{"position":[[1068,9]]}}}],["include",{"_index":561,"t":{"53":{"position":[[76,7]]},"57":{"position":[[136,7]]},"86":{"position":[[260,7]]}}}],["including",{"_index":358,"t":{"31":{"position":[[58,9]]},"41":{"position":[[299,10]]}}}],["incorporated",{"_index":741,"t":{"73":{"position":[[1991,12]]}}}],["increase",{"_index":1041,"t":{"121":{"position":[[1028,8]]}}}],["increased",{"_index":1067,"t":{"121":{"position":[[1646,9]]}}}],["increases",{"_index":728,"t":{"73":{"position":[[1661,9]]}}}],["increasing",{"_index":657,"t":{"67":{"position":[[306,10]]}}}],["index",{"_index":233,"t":{"19":{"position":[[1126,6]]},"35":{"position":[[390,6]]}}}],["industrial",{"_index":96,"t":{"13":{"position":[[82,10]]},"15":{"position":[[908,10],[1006,10]]},"39":{"position":[[1055,10]]},"61":{"position":[[62,10],[274,10]]},"71":{"position":[[105,10]]}}}],["inexpensive",{"_index":68,"t":{"9":{"position":[[134,11]]}}}],["info@groundlight.ai",{"_index":678,"t":{"71":{"position":[[171,20]]}}}],["information",{"_index":564,"t":{"53":{"position":[[101,12]]},"108":{"position":[[92,12]]},"121":{"position":[[950,11],[1249,11]]},"167":{"position":[[79,11]]},"185":{"position":[[79,11]]},"205":{"position":[[79,11]]},"228":{"position":[[79,11]]},"246":{"position":[[79,11]]}}}],["informed",{"_index":1075,"t":{"121":{"position":[[2052,8]]}}}],["initialize",{"_index":230,"t":{"19":{"position":[[1090,10]]},"35":{"position":[[354,10]]}}}],["injection",{"_index":620,"t":{"63":{"position":[[166,9]]}}}],["input",{"_index":110,"t":{"15":{"position":[[199,5]]}}}],["insights",{"_index":1047,"t":{"121":{"position":[[1171,8]]}}}],["inspections",{"_index":656,"t":{"67":{"position":[[290,11]]}}}],["install",{"_index":178,"t":{"19":{"position":[[44,7]]},"21":{"position":[[43,7]]},"25":{"position":[[64,7]]},"95":{"position":[[0,7],[92,7]]},"116":{"position":[[57,7],[109,7]]},"121":{"position":[[1748,7]]},"125":{"position":[[57,7],[136,7]]},"145":{"position":[[114,7]]},"149":{"position":[[25,7]]},"153":{"position":[[109,7]]},"155":{"position":[[3,7],[90,7],[196,7]]},"159":{"position":[[101,7],[162,7]]},"163":{"position":[[43,7],[139,7],[225,7]]},"165":{"position":[[130,7],[332,7],[369,7],[401,7],[524,7],[594,7],[760,7],[819,7],[845,7]]},"169":{"position":[[25,7]]},"173":{"position":[[109,7]]},"175":{"position":[[3,7],[90,7],[196,7]]},"179":{"position":[[101,7],[162,7]]},"183":{"position":[[101,7],[122,7]]},"191":{"position":[[0,7]]},"193":{"position":[[25,7]]},"197":{"position":[[116,7]]},"199":{"position":[[3,7],[91,7]]},"210":{"position":[[185,7],[270,7]]},"212":{"position":[[48,7],[501,7]]},"214":{"position":[[196,7]]},"216":{"position":[[25,7]]},"220":{"position":[[115,7]]},"222":{"position":[[3,7],[91,7]]},"230":{"position":[[25,7]]},"234":{"position":[[109,7]]},"236":{"position":[[3,7],[96,7],[202,7]]},"240":{"position":[[101,7],[162,7]]}}}],["installation",{"_index":1212,"t":{"145":{"position":[[31,12]]},"147":{"position":[[227,12]]},"191":{"position":[[46,12]]},"214":{"position":[[100,12]]}}}],["installed",{"_index":956,"t":{"116":{"position":[[37,10]]},"125":{"position":[[37,10]]},"151":{"position":[[35,9]]},"153":{"position":[[39,9]]},"155":{"position":[[243,9]]},"157":{"position":[[35,9]]},"159":{"position":[[343,10]]},"161":{"position":[[14,9]]},"165":{"position":[[252,9]]},"171":{"position":[[35,9]]},"173":{"position":[[39,9]]},"175":{"position":[[243,9]]},"177":{"position":[[35,9]]},"179":{"position":[[343,10]]},"181":{"position":[[14,9]]},"191":{"position":[[657,9],[723,9]]},"195":{"position":[[35,9]]},"197":{"position":[[39,9]]},"199":{"position":[[160,10],[198,9]]},"201":{"position":[[19,9]]},"208":{"position":[[255,9]]},"210":{"position":[[350,10]]},"214":{"position":[[38,9]]},"218":{"position":[[35,9]]},"220":{"position":[[39,9]]},"222":{"position":[[160,10],[198,9]]},"224":{"position":[[19,9]]},"232":{"position":[[35,9]]},"234":{"position":[[39,9]]},"236":{"position":[[249,9]]},"238":{"position":[[35,9]]},"240":{"position":[[343,10]]},"242":{"position":[[14,9]]}}}],["installer",{"_index":1226,"t":{"151":{"position":[[102,10]]},"171":{"position":[[102,10]]},"183":{"position":[[27,9]]},"195":{"position":[[109,10]]},"218":{"position":[[108,10]]},"232":{"position":[[102,10]]},"244":{"position":[[27,9]]}}}],["installing",{"_index":1334,"t":{"208":{"position":[[112,10],[183,10]]}}}],["instant",{"_index":276,"t":{"23":{"position":[[82,8]]}}}],["instead",{"_index":208,"t":{"19":{"position":[[605,8]]},"23":{"position":[[259,8]]},"27":{"position":[[393,7],[679,7]]},"139":{"position":[[107,8]]},"155":{"position":[[182,8]]},"175":{"position":[[182,8]]},"236":{"position":[[188,8]]}}}],["instructing",{"_index":945,"t":{"112":{"position":[[290,11]]}}}],["instructions",{"_index":1214,"t":{"145":{"position":[[91,12]]},"147":{"position":[[56,12]]},"191":{"position":[[59,13]]}}}],["insufficient",{"_index":518,"t":{"45":{"position":[[819,12]]}}}],["integrated",{"_index":604,"t":{"61":{"position":[[250,10]]},"69":{"position":[[55,10],[244,10]]}}}],["integrating",{"_index":630,"t":{"65":{"position":[[0,11]]},"256":{"position":[[194,11]]}}}],["intensive",{"_index":686,"t":{"73":{"position":[[289,9]]},"91":{"position":[[265,9]]}}}],["interacting",{"_index":199,"t":{"19":{"position":[[378,11]]}}}],["interaction",{"_index":598,"t":{"61":{"position":[[131,11]]}}}],["interested",{"_index":207,"t":{"19":{"position":[[579,10]]}}}],["interface",{"_index":155,"t":{"17":{"position":[[30,9]]},"19":{"position":[[149,9]]},"41":{"position":[[14,9],[246,9]]},"69":{"position":[[316,10]]},"187":{"position":[[127,10]]}}}],["interfaces",{"_index":286,"t":{"23":{"position":[[420,10]]},"89":{"position":[[432,10]]}}}],["internal",{"_index":530,"t":{"45":{"position":[[974,8]]}}}],["internet",{"_index":1294,"t":{"189":{"position":[[0,8]]}}}],["interpreting",{"_index":641,"t":{"65":{"position":[[271,12]]}}}],["interpretted",{"_index":414,"t":{"37":{"position":[[447,12]]}}}],["intervention",{"_index":578,"t":{"55":{"position":[[212,13]]},"65":{"position":[[148,13]]}}}],["intricacies",{"_index":108,"t":{"15":{"position":[[150,11]]}}}],["introduce",{"_index":27,"t":{"3":{"position":[[304,9]]}}}],["intuitive",{"_index":597,"t":{"61":{"position":[[121,9]]}}}],["invalid",{"_index":508,"t":{"45":{"position":[[678,7],[760,7]]}}}],["invalidate",{"_index":926,"t":{"110":{"position":[[182,10]]}}}],["io",{"_index":1389,"t":{"254":{"position":[[146,2]]}}}],["ip",{"_index":463,"t":{"41":{"position":[[322,2]]},"191":{"position":[[780,2]]}}}],["iq",{"_index":487,"t":{"45":{"position":[[311,2]]},"118":{"position":[[1096,2]]},"127":{"position":[[1935,2]]}}}],["iq.result.label",{"_index":992,"t":{"118":{"position":[[1173,15]]},"127":{"position":[[2106,15]]}}}],["iq_",{"_index":339,"t":{"27":{"position":[[690,3]]}}}],["iqe_",{"_index":338,"t":{"27":{"position":[[674,4],[735,4]]}}}],["irregularities",{"_index":652,"t":{"67":{"position":[[164,14]]}}}],["is_within_business_hours",{"_index":1112,"t":{"127":{"position":[[1237,27],[1777,27]]}}}],["issue",{"_index":1403,"t":{"256":{"position":[[259,5]]}}}],["issues",{"_index":547,"t":{"49":{"position":[[198,7]]},"53":{"position":[[139,6]]},"55":{"position":[[111,6],[190,6]]},"59":{"position":[[90,6]]}}}],["it's",{"_index":1202,"t":{"141":{"position":[[87,4]]}}}],["iteration",{"_index":272,"t":{"21":{"position":[[1180,9]]}}}],["jetson",{"_index":311,"t":{"27":{"position":[[108,6]]},"147":{"position":[[137,6]]},"193":{"position":[[63,6]]},"195":{"position":[[60,7]]},"197":{"position":[[64,7]]},"201":{"position":[[44,7]]},"203":{"position":[[58,7]]}}}],["jpeg",{"_index":1352,"t":{"212":{"position":[[215,4],[274,4],[364,4]]}}}],["keep",{"_index":932,"t":{"112":{"position":[[77,4]]}}}],["key",{"_index":1295,"t":{"189":{"position":[[91,3]]}}}],["kind",{"_index":858,"t":{"98":{"position":[[250,4]]}}}],["kinds",{"_index":458,"t":{"41":{"position":[[42,5],[275,5]]}}}],["know",{"_index":1184,"t":{"135":{"position":[[327,4]]},"165":{"position":[[118,4]]}}}],["knowledge",{"_index":455,"t":{"39":{"position":[[1140,9]]}}}],["ksuid",{"_index":857,"t":{"98":{"position":[[241,5]]}}}],["label",{"_index":785,"t":{"86":{"position":[[272,5],[409,5]]},"91":{"position":[[438,5]]}}}],["labels",{"_index":727,"t":{"73":{"position":[[1647,7]]},"82":{"position":[[103,6]]},"86":{"position":[[549,6],[1009,6]]}}}],["labor",{"_index":729,"t":{"73":{"position":[[1671,5]]}}}],["lacks",{"_index":202,"t":{"19":{"position":[[461,5]]}}}],["language",{"_index":7,"t":{"3":{"position":[[68,9]]},"13":{"position":[[48,8]]},"15":{"position":[[967,8],[1219,8]]},"61":{"position":[[15,8]]},"63":{"position":[[257,9]]},"65":{"position":[[292,8]]},"71":{"position":[[46,8]]}}}],["large",{"_index":1335,"t":{"208":{"position":[[123,5]]},"210":{"position":[[154,6]]},"214":{"position":[[83,6]]}}}],["last",{"_index":920,"t":{"108":{"position":[[235,4],[278,4]]}}}],["latency",{"_index":120,"t":{"15":{"position":[[403,7],[899,8]]},"25":{"position":[[167,8]]},"73":{"position":[[63,7],[1514,8],[1601,8]]},"91":{"position":[[490,8]]}}}],["later",{"_index":139,"t":{"15":{"position":[[758,6]]},"106":{"position":[[182,6]]}}}],["latest",{"_index":1238,"t":{"159":{"position":[[50,6],[321,6]]},"163":{"position":[[55,6]]},"179":{"position":[[50,6],[321,6]]},"183":{"position":[[13,6]]},"240":{"position":[[50,6],[321,6]]},"244":{"position":[[13,6]]}}}],["layout",{"_index":1045,"t":{"121":{"position":[[1084,7],[1218,7],[1319,6]]}}}],["lead",{"_index":1066,"t":{"121":{"position":[[1638,4]]}}}],["learn",{"_index":113,"t":{"15":{"position":[[253,5],[690,5],[933,5]]},"71":{"position":[[3,5]]},"91":{"position":[[583,5]]}}}],["learning",{"_index":816,"t":{"91":{"position":[[42,8]]},"135":{"position":[[192,8]]}}}],["len(log",{"_index":1133,"t":{"127":{"position":[[2258,9]]}}}],["let's",{"_index":1175,"t":{"130":{"position":[[535,5]]}}}],["lets",{"_index":722,"t":{"73":{"position":[[1480,4]]},"86":{"position":[[12,4]]}}}],["level",{"_index":125,"t":{"15":{"position":[[466,5]]},"73":{"position":[[575,5],[802,5],[1919,5]]}}}],["levels",{"_index":116,"t":{"15":{"position":[[356,7]]},"53":{"position":[[36,6]]}}}],["libraries",{"_index":425,"t":{"39":{"position":[[327,9]]},"118":{"position":[[144,10]]},"125":{"position":[[121,10]]},"127":{"position":[[144,10]]},"208":{"position":[[129,9],[241,9]]},"214":{"position":[[20,9],[160,10]]}}}],["library",{"_index":374,"t":{"35":{"position":[[37,8]]},"41":{"position":[[84,8]]},"116":{"position":[[96,8]]},"125":{"position":[[93,8]]},"210":{"position":[[8,7],[334,7]]}}}],["life",{"_index":1263,"t":{"165":{"position":[[63,5]]}}}],["limit",{"_index":527,"t":{"45":{"position":[[932,5]]},"100":{"position":[[475,5]]}}}],["limiting",{"_index":574,"t":{"55":{"position":[[126,9]]}}}],["liner",{"_index":1235,"t":{"157":{"position":[[110,6]]},"159":{"position":[[236,5]]},"177":{"position":[[110,6]]},"179":{"position":[[236,5]]},"238":{"position":[[110,6]]},"240":{"position":[[236,5]]}}}],["lines",{"_index":801,"t":{"89":{"position":[[53,5]]}}}],["links",{"_index":32,"t":{"3":{"position":[[382,5]]}}}],["linux",{"_index":1219,"t":{"147":{"position":[[97,5],[144,5]]},"149":{"position":[[56,6]]},"163":{"position":[[250,6]]},"187":{"position":[[66,5]]},"189":{"position":[[19,5]]}}}],["list",{"_index":912,"t":{"108":{"position":[[38,4]]},"110":{"position":[[43,5]]},"147":{"position":[[30,4]]}}}],["little",{"_index":444,"t":{"39":{"position":[[908,6]]}}}],["llm",{"_index":834,"t":{"93":{"position":[[89,4]]}}}],["loading",{"_index":614,"t":{"63":{"position":[[97,7]]}}}],["localhost",{"_index":1323,"t":{"191":{"position":[[761,9]]}}}],["locally",{"_index":333,"t":{"27":{"position":[[564,8]]},"191":{"position":[[667,8]]}}}],["locate",{"_index":922,"t":{"110":{"position":[[0,6]]}}}],["location",{"_index":873,"t":{"100":{"position":[[341,9]]}}}],["lock",{"_index":78,"t":{"11":{"position":[[61,4],[143,4]]}}}],["log",{"_index":556,"t":{"53":{"position":[[0,3],[32,3]]},"106":{"position":[[0,3]]},"118":{"position":[[7,3]]},"121":{"position":[[454,4],[2015,3]]},"123":{"position":[[138,3]]},"127":{"position":[[7,3],[677,3],[1635,3],[2530,3],[2853,5],[3209,3]]}}}],["log.append(answer",{"_index":1129,"t":{"127":{"position":[[2122,18]]}}}],["log.count(\"yes",{"_index":1132,"t":{"127":{"position":[[2238,17]]}}}],["logging",{"_index":580,"t":{"57":{"position":[[15,7]]}}}],["logic",{"_index":324,"t":{"27":{"position":[[440,5]]},"55":{"position":[[42,5]]}}}],["logs",{"_index":1153,"t":{"127":{"position":[[3079,4]]}}}],["long",{"_index":1061,"t":{"121":{"position":[[1512,4]]}}}],["longer",{"_index":680,"t":{"73":{"position":[[93,6]]},"100":{"position":[[598,6]]}}}],["look",{"_index":443,"t":{"39":{"position":[[901,4],[939,4]]},"98":{"position":[[197,4]]},"102":{"position":[[302,4]]},"130":{"position":[[541,4]]}}}],["looks",{"_index":255,"t":{"21":{"position":[[367,5]]},"102":{"position":[[419,5]]}}}],["loop",{"_index":273,"t":{"21":{"position":[[1197,4]]},"118":{"position":[[968,5]]},"127":{"position":[[1386,5]]}}}],["low",{"_index":789,"t":{"86":{"position":[[490,3]]},"127":{"position":[[1559,3]]}}}],["loyalty",{"_index":1063,"t":{"121":{"position":[[1594,8]]}}}],["m5stack",{"_index":1392,"t":{"254":{"position":[[166,7],[215,7]]}}}],["machine",{"_index":161,"t":{"17":{"position":[[136,7],[195,7],[491,7],[518,8]]},"19":{"position":[[18,8],[564,7],[629,7],[700,7],[1379,7]]},"21":{"position":[[18,7],[155,7],[201,7]]},"63":{"position":[[66,7],[275,7]]},"91":{"position":[[34,7]]},"135":{"position":[[184,7]]}}}],["machines",{"_index":176,"t":{"17":{"position":[[464,8]]},"63":{"position":[[136,9]]},"69":{"position":[[273,8]]}}}],["macos",{"_index":1220,"t":{"147":{"position":[[103,5]]},"169":{"position":[[56,6]]}}}],["made",{"_index":430,"t":{"39":{"position":[[539,4]]}}}],["main",{"_index":988,"t":{"118":{"position":[[951,4]]},"127":{"position":[[1369,4]]}}}],["maintain",{"_index":654,"t":{"67":{"position":[[228,8]]}}}],["make",{"_index":543,"t":{"49":{"position":[[145,4]]},"121":{"position":[[1264,4],[2047,4]]},"141":{"position":[[53,4]]},"208":{"position":[[274,4]]},"250":{"position":[[25,4]]}}}],["makes",{"_index":135,"t":{"15":{"position":[[644,5]]},"130":{"position":[[512,5]]}}}],["making",{"_index":779,"t":{"86":{"position":[[43,6]]}}}],["malformed",{"_index":509,"t":{"45":{"position":[[689,9]]}}}],["manage",{"_index":899,"t":{"104":{"position":[[8,6]]}}}],["manager",{"_index":1248,"t":{"163":{"position":[[32,7]]}}}],["managers",{"_index":1028,"t":{"121":{"position":[[623,8],[1934,8]]}}}],["manual",{"_index":577,"t":{"55":{"position":[[205,6]]},"65":{"position":[[141,6]]},"67":{"position":[[283,6]]}}}],["manufacturing",{"_index":97,"t":{"13":{"position":[[97,13]]},"15":{"position":[[1021,13]]},"61":{"position":[[77,13]]},"67":{"position":[[113,13]]},"69":{"position":[[387,13]]},"71":{"position":[[120,13]]}}}],["many",{"_index":355,"t":{"31":{"position":[[36,4]]},"35":{"position":[[51,4]]},"39":{"position":[[237,4]]},"41":{"position":[[27,4],[147,4],[260,4]]},"45":{"position":[[908,4]]},"254":{"position":[[34,4]]}}}],["marketing",{"_index":1038,"t":{"121":{"position":[[991,9]]}}}],["master",{"_index":117,"t":{"15":{"position":[[364,6]]}}}],["matching",{"_index":390,"t":{"37":{"position":[[117,8]]}}}],["materials",{"_index":616,"t":{"63":{"position":[[119,9]]}}}],["means",{"_index":1189,"t":{"137":{"position":[[44,6]]}}}],["mechanism",{"_index":217,"t":{"19":{"position":[[776,10]]},"23":{"position":[[363,9]]}}}],["memory",{"_index":403,"t":{"37":{"position":[[251,7]]}}}],["mentioned",{"_index":1240,"t":{"159":{"position":[[242,9]]},"179":{"position":[[242,9]]},"240":{"position":[[242,9]]}}}],["message",{"_index":215,"t":{"19":{"position":[[747,7]]},"57":{"position":[[164,7]]}}}],["metadata",{"_index":477,"t":{"45":{"position":[[107,8]]}}}],["method",{"_index":750,"t":{"76":{"position":[[71,6],[303,6]]}}}],["methods",{"_index":284,"t":{"23":{"position":[[340,7]]},"91":{"position":[[284,7]]}}}],["microsecond=0",{"_index":1125,"t":{"127":{"position":[[1722,14]]}}}],["milling",{"_index":618,"t":{"63":{"position":[[146,7]]}}}],["mimemultipart",{"_index":1081,"t":{"127":{"position":[[325,13],[820,15]]}}}],["mimetext",{"_index":1083,"t":{"127":{"position":[[367,8]]}}}],["minimal",{"_index":13,"t":{"3":{"position":[[136,7]]}}}],["minimize",{"_index":195,"t":{"19":{"position":[[340,8]]}}}],["minimum",{"_index":697,"t":{"73":{"position":[[654,7]]}}}],["minute",{"_index":996,"t":{"118":{"position":[[1397,6]]},"121":{"position":[[299,7]]}}}],["minute=0",{"_index":1137,"t":{"127":{"position":[[2336,9]]}}}],["missing",{"_index":513,"t":{"45":{"position":[[749,7]]}}}],["ml",{"_index":274,"t":{"23":{"position":[[47,2]]},"27":{"position":[[529,2]]},"73":{"position":[[203,2],[687,2],[1786,2],[1830,2],[2037,2],[2209,2]]},"86":{"position":[[494,2]]},"91":{"position":[[51,4],[567,2]]}}}],["modbus",{"_index":670,"t":{"69":{"position":[[309,6]]}}}],["model",{"_index":300,"t":{"25":{"position":[[127,5]]},"73":{"position":[[1833,5],[2040,6],[2212,6]]},"135":{"position":[[201,5]]}}}],["models",{"_index":297,"t":{"25":{"position":[[35,7]]},"27":{"position":[[233,7]]},"73":{"position":[[206,6],[326,6],[492,6]]},"86":{"position":[[33,6]]},"91":{"position":[[56,6],[118,6],[185,6]]}}}],["moderate",{"_index":1176,"t":{"130":{"position":[[563,8]]}}}],["modern",{"_index":95,"t":{"13":{"position":[[33,6]]},"15":{"position":[[952,6]]},"61":{"position":[[0,6]]}}}],["molding",{"_index":621,"t":{"63":{"position":[[176,7]]}}}],["monitor",{"_index":567,"t":{"53":{"position":[[167,7]]}}}],["monitoring",{"_index":1058,"t":{"121":{"position":[[1441,10]]},"147":{"position":[[155,10]]}}}],["monitors",{"_index":83,"t":{"11":{"position":[[172,8]]},"73":{"position":[[353,8]]},"121":{"position":[[95,8]]}}}],["more",{"_index":33,"t":{"3":{"position":[[391,4]]},"15":{"position":[[4,4]]},"53":{"position":[[146,4]]},"61":{"position":[[116,4]]},"63":{"position":[[304,4]]},"71":{"position":[[9,4]]},"73":{"position":[[284,4],[313,4],[1642,4]]},"91":{"position":[[251,4]]},"135":{"position":[[55,4],[107,4]]},"167":{"position":[[74,4]]},"185":{"position":[[74,4]]},"205":{"position":[[74,4]]},"228":{"position":[[74,4]]},"246":{"position":[[74,4]]}}}],["mounted",{"_index":313,"t":{"27":{"position":[[128,7]]}}}],["msg",{"_index":1088,"t":{"127":{"position":[[814,3],[2414,3],[2673,3]]}}}],["msg.as_string",{"_index":1101,"t":{"127":{"position":[[1049,15]]}}}],["msg.attach(mimetext(body",{"_index":1093,"t":{"127":{"position":[[903,25]]}}}],["msg['from",{"_index":1089,"t":{"127":{"position":[[836,11]]}}}],["msg['subject",{"_index":1092,"t":{"127":{"position":[[878,14]]}}}],["msg['to",{"_index":1091,"t":{"127":{"position":[[857,9]]}}}],["much",{"_index":331,"t":{"27":{"position":[[552,4]]}}}],["name",{"_index":755,"t":{"76":{"position":[[144,5]]},"106":{"position":[[146,5]]},"108":{"position":[[111,5],[133,4]]}}}],["name=\"conveyor",{"_index":1165,"t":{"130":{"position":[[240,14]]}}}],["name=\"counter",{"_index":1115,"t":{"127":{"position":[[1449,13]]}}}],["natural",{"_index":6,"t":{"3":{"position":[[60,7]]},"13":{"position":[[40,7]]},"15":{"position":[[959,7],[1211,7]]},"39":{"position":[[979,7]]},"61":{"position":[[7,7]]},"63":{"position":[[249,7]]},"65":{"position":[[284,7]]},"71":{"position":[[38,7]]}}}],["navigate",{"_index":903,"t":{"106":{"position":[[39,8]]}}}],["near",{"_index":1069,"t":{"121":{"position":[[1775,4]]}}}],["nearly",{"_index":870,"t":{"100":{"position":[[207,6]]}}}],["need",{"_index":177,"t":{"19":{"position":[[36,4]]},"21":{"position":[[35,4]]},"39":{"position":[[442,4]]},"67":{"position":[[274,4]]},"91":{"position":[[514,4]]},"95":{"position":[[182,4]]},"98":{"position":[[39,4]]},"121":{"position":[[1740,4]]},"127":{"position":[[701,4]]},"155":{"position":[[165,4]]},"159":{"position":[[7,4]]},"161":{"position":[[205,4]]},"175":{"position":[[165,4]]},"179":{"position":[[7,4]]},"181":{"position":[[205,4]]},"212":{"position":[[182,4],[526,4]]},"236":{"position":[[171,4]]},"240":{"position":[[7,4]]},"242":{"position":[[211,4]]},"256":{"position":[[154,4]]}}}],["needed",{"_index":689,"t":{"73":{"position":[[365,7]]},"100":{"position":[[605,7]]}}}],["needing",{"_index":825,"t":{"91":{"position":[[410,7]]}}}],["needs",{"_index":209,"t":{"19":{"position":[[642,5]]},"23":{"position":[[281,5]]}}}],["network",{"_index":303,"t":{"25":{"position":[[182,7]]},"55":{"position":[[103,7]]},"114":{"position":[[61,7]]},"123":{"position":[[61,7]]},"127":{"position":[[744,7]]}}}],["never",{"_index":866,"t":{"100":{"position":[[44,5]]}}}],["new",{"_index":691,"t":{"73":{"position":[[444,3]]},"76":{"position":[[162,3],[230,3]]},"82":{"position":[[41,3]]},"106":{"position":[[90,3],[122,3]]},"110":{"position":[[318,3]]},"191":{"position":[[82,3]]}}}],["next",{"_index":247,"t":{"19":{"position":[[1449,4]]},"21":{"position":[[380,4],[1175,4]]},"73":{"position":[[507,4]]},"110":{"position":[[75,4]]},"118":{"position":[[67,5]]},"127":{"position":[[67,5]]}}}],["next_hourly_start",{"_index":1122,"t":{"127":{"position":[[1659,17],[2162,18],[2181,17]]}}}],["nice",{"_index":1197,"t":{"139":{"position":[[93,4]]}}}],["non",{"_index":89,"t":{"11":{"position":[[259,3]]},"212":{"position":[[303,3]]}}}],["none",{"_index":204,"t":{"19":{"position":[[502,6]]},"21":{"position":[[488,4],[723,5]]},"23":{"position":[[801,6]]},"118":{"position":[[523,4]]},"127":{"position":[[636,4]]}}}],["normal",{"_index":1344,"t":{"210":{"position":[[216,6]]}}}],["normally",{"_index":1354,"t":{"212":{"position":[[245,8]]}}}],["note",{"_index":377,"t":{"35":{"position":[[133,5]]},"37":{"position":[[424,5]]},"39":{"position":[[518,4]]},"86":{"position":[[425,4]]},"89":{"position":[[388,5]]},"110":{"position":[[137,5]]},"163":{"position":[[177,4]]}}}],["notification",{"_index":85,"t":{"11":{"position":[[200,12]]},"147":{"position":[[166,12]]},"191":{"position":[[232,12],[360,12]]},"252":{"position":[[32,12]]}}}],["now",{"_index":1233,"t":{"155":{"position":[[239,3]]},"159":{"position":[[339,3]]},"165":{"position":[[808,3]]},"167":{"position":[[7,3]]},"175":{"position":[[239,3]]},"179":{"position":[[339,3]]},"185":{"position":[[7,3]]},"199":{"position":[[194,3]]},"205":{"position":[[7,3]]},"222":{"position":[[194,3]]},"228":{"position":[[7,3]]},"236":{"position":[[245,3]]},"240":{"position":[[339,3]]},"246":{"position":[[7,3]]}}}],["np",{"_index":406,"t":{"37":{"position":[[338,2]]}}}],["np.random.uniform(low=0",{"_index":408,"t":{"37":{"position":[[350,24]]}}}],["np_img",{"_index":407,"t":{"37":{"position":[[341,6],[507,7]]}}}],["number",{"_index":878,"t":{"100":{"position":[[485,6]]},"161":{"position":[[103,6]]},"181":{"position":[[103,6]]},"242":{"position":[[109,6]]}}}],["numpy",{"_index":360,"t":{"31":{"position":[[85,5]]},"35":{"position":[[119,5]]},"37":{"position":[[41,5],[315,6],[329,5]]},"39":{"position":[[89,5],[382,5],[734,5]]},"208":{"position":[[144,5]]}}}],["nvidia",{"_index":310,"t":{"27":{"position":[[101,6]]},"147":{"position":[[130,6]]},"193":{"position":[[56,6]]},"195":{"position":[[53,6]]},"197":{"position":[[57,6]]},"201":{"position":[[37,6]]},"203":{"position":[[51,6]]}}}],["object",{"_index":21,"t":{"3":{"position":[[239,6]]},"19":{"position":[[436,6]]},"89":{"position":[[275,6]]},"95":{"position":[[550,6]]}}}],["obscure",{"_index":545,"t":{"49":{"position":[[174,7]]}}}],["observed",{"_index":86,"t":{"11":{"position":[[228,8]]}}}],["occur",{"_index":132,"t":{"15":{"position":[[579,5]]}}}],["occurred",{"_index":531,"t":{"45":{"position":[[1006,8]]}}}],["offers",{"_index":601,"t":{"61":{"position":[[180,6]]},"210":{"position":[[16,6]]}}}],["official",{"_index":1288,"t":{"183":{"position":[[46,8]]},"244":{"position":[[46,8]]}}}],["okay",{"_index":1178,"t":{"135":{"position":[[17,5]]}}}],["old",{"_index":882,"t":{"100":{"position":[[572,3]]},"110":{"position":[[347,3]]}}}],["once",{"_index":258,"t":{"21":{"position":[[493,4]]},"121":{"position":[[311,4]]}}}],["one",{"_index":238,"t":{"19":{"position":[[1177,3]]},"23":{"position":[[329,3]]},"35":{"position":[[429,3]]},"76":{"position":[[166,3]]},"110":{"position":[[351,4]]},"135":{"position":[[228,3]]},"157":{"position":[[106,3]]},"159":{"position":[[232,3]]},"177":{"position":[[106,3]]},"179":{"position":[[232,3]]},"238":{"position":[[106,3]]},"240":{"position":[[232,3]]}}}],["ones",{"_index":883,"t":{"100":{"position":[[576,4]]}}}],["open",{"_index":796,"t":{"86":{"position":[[738,7]]},"89":{"position":[[195,7]]},"95":{"position":[[470,7]]},"161":{"position":[[40,4]]},"181":{"position":[[40,4]]},"191":{"position":[[676,4]]},"242":{"position":[[40,4]]}}}],["opencv",{"_index":359,"t":{"31":{"position":[[73,7]]},"35":{"position":[[0,6],[91,6]]},"37":{"position":[[126,6]]},"39":{"position":[[70,7],[120,7],[424,6]]},"116":{"position":[[89,6],[129,6]]},"118":{"position":[[323,7]]},"125":{"position":[[86,6],[156,6]]},"127":{"position":[[436,7]]},"208":{"position":[[153,7]]}}}],["opencv's",{"_index":383,"t":{"35":{"position":[[244,8]]}}}],["opening",{"_index":1193,"t":{"137":{"position":[[97,7]]},"256":{"position":[[248,7]]}}}],["operate",{"_index":827,"t":{"91":{"position":[[472,7]]}}}],["operating",{"_index":1105,"t":{"127":{"position":[[1147,9]]}}}],["operations",{"_index":644,"t":{"65":{"position":[[324,11]]},"121":{"position":[[2088,10]]}}}],["opinions",{"_index":1196,"t":{"139":{"position":[[73,8]]}}}],["optimize",{"_index":633,"t":{"65":{"position":[[110,8]]},"121":{"position":[[636,8]]}}}],["optimized",{"_index":1332,"t":{"208":{"position":[[23,9]]}}}],["options",{"_index":1381,"t":{"252":{"position":[[45,7]]}}}],["order",{"_index":379,"t":{"35":{"position":[[162,6],[177,6],[236,7]]},"37":{"position":[[110,6],[438,5]]},"39":{"position":[[34,6],[345,6],[470,5],[603,5],[678,5],[761,5],[774,5]]}}}],["originally",{"_index":418,"t":{"39":{"position":[[152,10]]}}}],["originate",{"_index":426,"t":{"39":{"position":[[409,9]]}}}],["originated",{"_index":341,"t":{"27":{"position":[[776,10]]}}}],["originating",{"_index":554,"t":{"51":{"position":[[128,11]]}}}],["out",{"_index":102,"t":{"15":{"position":[[93,3]]},"71":{"position":[[158,3]]},"121":{"position":[[335,3]]},"256":{"position":[[302,3]]}}}],["output=true",{"_index":982,"t":{"118":{"position":[[791,12]]}}}],["over",{"_index":829,"t":{"91":{"position":[[552,4]]},"95":{"position":[[117,4]]},"100":{"position":[[227,4]]},"112":{"position":[[260,4]]}}}],["overall",{"_index":658,"t":{"67":{"position":[[317,7]]}}}],["oversight",{"_index":838,"t":{"93":{"position":[[173,10]]}}}],["p",{"_index":977,"t":{"118":{"position":[[650,1]]}}}],["p.open(format=p.get_format_from_width(wf.getsampwidth",{"_index":979,"t":{"118":{"position":[[681,57]]}}}],["p.terminate",{"_index":987,"t":{"118":{"position":[[927,13]]}}}],["package",{"_index":1225,"t":{"151":{"position":[[94,7]]},"163":{"position":[[24,7]]},"171":{"position":[[94,7]]},"195":{"position":[[101,7]]},"218":{"position":[[100,7]]},"232":{"position":[[94,7]]}}}],["pacman",{"_index":1258,"t":{"163":{"position":[[262,6]]}}}],["page",{"_index":25,"t":{"3":{"position":[[292,5]]},"43":{"position":[[108,4]]},"80":{"position":[[84,4],[139,4],[161,4]]},"84":{"position":[[84,4],[147,4],[169,4]]},"106":{"position":[[66,5]]},"108":{"position":[[18,5]]},"191":{"position":[[836,5]]}}}],["page_size=5",{"_index":770,"t":{"80":{"position":[[204,12]]},"84":{"position":[[220,12]]}}}],["pages",{"_index":104,"t":{"15":{"position":[[111,6]]},"167":{"position":[[173,6]]},"185":{"position":[[173,6]]},"228":{"position":[[173,6]]},"246":{"position":[[173,6]]}}}],["pagination",{"_index":766,"t":{"80":{"position":[[123,11]]},"84":{"position":[[131,11]]}}}],["partial",{"_index":1192,"t":{"137":{"position":[[89,7]]}}}],["particular",{"_index":682,"t":{"73":{"position":[[184,11]]},"127":{"position":[[733,10]]}}}],["parts",{"_index":625,"t":{"63":{"position":[[227,5]]}}}],["pass",{"_index":266,"t":{"21":{"position":[[932,4],[1011,4],[1095,4]]},"29":{"position":[[74,4]]},"102":{"position":[[549,4]]}}}],["passed",{"_index":716,"t":{"73":{"position":[[1305,6]]}}}],["password",{"_index":1099,"t":{"127":{"position":[[1031,10]]}}}],["passwords",{"_index":865,"t":{"100":{"position":[[33,10]]}}}],["path",{"_index":370,"t":{"33":{"position":[[235,4]]}}}],["patterns",{"_index":1027,"t":{"121":{"position":[[584,8]]}}}],["pays",{"_index":948,"t":{"112":{"position":[[382,4]]}}}],["peak",{"_index":1030,"t":{"121":{"position":[[730,4]]}}}],["people",{"_index":828,"t":{"91":{"position":[[507,6]]},"100":{"position":[[495,6]]},"139":{"position":[[47,6]]}}}],["per",{"_index":764,"t":{"80":{"position":[[80,3],[157,3]]},"84":{"position":[[80,3],[165,3]]}}}],["percent_in_use",{"_index":1131,"t":{"127":{"position":[[2221,14]]}}}],["percent_in_use:.0f",{"_index":1142,"t":{"127":{"position":[[2459,21]]}}}],["percentage",{"_index":1020,"t":{"121":{"position":[[356,10]]},"127":{"position":[[3150,11]]}}}],["perform",{"_index":638,"t":{"65":{"position":[[223,7]]}}}],["performance",{"_index":146,"t":{"15":{"position":[[875,11]]}}}],["permissions",{"_index":519,"t":{"45":{"position":[[832,11]]}}}],["person",{"_index":1186,"t":{"135":{"position":[[351,6]]}}}],["phase",{"_index":809,"t":{"89":{"position":[[425,6]]}}}],["pi",{"_index":76,"t":{"11":{"position":[[53,2],[129,2]]},"27":{"position":[[164,3]]},"147":{"position":[[127,2]]},"216":{"position":[[66,3]]},"218":{"position":[[63,3]]},"220":{"position":[[67,3]]},"224":{"position":[[47,3]]},"226":{"position":[[60,3]]}}}],["pil",{"_index":287,"t":{"23":{"position":[[509,3]]},"31":{"position":[[68,4]]},"33":{"position":[[31,3],[134,3]]},"73":{"position":[[936,3]]},"86":{"position":[[618,3]]},"118":{"position":[[219,3],[437,3]]},"127":{"position":[[234,3],[550,3]]},"210":{"position":[[4,3],[125,4],[138,3],[330,3]]},"212":{"position":[[96,3],[264,3],[509,3]]}}}],["pil_img",{"_index":371,"t":{"33":{"position":[[249,7],[330,8]]}}}],["pillow",{"_index":958,"t":{"116":{"position":[[143,6]]},"125":{"position":[[170,6]]},"210":{"position":[[308,6]]}}}],["pin",{"_index":1390,"t":{"254":{"position":[[149,3]]}}}],["pip",{"_index":957,"t":{"116":{"position":[[105,3]]},"125":{"position":[[132,3]]},"151":{"position":[[82,3]]},"155":{"position":[[37,4],[86,3]]},"159":{"position":[[84,3],[97,3]]},"171":{"position":[[82,3]]},"175":{"position":[[37,4],[86,3]]},"179":{"position":[[84,3],[97,3]]},"195":{"position":[[89,3]]},"199":{"position":[[37,4]]},"218":{"position":[[88,3]]},"222":{"position":[[37,4]]},"232":{"position":[[82,3]]},"236":{"position":[[37,4],[92,3]]},"240":{"position":[[84,3],[97,3]]}}}],["pip.py",{"_index":1284,"t":{"165":{"position":[[644,6],[662,6],[693,6]]}}}],["pip3",{"_index":842,"t":{"95":{"position":[[87,4]]},"155":{"position":[[177,4],[191,4]]},"159":{"position":[[151,5],[157,4]]},"165":{"position":[[712,6],[782,4],[840,4]]},"175":{"position":[[177,4],[191,4]]},"179":{"position":[[151,5],[157,4]]},"199":{"position":[[86,4]]},"210":{"position":[[265,4]]},"222":{"position":[[86,4]]},"236":{"position":[[183,4],[197,4]]},"240":{"position":[[151,5],[157,4]]}}}],["pip3.8",{"_index":1282,"t":{"165":{"position":[[602,6],[726,6],[795,7]]}}}],["pixel",{"_index":392,"t":{"37":{"position":[[144,5]]}}}],["placeholder",{"_index":735,"t":{"73":{"position":[[1802,11]]}}}],["plain",{"_index":1094,"t":{"127":{"position":[[929,9]]}}}],["plan",{"_index":1036,"t":{"121":{"position":[[977,4]]}}}],["platform",{"_index":1217,"t":{"147":{"position":[[12,8],[257,9]]}}}],["platformio",{"_index":1401,"t":{"256":{"position":[[47,10]]}}}],["platforms",{"_index":1215,"t":{"145":{"position":[[164,10]]},"212":{"position":[[406,10]]}}}],["play",{"_index":645,"t":{"67":{"position":[[45,4]]},"112":{"position":[[234,4]]},"118":{"position":[[549,4]]}}}],["play_sound",{"_index":1001,"t":{"118":{"position":[[1642,10]]}}}],["play_sound(\"get_off_couch.mp3",{"_index":994,"t":{"118":{"position":[[1245,31]]}}}],["play_sound(file_path",{"_index":971,"t":{"118":{"position":[[582,22]]}}}],["plays",{"_index":1000,"t":{"118":{"position":[[1603,5]]}}}],["please",{"_index":676,"t":{"71":{"position":[[145,6]]},"100":{"position":[[100,6]]},"165":{"position":[[146,6]]},"256":{"position":[[232,6]]}}}],["plug",{"_index":1372,"t":{"250":{"position":[[206,4]]}}}],["poll",{"_index":293,"t":{"23":{"position":[[1114,4]]}}}],["polling",{"_index":285,"t":{"23":{"position":[[355,7]]}}}],["popular",{"_index":356,"t":{"31":{"position":[[41,7]]},"35":{"position":[[12,7]]},"69":{"position":[[71,7]]}}}],["port",{"_index":1378,"t":{"250":{"position":[[403,5]]}}}],["ports",{"_index":1305,"t":{"191":{"position":[[268,6],[395,6]]}}}],["positive",{"_index":1064,"t":{"121":{"position":[[1605,8]]}}}],["possible",{"_index":733,"t":{"73":{"position":[[1740,9]]},"250":{"position":[[44,8]]}}}],["power",{"_index":832,"t":{"93":{"position":[[49,5]]}}}],["powered",{"_index":5,"t":{"3":{"position":[[49,7]]},"5":{"position":[[65,7]]},"15":{"position":[[323,7]]}}}],["powerful",{"_index":2,"t":{"3":{"position":[[23,8]]},"9":{"position":[[202,8]]},"15":{"position":[[1142,8]]}}}],["practice",{"_index":771,"t":{"82":{"position":[[3,9]]},"102":{"position":[[106,9]]}}}],["practices",{"_index":535,"t":{"47":{"position":[[57,9]]},"59":{"position":[[204,10]]},"100":{"position":[[125,9],[277,9]]}}}],["pre",{"_index":940,"t":{"112":{"position":[[241,3]]},"114":{"position":[[88,3]]},"118":{"position":[[558,3],[1613,3]]}}}],["precisely",{"_index":1185,"t":{"135":{"position":[[332,9]]}}}],["prediction",{"_index":275,"t":{"23":{"position":[[50,10]]}}}],["preferable",{"_index":401,"t":{"37":{"position":[[225,10]]}}}],["prefix",{"_index":337,"t":{"27":{"position":[[667,6]]},"108":{"position":[[183,9]]}}}],["prepare",{"_index":1272,"t":{"165":{"position":[[314,7]]}}}],["prerequisites",{"_index":841,"t":{"95":{"position":[[72,14]]}}}],["present",{"_index":1338,"t":{"208":{"position":[[302,8]]}}}],["prevent",{"_index":927,"t":{"110":{"position":[[200,7]]}}}],["previous",{"_index":431,"t":{"39":{"position":[[580,8]]}}}],["print",{"_index":492,"t":{"45":{"position":[[391,5]]}}}],["print(\"dog",{"_index":993,"t":{"118":{"position":[[1209,10]]}}}],["print(\"failed",{"_index":995,"t":{"118":{"position":[[1350,13]]},"127":{"position":[[1870,13]]}}}],["print(daily_summary",{"_index":1148,"t":{"127":{"position":[[2719,20]]}}}],["print(f\"error",{"_index":499,"t":{"45":{"position":[[500,13]]},"118":{"position":[[1300,13]]},"127":{"position":[[2026,13]]}}}],["print(f\"http",{"_index":503,"t":{"45":{"position":[[576,12]]}}}],["print(f\"the",{"_index":719,"t":{"73":{"position":[[1413,11],[2282,11]]},"89":{"position":[[343,11]]},"95":{"position":[[618,11]]},"130":{"position":[[452,11]]}}}],["print(groundlight.__version__",{"_index":1237,"t":{"157":{"position":[[148,31]]},"177":{"position":[[148,31]]},"238":{"position":[[148,31]]}}}],["print(msg",{"_index":1143,"t":{"127":{"position":[[2497,10]]}}}],["prints",{"_index":1018,"t":{"121":{"position":[[328,6]]},"127":{"position":[[3110,6]]}}}],["prior",{"_index":193,"t":{"19":{"position":[[318,5]]},"39":{"position":[[1134,5]]}}}],["privileged",{"_index":1315,"t":{"191":{"position":[[529,11]]}}}],["proactively",{"_index":1059,"t":{"121":{"position":[[1489,11]]}}}],["proceed",{"_index":1228,"t":{"153":{"position":[[73,7]]},"173":{"position":[[73,7]]},"197":{"position":[[80,7]]},"220":{"position":[[79,7]]},"234":{"position":[[73,7]]}}}],["process",{"_index":160,"t":{"17":{"position":[[125,7]]},"21":{"position":[[400,7]]},"65":{"position":[[52,7]]},"147":{"position":[[240,7]]}}}],["processed",{"_index":260,"t":{"21":{"position":[[518,10]]}}}],["processes",{"_index":605,"t":{"61":{"position":[[285,10]]},"67":{"position":[[127,10]]},"71":{"position":[[134,10]]}}}],["processing",{"_index":281,"t":{"23":{"position":[[236,10],[1028,10]]},"35":{"position":[[26,10]]},"39":{"position":[[260,10]]}}}],["processor",{"_index":45,"t":{"7":{"position":[[73,9]]}}}],["product",{"_index":659,"t":{"67":{"position":[[325,7]]}}}],["production",{"_index":593,"t":{"59":{"position":[[168,11]]}}}],["productivity",{"_index":608,"t":{"61":{"position":[[318,13]]}}}],["products",{"_index":653,"t":{"67":{"position":[[182,9]]}}}],["program",{"_index":197,"t":{"19":{"position":[[363,7]]},"250":{"position":[[424,7]]}}}],["programatically",{"_index":784,"t":{"86":{"position":[[217,15]]}}}],["progress",{"_index":461,"t":{"41":{"position":[[129,9]]}}}],["progressively",{"_index":820,"t":{"91":{"position":[[224,13]]}}}],["project",{"_index":1300,"t":{"191":{"position":[[125,7],[617,7]]},"256":{"position":[[58,7]]}}}],["projects",{"_index":1287,"t":{"167":{"position":[[60,9]]},"185":{"position":[[60,9]]},"205":{"position":[[60,9]]},"228":{"position":[[60,9]]},"246":{"position":[[60,9]]}}}],["promotions",{"_index":1040,"t":{"121":{"position":[[1014,10]]}}}],["prompt",{"_index":1364,"t":{"236":{"position":[[84,7]]},"242":{"position":[[55,6]]},"250":{"position":[[463,6]]}}}],["prompted",{"_index":1375,"t":{"250":{"position":[[353,9]]}}}],["proper",{"_index":953,"t":{"114":{"position":[[176,6]]}}}],["properly",{"_index":1349,"t":{"212":{"position":[[117,9]]}}}],["provide",{"_index":31,"t":{"3":{"position":[[374,7]]},"73":{"position":[[700,7]]},"121":{"position":[[1163,7]]}}}],["provides",{"_index":1,"t":{"3":{"position":[[12,8]]},"17":{"position":[[12,8]]},"41":{"position":[[228,8]]}}}],["psram",{"_index":1393,"t":{"254":{"position":[[180,5],[229,5]]}}}],["public",{"_index":707,"t":{"73":{"position":[[1020,6]]}}}],["publish",{"_index":1328,"t":{"201":{"position":[[110,7]]},"224":{"position":[[109,7]]}}}],["purchase",{"_index":1395,"t":{"254":{"position":[[199,9],[250,9],[276,9],[318,9]]}}}],["put",{"_index":892,"t":{"102":{"position":[[353,3]]}}}],["py3.10",{"_index":1265,"t":{"165":{"position":[[138,7]]}}}],["pyaudio",{"_index":959,"t":{"116":{"position":[[150,7]]},"118":{"position":[[243,7]]}}}],["pyaudio.pyaudio",{"_index":978,"t":{"118":{"position":[[654,17]]}}}],["python",{"_index":179,"t":{"19":{"position":[[68,6]]},"21":{"position":[[67,6]]},"29":{"position":[[336,6]]},"89":{"position":[[62,7],[268,6]]},"95":{"position":[[38,6],[323,6],[543,6],[671,6]]},"114":{"position":[[21,6]]},"116":{"position":[[16,6],[136,6]]},"118":{"position":[[89,6],[1719,6]]},"123":{"position":[[21,6]]},"125":{"position":[[16,6],[163,6]]},"127":{"position":[[89,6],[3302,6]]},"149":{"position":[[92,6]]},"151":{"position":[[61,6],[86,7]]},"153":{"position":[[18,6]]},"157":{"position":[[99,6],[117,6]]},"159":{"position":[[225,6]]},"161":{"position":[[24,6],[65,6],[221,6]]},"163":{"position":[[62,6],[272,6],[307,6],[333,6]]},"165":{"position":[[24,6],[98,6],[190,6],[227,6]]},"169":{"position":[[92,6]]},"171":{"position":[[61,6],[86,7]]},"173":{"position":[[18,6]]},"177":{"position":[[99,6],[117,6]]},"179":{"position":[[225,6]]},"181":{"position":[[24,6],[65,6],[221,6]]},"183":{"position":[[20,6],[55,6],[109,7],[130,6],[165,6],[191,6]]},"193":{"position":[[108,6]]},"195":{"position":[[68,6],[93,7]]},"197":{"position":[[18,6]]},"210":{"position":[[80,7]]},"216":{"position":[[99,6]]},"218":{"position":[[67,6],[92,7]]},"220":{"position":[[18,6]]},"230":{"position":[[94,6]]},"232":{"position":[[61,6],[86,7]]},"234":{"position":[[18,6]]},"238":{"position":[[99,6],[117,6]]},"240":{"position":[[225,6]]},"242":{"position":[[24,6],[71,6],[227,6]]},"244":{"position":[[20,6],[55,6],[110,6],[136,6]]}}}],["python2",{"_index":1232,"t":{"155":{"position":[[131,7]]},"175":{"position":[[131,7]]},"236":{"position":[[137,7]]}}}],["python3",{"_index":1253,"t":{"163":{"position":[[147,7],[233,7],[353,7]]},"165":{"position":[[459,9],[549,7]]},"183":{"position":[[211,7]]},"244":{"position":[[156,7]]}}}],["python3.8",{"_index":1276,"t":{"165":{"position":[[412,9],[422,9],[476,9],[674,9]]}}}],["quality",{"_index":609,"t":{"61":{"position":[[336,7]]},"67":{"position":[[87,7],[244,7],[333,8]]}}}],["queries",{"_index":134,"t":{"15":{"position":[[623,8],[681,8],[710,7]]},"17":{"position":[[68,8],[161,7],[332,7]]},"19":{"position":[[106,7]]},"21":{"position":[[126,7]]},"27":{"position":[[615,7],[704,7],[793,7]]},"73":{"position":[[512,7],[1872,7]]},"86":{"position":[[50,7]]},"91":{"position":[[539,8],[604,7]]}}}],["query",{"_index":186,"t":{"19":{"position":[[218,5],[251,5],[1454,5]]},"21":{"position":[[391,5],[802,5],[900,5]]},"23":{"position":[[25,5],[69,5],[166,5],[252,6],[730,5],[921,5],[1044,5]]},"27":{"position":[[758,5]]},"73":{"position":[[141,6],[275,5],[725,5],[2275,6]]},"76":{"position":[[59,6],[291,6]]},"82":{"position":[[60,6],[115,6]]},"86":{"position":[[442,5]]},"118":{"position":[[1331,6]]},"127":{"position":[[2057,6]]},"137":{"position":[[4,5],[69,6]]}}}],["query=\"are",{"_index":1168,"t":{"130":{"position":[[268,10]]}}}],["query=\"is",{"_index":369,"t":{"33":{"position":[[221,9]]},"73":{"position":[[1200,9]]},"76":{"position":[[422,9]]},"86":{"position":[[716,9]]},"89":{"position":[[173,9]]},"95":{"position":[[448,9]]},"127":{"position":[[1472,9]]}}}],["query=\"your_query",{"_index":227,"t":{"19":{"position":[[1042,19]]},"21":{"position":[[629,19]]},"23":{"position":[[590,19]]}}}],["question",{"_index":1164,"t":{"130":{"position":[[154,9],[525,9]]},"133":{"position":[[5,8]]},"135":{"position":[[5,8],[290,8]]},"139":{"position":[[5,8]]},"141":{"position":[[21,8]]},"143":{"position":[[11,8]]}}}],["questions",{"_index":1160,"t":{"130":{"position":[[49,9]]},"135":{"position":[[155,9],[252,9]]},"256":{"position":[[178,9]]}}}],["queue",{"_index":216,"t":{"19":{"position":[[755,6]]},"86":{"position":[[477,5]]}}}],["quickly",{"_index":15,"t":{"3":{"position":[[176,7]]}}}],["quite",{"_index":1343,"t":{"210":{"position":[[168,5]]},"214":{"position":[[77,5]]}}}],["rack",{"_index":312,"t":{"27":{"position":[[123,4]]}}}],["raise",{"_index":475,"t":{"45":{"position":[[59,5]]}}}],["raised",{"_index":539,"t":{"49":{"position":[[57,7]]}}}],["random",{"_index":405,"t":{"37":{"position":[[299,6]]}}}],["raspberry",{"_index":82,"t":{"11":{"position":[[119,9]]},"27":{"position":[[154,9]]},"147":{"position":[[117,9]]},"216":{"position":[[56,9]]},"218":{"position":[[53,9]]},"220":{"position":[[57,9]]},"224":{"position":[[37,9]]},"226":{"position":[[50,9]]}}}],["rate",{"_index":526,"t":{"45":{"position":[[927,4]]},"55":{"position":[[121,4]]}}}],["rate=wf.getframerate",{"_index":981,"t":{"118":{"position":[[767,23]]}}}],["rb",{"_index":976,"t":{"118":{"position":[[644,5]]}}}],["reach",{"_index":677,"t":{"71":{"position":[[152,5]]}}}],["reaches",{"_index":717,"t":{"73":{"position":[[1330,7]]}}}],["reaching",{"_index":1404,"t":{"256":{"position":[[293,8]]}}}],["read",{"_index":182,"t":{"19":{"position":[[159,5]]}}}],["ready",{"_index":1224,"t":{"147":{"position":[[277,5]]},"155":{"position":[[257,5]]},"167":{"position":[[11,5]]},"175":{"position":[[257,5]]},"185":{"position":[[11,5]]},"199":{"position":[[212,5]]},"205":{"position":[[11,5]]},"222":{"position":[[212,5]]},"228":{"position":[[11,5]]},"236":{"position":[[263,5]]},"246":{"position":[[11,5]]}}}],["real",{"_index":687,"t":{"73":{"position":[[337,4]]},"91":{"position":[[298,4]]},"93":{"position":[[157,4]]}}}],["rearranging",{"_index":1053,"t":{"121":{"position":[[1297,11]]}}}],["reason",{"_index":500,"t":{"45":{"position":[[514,7]]}}}],["receive",{"_index":792,"t":{"86":{"position":[[541,7]]},"121":{"position":[[1949,7]]},"130":{"position":[[172,7]]}}}],["receiver",{"_index":1086,"t":{"127":{"position":[[788,9],[869,8],[1089,9]]}}}],["receiver=\"manager@example.com",{"_index":1150,"t":{"127":{"position":[[2784,31]]}}}],["recognize",{"_index":624,"t":{"63":{"position":[[217,9]]}}}],["recommend",{"_index":283,"t":{"23":{"position":[[313,9]]},"102":{"position":[[119,9]]},"165":{"position":[[82,9]]}}}],["recommended",{"_index":886,"t":{"102":{"position":[[81,14]]},"114":{"position":[[160,11]]}}}],["record",{"_index":946,"t":{"112":{"position":[[343,6]]}}}],["recorded",{"_index":941,"t":{"112":{"position":[[245,8]]},"114":{"position":[[92,8]]},"118":{"position":[[562,8],[1617,8]]}}}],["recover",{"_index":575,"t":{"55":{"position":[[167,7]]}}}],["red",{"_index":440,"t":{"39":{"position":[[857,3]]}}}],["reduce",{"_index":635,"t":{"65":{"position":[[134,6]]}}}],["reduced",{"_index":147,"t":{"15":{"position":[[891,7]]},"212":{"position":[[136,7]]}}}],["reducing",{"_index":302,"t":{"25":{"position":[[158,8]]},"67":{"position":[[261,8]]},"121":{"position":[[745,8]]}}}],["refer",{"_index":174,"t":{"17":{"position":[[445,5]]},"167":{"position":[[109,5]]},"185":{"position":[[109,5]]},"205":{"position":[[109,5]]},"228":{"position":[[109,5]]},"246":{"position":[[109,5]]}}}],["refers",{"_index":1204,"t":{"141":{"position":[[119,6]]}}}],["regularly",{"_index":880,"t":{"100":{"position":[[551,9]]}}}],["relatively",{"_index":1116,"t":{"127":{"position":[[1548,10]]}}}],["release",{"_index":249,"t":{"19":{"position":[[1476,7]]},"35":{"position":[[526,7]]}}}],["relevant",{"_index":562,"t":{"53":{"position":[[84,8]]}}}],["reliability",{"_index":837,"t":{"93":{"position":[[142,11]]}}}],["relies",{"_index":1355,"t":{"212":{"position":[[254,6]]}}}],["remains",{"_index":582,"t":{"57":{"position":[[90,7]]}}}],["remote",{"_index":1321,"t":{"191":{"position":[[738,6]]}}}],["rephrased",{"_index":1179,"t":{"135":{"position":[[39,9]]}}}],["replace",{"_index":1322,"t":{"191":{"position":[[753,7]]}}}],["repo",{"_index":1331,"t":{"203":{"position":[[82,5]]},"226":{"position":[[80,5]]}}}],["repositories",{"_index":39,"t":{"5":{"position":[[21,12]]},"165":{"position":[[298,13]]}}}],["repository",{"_index":42,"t":{"7":{"position":[[0,11]]},"9":{"position":[[0,11]]},"11":{"position":[[0,11]]},"102":{"position":[[263,11],[662,11]]},"256":{"position":[[279,10]]}}}],["request",{"_index":507,"t":{"45":{"position":[[653,8],[666,7],[789,7]]}}}],["requested",{"_index":522,"t":{"45":{"position":[[865,9]]}}}],["requests",{"_index":525,"t":{"45":{"position":[[913,9]]},"73":{"position":[[960,8]]},"86":{"position":[[642,8]]}}}],["require",{"_index":725,"t":{"73":{"position":[[1586,7]]},"254":{"position":[[87,7]]}}}],["required",{"_index":960,"t":{"118":{"position":[[135,8]]},"125":{"position":[[112,8]]},"127":{"position":[[135,8]]},"187":{"position":[[165,9]]}}}],["requires",{"_index":726,"t":{"73":{"position":[[1633,8]]},"95":{"position":[[29,8]]},"149":{"position":[[83,8]]},"169":{"position":[[83,8]]},"193":{"position":[[99,8]]},"212":{"position":[[339,8]]},"216":{"position":[[90,8]]},"230":{"position":[[85,8]]}}}],["resilient",{"_index":594,"t":{"59":{"position":[[241,9]]}}}],["resource",{"_index":523,"t":{"45":{"position":[[875,8]]},"91":{"position":[[256,8]]}}}],["resources",{"_index":149,"t":{"15":{"position":[[1068,9]]}}}],["response",{"_index":684,"t":{"73":{"position":[[236,9],[416,9],[885,9],[1814,8]]},"86":{"position":[[208,8]]},"130":{"position":[[192,9]]}}}],["responses",{"_index":786,"t":{"86":{"position":[[292,9]]}}}],["responsible",{"_index":315,"t":{"27":{"position":[[189,11]]}}}],["result",{"_index":200,"t":{"19":{"position":[[413,7],[469,6],[481,6],[597,7]]},"21":{"position":[[272,6],[825,6],[880,6]]},"23":{"position":[[121,6],[184,6],[205,6],[289,6],[389,7],[751,6],[944,6],[1135,6],[1159,6]]},"73":{"position":[[2180,6]]},"82":{"position":[[45,6]]}}}],["result.label",{"_index":264,"t":{"21":{"position":[[909,12],[989,12],[1068,12]]}}}],["results",{"_index":138,"t":{"15":{"position":[[750,7]]},"17":{"position":[[241,8],[397,7]]},"21":{"position":[[105,7]]},"73":{"position":[[448,7],[536,7],[1789,7],[1979,7]]},"80":{"position":[[72,7],[149,7]]},"84":{"position":[[72,7],[157,7]]}}}],["ret",{"_index":966,"t":{"118":{"position":[[378,4],[419,4]]},"127":{"position":[[491,4],[532,4]]}}}],["retail",{"_index":1003,"t":{"121":{"position":[[62,6],[464,6],[1699,6]]}}}],["retailers",{"_index":1050,"t":{"121":{"position":[[1226,9],[1546,9]]}}}],["retrieve",{"_index":137,"t":{"15":{"position":[[737,8]]},"21":{"position":[[92,8],[783,8]]},"23":{"position":[[108,8],[376,8],[902,8]]}}}],["retrieves",{"_index":171,"t":{"17":{"position":[[383,9]]}}}],["retrieving",{"_index":164,"t":{"17":{"position":[[216,10],[507,10]]},"19":{"position":[[689,10],[1368,10]]},"21":{"position":[[7,10],[190,10]]}}}],["retry",{"_index":570,"t":{"55":{"position":[[36,5]]}}}],["return",{"_index":330,"t":{"27":{"position":[[545,6]]},"118":{"position":[[447,6],[516,6]]},"121":{"position":[[1666,6]]},"127":{"position":[[560,6],[629,6],[1300,6]]},"130":{"position":[[417,6]]}}}],["returned",{"_index":744,"t":{"73":{"position":[[2171,8],[2252,8]]}}}],["returning",{"_index":194,"t":{"19":{"position":[[327,9]]}}}],["returns",{"_index":187,"t":{"19":{"position":[[228,7],[453,7]]},"21":{"position":[[480,7]]}}}],["reverse",{"_index":427,"t":{"39":{"position":[[450,7],[658,7]]}}}],["review",{"_index":821,"t":{"91":{"position":[[314,7],[522,6]]}}}],["reviewer",{"_index":772,"t":{"82":{"position":[[94,8]]},"135":{"position":[[218,9]]}}}],["revoke",{"_index":881,"t":{"100":{"position":[[565,6]]},"110":{"position":[[29,6],[119,6]]}}}],["revoking",{"_index":925,"t":{"110":{"position":[[143,8],[335,8]]}}}],["revolutionize",{"_index":675,"t":{"71":{"position":[[86,13]]}}}],["rgb",{"_index":380,"t":{"35":{"position":[[173,3]]},"37":{"position":[[471,3]]},"39":{"position":[[341,3],[599,3],[638,3],[749,3]]}}}],["rgb_img",{"_index":436,"t":{"39":{"position":[[790,10]]}}}],["right",{"_index":823,"t":{"91":{"position":[[386,5]]}}}],["road",{"_index":483,"t":{"45":{"position":[[259,5],[295,4]]}}}],["robot",{"_index":168,"t":{"17":{"position":[[297,5]]}}}],["robotic",{"_index":637,"t":{"65":{"position":[[204,7]]},"69":{"position":[[85,7]]}}}],["robots",{"_index":623,"t":{"63":{"position":[[207,6]]},"69":{"position":[[117,7],[200,7]]}}}],["robust",{"_index":470,"t":{"43":{"position":[[156,6]]},"47":{"position":[[98,6]]},"59":{"position":[[230,6]]}}}],["role",{"_index":647,"t":{"67":{"position":[[58,4]]}}}],["rotate",{"_index":879,"t":{"100":{"position":[[533,6]]}}}],["routed",{"_index":1182,"t":{"135":{"position":[[172,6]]}}}],["rtsp",{"_index":50,"t":{"7":{"position":[[132,4]]},"189":{"position":[[62,4]]}}}],["run",{"_index":56,"t":{"7":{"position":[[182,3],[235,3]]},"25":{"position":[[118,3]]},"95":{"position":[[663,3]]},"118":{"position":[[1711,3]]},"127":{"position":[[3294,3]]},"155":{"position":[[42,3]]},"161":{"position":[[60,4]]},"165":{"position":[[472,3],[722,3]]},"175":{"position":[[42,3]]},"181":{"position":[[60,4]]},"183":{"position":[[74,3]]},"191":{"position":[[583,3]]},"199":{"position":[[42,3]]},"201":{"position":[[70,3],[81,3]]},"208":{"position":[[36,3]]},"222":{"position":[[42,3]]},"224":{"position":[[69,3],[80,3]]},"236":{"position":[[42,3]]},"242":{"position":[[66,4]]},"244":{"position":[[74,3]]}}}],["running",{"_index":317,"t":{"27":{"position":[[221,7]]},"121":{"position":[[1885,7]]},"163":{"position":[[325,7]]},"183":{"position":[[183,7]]},"203":{"position":[[37,7]]},"226":{"position":[[37,7]]},"244":{"position":[[128,7]]}}}],["runs",{"_index":307,"t":{"27":{"position":[[18,4]]}}}],["s",{"_index":1259,"t":{"163":{"position":[[270,1]]}}}],["sales",{"_index":1042,"t":{"121":{"position":[[1037,5],[1656,5]]}}}],["same",{"_index":163,"t":{"17":{"position":[[180,4]]},"76":{"position":[[139,4]]}}}],["sample",{"_index":28,"t":{"3":{"position":[[326,6]]},"9":{"position":[[57,6]]},"11":{"position":[[71,6]]},"15":{"position":[[1082,6]]},"37":{"position":[[266,6]]}}}],["satisfaction",{"_index":1057,"t":{"121":{"position":[[1424,13],[1577,12]]}}}],["save",{"_index":219,"t":{"19":{"position":[[850,4],[1322,4]]},"118":{"position":[[1663,4]]},"127":{"position":[[3244,4]]}}}],["saves",{"_index":402,"t":{"37":{"position":[[245,5]]}}}],["saw",{"_index":1183,"t":{"135":{"position":[[281,3]]}}}],["scene",{"_index":448,"t":{"39":{"position":[[987,5],[1157,6]]}}}],["scheduling",{"_index":1026,"t":{"121":{"position":[[549,11],[666,11]]}}}],["score",{"_index":698,"t":{"73":{"position":[[673,5],[2246,5]]}}}],["script",{"_index":848,"t":{"95":{"position":[[330,7]]},"118":{"position":[[96,6],[1672,6]]},"127":{"position":[[96,6],[3253,6]]}}}],["sdk",{"_index":180,"t":{"19":{"position":[[75,4]]},"21":{"position":[[74,4]]},"27":{"position":[[358,3]]},"29":{"position":[[29,3]]},"31":{"position":[[14,3]]},"33":{"position":[[16,3]]},"35":{"position":[[206,3]]},"37":{"position":[[16,3]]},"39":{"position":[[571,3]]},"43":{"position":[[48,4]]},"45":{"position":[[50,3]]},"47":{"position":[[34,4]]},"51":{"position":[[161,3]]},"59":{"position":[[342,4]]},"89":{"position":[[398,3]]},"95":{"position":[[24,4]]},"98":{"position":[[23,3]]},"102":{"position":[[31,3],[279,3]]},"114":{"position":[[12,3]]},"116":{"position":[[81,3]]},"123":{"position":[[12,3]]},"125":{"position":[[81,4]]},"130":{"position":[[409,3]]},"145":{"position":[[27,3],[149,3]]},"147":{"position":[[343,4]]},"149":{"position":[[49,3],[79,3]]},"153":{"position":[[144,4]]},"155":{"position":[[27,3],[232,3]]},"157":{"position":[[28,3]]},"159":{"position":[[39,3],[281,3]]},"167":{"position":[[48,3],[104,4]]},"169":{"position":[[49,3],[79,3]]},"173":{"position":[[144,4]]},"175":{"position":[[27,3],[232,3]]},"177":{"position":[[28,3]]},"179":{"position":[[39,3],[281,3]]},"185":{"position":[[48,3],[104,4]]},"193":{"position":[[49,3],[95,3]]},"197":{"position":[[151,4]]},"199":{"position":[[27,3],[187,3]]},"205":{"position":[[48,3],[104,4]]},"208":{"position":[[16,3],[100,3],[220,3]]},"210":{"position":[[104,3],[248,4]]},"212":{"position":[[72,3],[241,3]]},"216":{"position":[[49,3],[86,3]]},"220":{"position":[[150,4]]},"222":{"position":[[27,3],[187,3]]},"228":{"position":[[48,3],[104,4]]},"230":{"position":[[49,3],[81,3]]},"234":{"position":[[144,4]]},"236":{"position":[[27,3],[238,3]]},"238":{"position":[[28,3]]},"240":{"position":[[39,3],[281,3]]},"246":{"position":[[48,3],[104,4]]}}}],["seamless",{"_index":672,"t":{"69":{"position":[[340,8]]}}}],["seamlessly",{"_index":326,"t":{"27":{"position":[[456,10]]},"61":{"position":[[239,10]]}}}],["second=0",{"_index":1124,"t":{"127":{"position":[[1712,9],[2346,9]]}}}],["seconds",{"_index":245,"t":{"19":{"position":[[1419,7]]},"73":{"position":[[858,7],[1292,7]]}}}],["secret",{"_index":862,"t":{"98":{"position":[[287,6]]}}}],["section",{"_index":1241,"t":{"159":{"position":[[294,7]]},"179":{"position":[[294,7]]},"240":{"position":[[294,7]]}}}],["secure",{"_index":872,"t":{"100":{"position":[[334,6]]}}}],["securely",{"_index":909,"t":{"106":{"position":[[249,9]]}}}],["security",{"_index":850,"t":{"98":{"position":[[46,8]]},"100":{"position":[[116,8]]}}}],["see",{"_index":40,"t":{"5":{"position":[[37,3]]},"23":{"position":[[405,3]]},"41":{"position":[[66,3]]},"73":{"position":[[2227,3]]},"76":{"position":[[453,6]]},"95":{"position":[[68,3]]},"106":{"position":[[283,3]]},"108":{"position":[[32,3]]},"139":{"position":[[139,3]]},"161":{"position":[[89,3]]},"163":{"position":[[173,3]]},"181":{"position":[[89,3]]},"191":{"position":[[33,3],[818,3]]},"203":{"position":[[66,3]]},"226":{"position":[[64,3]]},"242":{"position":[[95,3]]},"250":{"position":[[457,3]]}}}],["seeedstudio",{"_index":1397,"t":{"254":{"position":[[292,11]]}}}],["semantics",{"_index":812,"t":{"89":{"position":[[507,9]]}}}],["semver",{"_index":811,"t":{"89":{"position":[[500,6]]}}}],["send",{"_index":384,"t":{"35":{"position":[[267,4],[480,4]]},"123":{"position":[[123,4]]},"127":{"position":[[662,4]]}}}],["send_email",{"_index":1156,"t":{"127":{"position":[[3223,10]]}}}],["send_email(sender",{"_index":1085,"t":{"127":{"position":[[769,18]]}}}],["send_email(sender=\"counterbot@example.com",{"_index":1149,"t":{"127":{"position":[[2740,43]]}}}],["sender",{"_index":1090,"t":{"127":{"position":[[850,6]]}}}],["sending",{"_index":428,"t":{"39":{"position":[[483,7],[691,7]]}}}],["sends",{"_index":84,"t":{"11":{"position":[[192,5]]}}}],["sense",{"_index":1201,"t":{"141":{"position":[[58,5]]},"254":{"position":[[312,5]]}}}],["separate",{"_index":170,"t":{"17":{"position":[[362,8]]}}}],["serial",{"_index":1377,"t":{"250":{"position":[[396,6],[556,7]]}}}],["server",{"_index":127,"t":{"15":{"position":[[501,6]]},"17":{"position":[[371,6]]},"27":{"position":[[136,7]]},"43":{"position":[[71,6]]},"45":{"position":[[983,6],[1022,6]]},"59":{"position":[[280,6]]},"127":{"position":[[939,6]]},"147":{"position":[[179,6]]},"191":{"position":[[245,6],[373,6]]}}}],["server.login(sender",{"_index":1098,"t":{"127":{"position":[[1004,20]]}}}],["server.quit",{"_index":1103,"t":{"127":{"position":[[1105,13]]}}}],["server.sendmail(sender",{"_index":1102,"t":{"127":{"position":[[1065,23]]}}}],["server.starttls",{"_index":1097,"t":{"127":{"position":[[986,17]]}}}],["service",{"_index":320,"t":{"27":{"position":[[290,8]]},"121":{"position":[[119,7],[224,7],[384,7],[600,7],[1143,7],[1362,7],[1469,7],[1784,7],[1981,7]]},"127":{"position":[[1506,7],[2831,7]]}}}],["service_counter_monitor.py",{"_index":1157,"t":{"127":{"position":[[3263,26],[3309,26]]}}}],["services",{"_index":853,"t":{"98":{"position":[[160,8]]},"191":{"position":[[172,9]]}}}],["set",{"_index":80,"t":{"11":{"position":[[110,3]]},"27":{"position":[[28,3]]},"73":{"position":[[584,3],[774,3],[1750,3]]},"95":{"position":[[190,3]]},"145":{"position":[[126,3]]}}}],["setting",{"_index":347,"t":{"29":{"position":[[226,7]]}}}],["settings",{"_index":451,"t":{"39":{"position":[[1066,9]]}}}],["share",{"_index":867,"t":{"100":{"position":[[88,5]]}}}],["short",{"_index":916,"t":{"108":{"position":[[195,6]]}}}],["side",{"_index":532,"t":{"45":{"position":[[1029,4]]}}}],["simple",{"_index":20,"t":{"3":{"position":[[232,6]]},"17":{"position":[[23,6]]},"73":{"position":[[24,6]]},"133":{"position":[[65,6]]}}}],["simply",{"_index":321,"t":{"27":{"position":[[325,6]]}}}],["single",{"_index":57,"t":{"7":{"position":[[196,6]]},"41":{"position":[[239,6]]}}}],["site",{"_index":485,"t":{"45":{"position":[[283,4]]}}}],["situations",{"_index":782,"t":{"86":{"position":[[109,10]]}}}],["size=(600",{"_index":410,"t":{"37":{"position":[[385,10]]}}}],["sky",{"_index":1200,"t":{"139":{"position":[[161,5]]}}}],["slack",{"_index":1384,"t":{"252":{"position":[[105,5]]}}}],["sleep",{"_index":224,"t":{"19":{"position":[[972,5],[1406,5]]},"118":{"position":[[1385,5]]}}}],["sleep(10",{"_index":244,"t":{"19":{"position":[[1394,9]]}}}],["slight",{"_index":1191,"t":{"137":{"position":[[80,6]]}}}],["small",{"_index":1333,"t":{"208":{"position":[[43,5]]}}}],["sms",{"_index":1382,"t":{"252":{"position":[[87,3]]}}}],["smtp",{"_index":1076,"t":{"123":{"position":[[108,4]]}}}],["smtplib",{"_index":1077,"t":{"127":{"position":[[185,7]]}}}],["smtplib.smtp('smtp.example.com",{"_index":1095,"t":{"127":{"position":[[948,32]]}}}],["snippet",{"_index":915,"t":{"108":{"position":[[175,7]]}}}],["solution",{"_index":1005,"t":{"121":{"position":[[79,9],[1716,9]]}}}],["something",{"_index":268,"t":{"21":{"position":[[948,9],[1027,9],[1111,9]]}}}],["sometimes",{"_index":445,"t":{"39":{"position":[[924,9]]},"212":{"position":[[417,9]]}}}],["somewhat",{"_index":1195,"t":{"139":{"position":[[17,8]]},"143":{"position":[[52,8]]}}}],["soon",{"_index":188,"t":{"19":{"position":[[239,4]]}}}],["sortable",{"_index":859,"t":{"98":{"position":[[258,8]]}}}],["sorting",{"_index":639,"t":{"65":{"position":[[242,8]]}}}],["sound",{"_index":942,"t":{"112":{"position":[[254,5]]},"114":{"position":[[101,5]]},"118":{"position":[[571,6],[1626,5]]}}}],["source",{"_index":793,"t":{"86":{"position":[[569,7]]},"189":{"position":[[40,6]]},"212":{"position":[[81,6]]},"254":{"position":[[122,6]]},"256":{"position":[[4,6]]}}}],["sources",{"_index":111,"t":{"15":{"position":[[205,7]]},"41":{"position":[[57,8],[209,8],[290,8]]}}}],["space",{"_index":1347,"t":{"212":{"position":[[21,5],[388,5]]}}}],["speakers",{"_index":944,"t":{"112":{"position":[[280,9]]}}}],["specific",{"_index":537,"t":{"49":{"position":[[15,8]]},"51":{"position":[[64,8]]},"121":{"position":[[898,8]]},"135":{"position":[[60,9]]},"137":{"position":[[18,8]]}}}],["specifically",{"_index":1351,"t":{"212":{"position":[[159,13]]}}}],["speed",{"_index":836,"t":{"93":{"position":[[109,5]]}}}],["spends",{"_index":198,"t":{"19":{"position":[[371,6]]}}}],["spills",{"_index":1207,"t":{"143":{"position":[[126,6]]}}}],["staff",{"_index":1024,"t":{"121":{"position":[[528,5],[645,5]]}}}],["standard",{"_index":90,"t":{"11":{"position":[[263,8]]},"37":{"position":[[77,8]]},"39":{"position":[[57,8]]},"210":{"position":[[34,8]]}}}],["standards",{"_index":391,"t":{"37":{"position":[[133,10]]},"67":{"position":[[95,9]]}}}],["stands",{"_index":340,"t":{"27":{"position":[[740,6]]}}}],["start",{"_index":778,"t":{"86":{"position":[[21,5]]},"147":{"position":[[286,5]]},"167":{"position":[[20,5]]},"185":{"position":[[20,5]]},"205":{"position":[[20,5]]},"228":{"position":[[20,5]]},"246":{"position":[[20,5]]}}}],["start_of_business",{"_index":1106,"t":{"127":{"position":[[1168,17],[1307,17]]}}}],["starting",{"_index":1243,"t":{"161":{"position":[[110,8]]},"181":{"position":[[110,8]]},"242":{"position":[[116,8]]}}}],["starts",{"_index":822,"t":{"91":{"position":[[371,6]]}}}],["status",{"_index":502,"t":{"45":{"position":[[564,6],[589,6],[629,6]]}}}],["step",{"_index":1213,"t":{"145":{"position":[[78,4],[86,4]]}}}],["steps",{"_index":1229,"t":{"153":{"position":[[100,5]]},"173":{"position":[[100,5]]},"197":{"position":[[107,5]]},"220":{"position":[[106,5]]},"234":{"position":[[100,5]]},"250":{"position":[[290,5]]}}}],["still",{"_index":280,"t":{"23":{"position":[[230,5],[1022,5]]},"41":{"position":[[106,5]]},"73":{"position":[[1930,5]]},"86":{"position":[[254,5]]},"165":{"position":[[13,5]]}}}],["storage",{"_index":417,"t":{"39":{"position":[[111,8]]}}}],["store",{"_index":871,"t":{"100":{"position":[[312,5],[408,5]]},"106":{"position":[[240,5],[318,5]]},"121":{"position":[[617,5],[1078,5],[1313,5],[1408,6],[1728,5],[1928,5],[2082,5]]}}}],["store's",{"_index":1049,"t":{"121":{"position":[[1210,7]]}}}],["stored",{"_index":376,"t":{"35":{"position":[[109,6],[148,6]]}}}],["storing",{"_index":887,"t":{"102":{"position":[[129,7]]}}}],["str",{"_index":749,"t":{"76":{"position":[[54,4],[66,4],[286,4],[298,4]]}}}],["stream",{"_index":44,"t":{"7":{"position":[[66,6]]},"118":{"position":[[672,6]]},"189":{"position":[[67,7]]}}}],["stream.close",{"_index":986,"t":{"118":{"position":[[912,14]]}}}],["stream.stop_stream",{"_index":985,"t":{"118":{"position":[[891,20]]}}}],["stream.write(data",{"_index":984,"t":{"118":{"position":[[844,18]]}}}],["stream:local",{"_index":60,"t":{"7":{"position":[[239,12]]}}}],["stream=true).raw",{"_index":711,"t":{"73":{"position":[[1138,17]]},"86":{"position":[[872,17]]}}}],["streaming",{"_index":1329,"t":{"201":{"position":[[140,9]]},"224":{"position":[[139,9]]}}}],["streamline",{"_index":643,"t":{"65":{"position":[[313,10]]}}}],["streams",{"_index":51,"t":{"7":{"position":[[137,7]]}}}],["strict",{"_index":655,"t":{"67":{"position":[[237,6]]}}}],["string",{"_index":863,"t":{"98":{"position":[[294,7]]}}}],["subject",{"_index":810,"t":{"89":{"position":[[447,7]]},"127":{"position":[[798,8],[895,7]]}}}],["subject=\"daily",{"_index":1151,"t":{"127":{"position":[[2816,14]]}}}],["subjective",{"_index":1206,"t":{"143":{"position":[[61,11]]}}}],["submit",{"_index":109,"t":{"15":{"position":[[172,6],[661,6],[703,6]]},"19":{"position":[[93,6],[1264,6]]},"23":{"position":[[9,6],[717,6]]}}}],["submit_image_query",{"_index":364,"t":{"33":{"position":[[54,19]]},"35":{"position":[[284,18]]},"73":{"position":[[1710,18]]},"82":{"position":[[182,20]]},"86":{"position":[[351,20]]}}}],["submits",{"_index":169,"t":{"17":{"position":[[318,7]]},"19":{"position":[[205,7]]},"118":{"position":[[1515,7]]},"127":{"position":[[2986,7]]}}}],["submitted",{"_index":189,"t":{"19":{"position":[[260,10]]},"21":{"position":[[134,9]]}}}],["submitting",{"_index":156,"t":{"17":{"position":[[44,10],[144,10],[480,10]]},"19":{"position":[[7,10],[553,10],[618,10],[1434,10]]},"23":{"position":[[146,10]]},"118":{"position":[[1314,10]]},"127":{"position":[[2040,10]]}}}],["subtle",{"_index":439,"t":{"39":{"position":[[845,6]]}}}],["such",{"_index":59,"t":{"7":{"position":[[219,4]]},"43":{"position":[[134,4]]},"49":{"position":[[65,4]]},"55":{"position":[[95,4]]},"63":{"position":[[89,4]]},"69":{"position":[[99,4]]},"100":{"position":[[351,4]]},"121":{"position":[[863,4]]},"208":{"position":[[66,5]]}}}],["sudo",{"_index":1251,"t":{"163":{"position":[[114,4],[130,4],[216,4],[257,4]]},"165":{"position":[[347,4],[388,4],[497,4],[669,4],[733,4]]}}}],["summaries",{"_index":1073,"t":{"121":{"position":[[1964,9]]}}}],["summary",{"_index":1019,"t":{"121":{"position":[[341,7]]},"127":{"position":[[2429,7],[3119,7]]}}}],["summary:\\n",{"_index":1146,"t":{"127":{"position":[[2657,11]]}}}],["supplies",{"_index":1365,"t":{"248":{"position":[[12,8]]}}}],["support",{"_index":1405,"t":{"256":{"position":[[313,7]]}}}],["supported",{"_index":950,"t":{"114":{"position":[[44,9]]},"121":{"position":[[1758,9]]},"123":{"position":[[44,9]]}}}],["supports",{"_index":1380,"t":{"250":{"position":[[543,8]]},"252":{"position":[[9,8]]}}}],["sure",{"_index":929,"t":{"110":{"position":[[278,4]]},"112":{"position":[[335,4]]}}}],["surprisingly",{"_index":438,"t":{"39":{"position":[[832,12]]}}}],["swapped",{"_index":442,"t":{"39":{"position":[[874,8]]}}}],["synchronously",{"_index":282,"t":{"23":{"position":[[296,13]]}}}],["system",{"_index":8,"t":{"3":{"position":[[78,6]]},"9":{"position":[[236,7]]},"11":{"position":[[148,7]]},"67":{"position":[[212,6]]},"73":{"position":[[690,6]]},"89":{"position":[[32,6]]},"91":{"position":[[359,6]]},"151":{"position":[[53,7]]},"153":{"position":[[57,7]]},"155":{"position":[[147,7]]},"161":{"position":[[236,7]]},"171":{"position":[[53,7]]},"173":{"position":[[57,7]]},"175":{"position":[[147,7]]},"181":{"position":[[236,7]]},"232":{"position":[[53,7]]},"234":{"position":[[57,7]]},"236":{"position":[[153,7]]},"242":{"position":[[242,7]]}}}],["systems",{"_index":600,"t":{"61":{"position":[[159,8]]},"65":{"position":[[71,7],[212,7]]},"91":{"position":[[570,7]]},"163":{"position":[[105,8],[207,8]]}}}],["take",{"_index":253,"t":{"21":{"position":[[247,4],[855,4]]}}}],["takes",{"_index":172,"t":{"17":{"position":[[409,5]]}}}],["targeted",{"_index":1037,"t":{"121":{"position":[[982,8]]}}}],["tasks",{"_index":613,"t":{"63":{"position":[[82,6],[291,5]]},"65":{"position":[[231,5]]}}}],["team",{"_index":1406,"t":{"256":{"position":[[321,5]]}}}],["technology",{"_index":603,"t":{"61":{"position":[[216,10]]},"63":{"position":[[30,10]]},"65":{"position":[[166,10]]},"67":{"position":[[30,10]]},"69":{"position":[[30,10],[226,10]]},"71":{"position":[[71,10]]},"93":{"position":[[25,10]]}}}],["tell",{"_index":1340,"t":{"208":{"position":[[349,4]]}}}],["temporary",{"_index":576,"t":{"55":{"position":[[180,9]]}}}],["tending",{"_index":612,"t":{"63":{"position":[[74,7],[283,7]]}}}],["terminal",{"_index":1231,"t":{"155":{"position":[[76,9]]},"161":{"position":[[47,8]]},"175":{"position":[[76,9]]},"181":{"position":[[47,8]]},"199":{"position":[[76,9]]},"222":{"position":[[76,9]]}}}],["tested",{"_index":1385,"t":{"254":{"position":[[0,6]]}}}],["testing",{"_index":955,"t":{"114":{"position":[[194,8]]}}}],["tests",{"_index":591,"t":{"59":{"position":[[6,5]]}}}],["text",{"_index":1100,"t":{"127":{"position":[[1042,4],[1099,5]]}}}],["textual",{"_index":497,"t":{"45":{"position":[[467,7]]}}}],["that's",{"_index":819,"t":{"91":{"position":[[154,6]]}}}],["they're",{"_index":1337,"t":{"208":{"position":[[294,7]]}}}],["thing",{"_index":1203,"t":{"141":{"position":[[111,7]]}}}],["things",{"_index":1273,"t":{"165":{"position":[[340,6]]}}}],["think",{"_index":449,"t":{"39":{"position":[[1015,5]]},"135":{"position":[[268,6]]}}}],["those",{"_index":555,"t":{"51":{"position":[[169,5]]},"91":{"position":[[112,5]]}}}],["thread",{"_index":159,"t":{"17":{"position":[[115,6],[185,6]]}}}],["threshold",{"_index":695,"t":{"73":{"position":[[606,9]]}}}],["thresholds",{"_index":791,"t":{"86":{"position":[[517,11]]}}}],["through",{"_index":937,"t":{"112":{"position":[[135,7]]},"187":{"position":[[108,7]]},"250":{"position":[[278,7]]}}}],["throughout",{"_index":1009,"t":{"121":{"position":[[148,10]]}}}],["time",{"_index":196,"t":{"19":{"position":[[353,4],[960,4]]},"39":{"position":[[287,4]]},"73":{"position":[[342,4]]},"86":{"position":[[1024,4]]},"91":{"position":[[303,4],[557,5]]},"93":{"position":[[162,4]]},"108":{"position":[[259,4]]},"118":{"position":[[162,4]]},"121":{"position":[[370,4]]},"127":{"position":[[162,4]]},"135":{"position":[[313,5]]}}}],["time.sleep(60",{"_index":998,"t":{"118":{"position":[[1426,14]]}}}],["time.sleep(delay",{"_index":1127,"t":{"127":{"position":[[1805,17],[1903,17],[2070,17],[2894,17]]}}}],["timedelta",{"_index":1079,"t":{"127":{"position":[[282,9]]}}}],["timedelta(hours=1",{"_index":1126,"t":{"127":{"position":[[1739,18],[2202,18]]}}}],["timer",{"_index":1394,"t":{"254":{"position":[[186,5],[235,5]]}}}],["times",{"_index":158,"t":{"17":{"position":[[96,5]]},"121":{"position":[[759,5],[878,5],[1522,5]]}}}],["tip",{"_index":720,"t":{"73":{"position":[[1458,3]]},"135":{"position":[[128,3]]}}}],["tmp/get",{"_index":1285,"t":{"165":{"position":[[653,8],[684,8]]}}}],["todo",{"_index":267,"t":{"21":{"position":[[939,5],[1018,5],[1102,5]]}}}],["token",{"_index":846,"t":{"95":{"position":[[166,6]]},"98":{"position":[[55,5],[83,7]]},"100":{"position":[[190,6]]},"102":{"position":[[53,6],[244,5],[319,5],[433,5],[562,5],[710,5]]},"106":{"position":[[98,6],[126,5],[203,7],[230,5]]},"108":{"position":[[105,5],[169,5],[229,5],[268,5]]},"110":{"position":[[11,5],[87,6],[130,6],[159,5],[322,5]]},"118":{"position":[[60,6]]},"127":{"position":[[60,6]]}}}],["tokens",{"_index":854,"t":{"98":{"position":[[190,6]]},"100":{"position":[[21,6],[149,7],[304,7],[322,6],[418,7],[525,7],[544,6]]},"102":{"position":[[141,6]]},"104":{"position":[[24,6],[110,7]]},"106":{"position":[[59,6],[343,7]]},"108":{"position":[[11,6],[59,7]]},"167":{"position":[[126,6]]},"185":{"position":[[126,6]]},"205":{"position":[[126,6]]},"228":{"position":[[126,6]]},"246":{"position":[[126,6]]}}}],["tool",{"_index":1366,"t":{"248":{"position":[[23,4]]},"250":{"position":[[5,4]]},"252":{"position":[[4,4]]}}}],["tools",{"_index":626,"t":{"63":{"position":[[237,5]]}}}],["topics",{"_index":36,"t":{"3":{"position":[[423,7]]}}}],["traceback",{"_index":479,"t":{"45":{"position":[[144,9],[399,9]]}}}],["traceback.print_exc",{"_index":494,"t":{"45":{"position":[[423,21]]}}}],["trade",{"_index":119,"t":{"15":{"position":[[390,5]]},"73":{"position":[[50,5]]}}}],["traffic",{"_index":1035,"t":{"121":{"position":[[936,8]]}}}],["trained",{"_index":693,"t":{"73":{"position":[[474,7]]},"91":{"position":[[87,7]]}}}],["training",{"_index":742,"t":{"73":{"position":[[2007,8]]}}}],["transforming",{"_index":595,"t":{"61":{"position":[[49,12]]}}}],["transient",{"_index":573,"t":{"55":{"position":[[77,9]]}}}],["trash",{"_index":713,"t":{"73":{"position":[[1214,5]]},"135":{"position":[[97,5]]}}}],["treat",{"_index":864,"t":{"100":{"position":[[11,5]]}}}],["trends",{"_index":1031,"t":{"121":{"position":[[792,7],[834,6]]}}}],["trivial",{"_index":1357,"t":{"212":{"position":[[307,7]]}}}],["troubleshoot",{"_index":130,"t":{"15":{"position":[[545,12]]}}}],["true",{"_index":234,"t":{"19":{"position":[[1139,5]]},"118":{"position":[[1051,5]]},"127":{"position":[[1764,5]]},"191":{"position":[[541,4]]}}}],["try",{"_index":480,"t":{"45":{"position":[[223,4]]},"118":{"position":[[1091,4]]},"127":{"position":[[1930,4]]},"208":{"position":[[378,3]]},"250":{"position":[[481,3]]}}}],["trying",{"_index":1187,"t":{"135":{"position":[[362,6]]}}}],["tuning",{"_index":721,"t":{"73":{"position":[[1462,6]]}}}],["twilio",{"_index":1383,"t":{"252":{"position":[[97,7]]}}}],["two",{"_index":175,"t":{"17":{"position":[[460,3]]}}}],["type",{"_index":400,"t":{"37":{"position":[[217,4]]}}}],["typically",{"_index":747,"t":{"76":{"position":[[0,9]]}}}],["ubuntu",{"_index":1249,"t":{"163":{"position":[[82,6],[160,6]]},"165":{"position":[[0,6],[211,6],[322,6]]}}}],["uint8",{"_index":398,"t":{"37":{"position":[[206,5]]}}}],["unambiguously",{"_index":1162,"t":{"130":{"position":[[101,13]]},"133":{"position":[[44,13]]}}}],["unauthorized",{"_index":511,"t":{"45":{"position":[[705,13]]}}}],["unchanged",{"_index":327,"t":{"27":{"position":[[471,9]]}}}],["unclear",{"_index":270,"t":{"21":{"position":[[1084,10]]},"23":{"position":[[197,7],[994,9]]}}}],["under",{"_index":72,"t":{"9":{"position":[[174,5]]}}}],["understand",{"_index":107,"t":{"15":{"position":[[135,10],[516,10]]}}}],["understanding",{"_index":1046,"t":{"121":{"position":[[1092,13]]}}}],["unified",{"_index":456,"t":{"41":{"position":[[6,7]]}}}],["unique",{"_index":917,"t":{"108":{"position":[[202,6]]}}}],["universal",{"_index":663,"t":{"69":{"position":[[107,9]]}}}],["unloading",{"_index":615,"t":{"63":{"position":[[109,9]]}}}],["unlocked",{"_index":87,"t":{"11":{"position":[[243,8]]}}}],["unrelated",{"_index":546,"t":{"49":{"position":[[188,9]]}}}],["unsure",{"_index":683,"t":{"73":{"position":[[217,6]]},"91":{"position":[[196,7]]},"130":{"position":[[183,8],[442,9]]}}}],["until",{"_index":715,"t":{"73":{"position":[[1276,5]]}}}],["up",{"_index":81,"t":{"11":{"position":[[114,2]]},"21":{"position":[[373,2]]},"73":{"position":[[849,2]]},"91":{"position":[[292,2]]},"145":{"position":[[130,2]]},"191":{"position":[[651,2]]}}}],["update",{"_index":271,"t":{"21":{"position":[[1149,6]]},"110":{"position":[[286,6]]},"163":{"position":[[123,6]]},"165":{"position":[[360,6],[502,6],[738,6]]}}}],["upgrade",{"_index":1230,"t":{"153":{"position":[[120,7]]},"159":{"position":[[15,7],[111,7],[172,7]]},"161":{"position":[[213,7]]},"173":{"position":[[120,7]]},"179":{"position":[[15,7],[111,7],[172,7]]},"181":{"position":[[213,7]]},"197":{"position":[[127,7]]},"220":{"position":[[126,7]]},"234":{"position":[[120,7]]},"240":{"position":[[15,7],[111,7],[172,7]]},"242":{"position":[[219,7]]}}}],["upgrading",{"_index":1239,"t":{"159":{"position":[[198,10]]},"163":{"position":[[285,10]]},"179":{"position":[[198,10]]},"183":{"position":[[143,10]]},"240":{"position":[[198,10]]},"244":{"position":[[88,10]]}}}],["upload",{"_index":1374,"t":{"250":{"position":[[299,6]]}}}],["url",{"_index":323,"t":{"27":{"position":[[389,3]]},"29":{"position":[[92,3]]}}}],["usage",{"_index":1006,"t":{"121":{"position":[[108,5],[578,5],[1456,5],[1997,5]]},"127":{"position":[[2847,5],[3144,5]]}}}],["usb",{"_index":53,"t":{"7":{"position":[[155,3]]},"41":{"position":[[310,3]]},"114":{"position":[[54,3]]},"123":{"position":[[54,3]]},"189":{"position":[[47,4]]},"250":{"position":[[261,3]]}}}],["use",{"_index":18,"t":{"3":{"position":[[216,3]]},"7":{"position":[[97,3]]},"15":{"position":[[289,3]]},"19":{"position":[[537,3],[1390,3]]},"21":{"position":[[218,3]]},"27":{"position":[[302,3],[365,3]]},"29":{"position":[[36,3]]},"39":{"position":[[337,3]]},"76":{"position":[[17,3],[256,3]]},"82":{"position":[[143,3]]},"98":{"position":[[3,3],[156,3]]},"100":{"position":[[107,3],[379,3]]},"112":{"position":[[45,3]]},"121":{"position":[[406,4],[1135,3],[1240,3]]},"127":{"position":[[1466,5],[2492,4]]},"155":{"position":[[173,3],[267,4]]},"157":{"position":[[81,3]]},"159":{"position":[[66,3],[217,3]]},"163":{"position":[[0,3]]},"165":{"position":[[202,3]]},"175":{"position":[[173,3],[267,4]]},"177":{"position":[[81,3]]},"179":{"position":[[66,3],[217,3]]},"183":{"position":[[85,3]]},"199":{"position":[[222,4]]},"208":{"position":[[80,3],[206,3],[279,3],[385,3]]},"214":{"position":[[186,3]]},"222":{"position":[[222,4]]},"236":{"position":[[179,3],[273,4]]},"238":{"position":[[81,3]]},"240":{"position":[[66,3],[217,3]]}}}],["used",{"_index":93,"t":{"13":{"position":[[19,4]]},"39":{"position":[[229,4]]},"108":{"position":[[240,5],[283,4]]},"121":{"position":[[969,4]]},"214":{"position":[[15,4]]}}}],["useful",{"_index":157,"t":{"17":{"position":[[85,6]]},"41":{"position":[[152,6]]},"210":{"position":[[174,7]]}}}],["user",{"_index":1292,"t":{"187":{"position":[[122,4]]}}}],["users",{"_index":586,"t":{"57":{"position":[[175,5]]}}}],["uses",{"_index":416,"t":{"39":{"position":[[84,4],[128,4]]},"165":{"position":[[19,4]]}}}],["using",{"_index":30,"t":{"3":{"position":[[352,5]]},"9":{"position":[[125,5]]},"15":{"position":[[591,5],[765,5],[1171,5]]},"17":{"position":[[231,5]]},"19":{"position":[[129,5],[823,5]]},"21":{"position":[[163,5]]},"23":{"position":[[323,5]]},"39":{"position":[[366,5]]},"59":{"position":[[320,5]]},"63":{"position":[[243,5]]},"69":{"position":[[299,5]]},"86":{"position":[[27,5]]},"93":{"position":[[72,5]]},"110":{"position":[[225,5]]},"118":{"position":[[317,5],[1476,5],[1632,5]]},"127":{"position":[[430,5],[2947,5],[3213,5]]},"147":{"position":[[321,5]]},"155":{"position":[[31,5],[125,5]]},"159":{"position":[[145,5]]},"165":{"position":[[92,5]]},"167":{"position":[[26,5],[94,5]]},"175":{"position":[[31,5],[125,5]]},"179":{"position":[[145,5]]},"185":{"position":[[26,5],[94,5]]},"199":{"position":[[31,5]]},"205":{"position":[[26,5],[94,5]]},"222":{"position":[[31,5]]},"228":{"position":[[26,5],[94,5]]},"236":{"position":[[31,5],[131,5]]},"240":{"position":[[145,5]]},"246":{"position":[[26,5],[94,5]]},"250":{"position":[[485,5]]}}}],["usr/bin/pip3",{"_index":1286,"t":{"165":{"position":[[768,13]]}}}],["usr/bin/python3",{"_index":1280,"t":{"165":{"position":[[532,16]]}}}],["usr/bin/python3.8",{"_index":1281,"t":{"165":{"position":[[557,18]]}}}],["utilities",{"_index":375,"t":{"35":{"position":[[56,9]]},"210":{"position":[[43,9]]}}}],["utilized",{"_index":1014,"t":{"121":{"position":[[246,8]]}}}],["uuid",{"_index":860,"t":{"98":{"position":[[267,5]]}}}],["v0.8",{"_index":381,"t":{"35":{"position":[[210,4]]},"39":{"position":[[547,4]]}}}],["valid",{"_index":800,"t":{"86":{"position":[[1003,5]]}}}],["values",{"_index":393,"t":{"37":{"position":[[150,6]]}}}],["variable",{"_index":350,"t":{"29":{"position":[[271,8]]},"95":{"position":[[232,8]]},"102":{"position":[[72,8],[167,8],[454,8]]}}}],["variables",{"_index":876,"t":{"100":{"position":[[395,9]]}}}],["various",{"_index":17,"t":{"3":{"position":[[208,7],[415,7]]},"15":{"position":[[28,7],[191,7]]},"61":{"position":[[266,7]]},"121":{"position":[[514,7]]},"145":{"position":[[156,7]]}}}],["vault",{"_index":875,"t":{"100":{"position":[[372,6]]}}}],["verify",{"_index":1242,"t":{"159":{"position":[[305,6]]},"163":{"position":[[296,6]]},"179":{"position":[[305,6]]},"183":{"position":[[154,6]]},"240":{"position":[[305,6]]},"244":{"position":[[99,6]]}}}],["version",{"_index":839,"t":{"95":{"position":[[45,7]]},"143":{"position":[[85,7]]},"157":{"position":[[64,8]]},"159":{"position":[[57,8],[285,8],[328,7]]},"161":{"position":[[31,8],[74,7],[95,7]]},"163":{"position":[[69,8],[314,7],[342,7],[363,8]]},"165":{"position":[[179,7]]},"177":{"position":[[64,8]]},"179":{"position":[[57,8],[285,8],[328,7]]},"181":{"position":[[31,8],[74,7],[95,7]]},"183":{"position":[[172,7],[200,7],[221,8]]},"199":{"position":[[129,7]]},"201":{"position":[[125,7]]},"210":{"position":[[315,7]]},"222":{"position":[[129,7]]},"224":{"position":[[124,7]]},"238":{"position":[[64,8]]},"240":{"position":[[57,8],[285,8],[328,7]]},"242":{"position":[[31,8],[80,7],[101,7]]},"244":{"position":[[117,7],[145,7],[166,8]]},"250":{"position":[[501,7]]}}}],["versions",{"_index":432,"t":{"39":{"position":[[589,9]]},"89":{"position":[[475,9]]}}}],["very",{"_index":446,"t":{"39":{"position":[[944,4]]},"86":{"position":[[71,4]]},"137":{"position":[[13,4]]},"210":{"position":[[149,4]]}}}],["via",{"_index":213,"t":{"19":{"position":[[729,3],[879,3]]},"21":{"position":[[424,3]]},"121":{"position":[[2019,3]]},"127":{"position":[[681,3]]}}}],["video",{"_index":464,"t":{"41":{"position":[[333,5]]},"189":{"position":[[34,5]]}}}],["view",{"_index":1070,"t":{"121":{"position":[[1818,4]]}}}],["visible",{"_index":334,"t":{"27":{"position":[[582,7]]},"143":{"position":[[118,7]]}}}],["vision",{"_index":4,"t":{"3":{"position":[[42,6]]},"9":{"position":[[109,6],[229,6]]},"13":{"position":[[72,6]]},"15":{"position":[[991,6],[1200,6]]},"61":{"position":[[39,6],[209,6]]},"63":{"position":[[23,6]]},"65":{"position":[[35,6]]},"67":{"position":[[23,6],[205,6]]},"69":{"position":[[23,6]]},"71":{"position":[[64,6]]},"89":{"position":[[25,6]]},"91":{"position":[[352,6]]}}}],["visit",{"_index":1055,"t":{"121":{"position":[[1352,5]]}}}],["visits",{"_index":1068,"t":{"121":{"position":[[1673,7]]}}}],["visual",{"_index":11,"t":{"3":{"position":[[111,6],[267,6]]},"15":{"position":[[1151,6]]},"93":{"position":[[82,6]]},"147":{"position":[[301,6]]}}}],["vital",{"_index":646,"t":{"67":{"position":[[52,5]]}}}],["voice",{"_index":947,"t":{"112":{"position":[[359,5]]}}}],["volumes",{"_index":1316,"t":{"191":{"position":[[546,8]]}}}],["wait",{"_index":190,"t":{"19":{"position":[[283,4]]},"73":{"position":[[108,4],[394,4],[844,4],[1271,4],[2070,4]]},"121":{"position":[[754,4],[1517,4]]}}}],["wait=0",{"_index":734,"t":{"73":{"position":[[1754,7],[2156,7]]}}}],["wait=60",{"_index":490,"t":{"45":{"position":[[354,8]]},"73":{"position":[[1404,8]]},"118":{"position":[[1155,8]]},"127":{"position":[[1994,8]]}}}],["want",{"_index":700,"t":{"73":{"position":[[766,4],[1694,4]]},"76":{"position":[[445,4]]},"82":{"position":[[21,4]]},"110":{"position":[[21,4],[111,4]]},"212":{"position":[[480,4]]},"214":{"position":[[178,4]]}}}],["warning",{"_index":559,"t":{"53":{"position":[[57,8]]}}}],["wave",{"_index":961,"t":{"118":{"position":[[258,4]]}}}],["wave.open(file_path",{"_index":975,"t":{"118":{"position":[[623,20]]}}}],["way",{"_index":152,"t":{"15":{"position":[[1126,3]]},"73":{"position":[[31,3],[433,4]]},"135":{"position":[[232,3]]},"187":{"position":[[20,3]]}}}],["ways",{"_index":885,"t":{"102":{"position":[[22,4]]},"121":{"position":[[522,5]]}}}],["we'll",{"_index":26,"t":{"3":{"position":[[298,5]]},"118":{"position":[[73,5]]},"127":{"position":[[73,5]]},"208":{"position":[[200,5],[319,5]]}}}],["we're",{"_index":1117,"t":{"127":{"position":[[1580,5]]}}}],["weather",{"_index":1198,"t":{"139":{"position":[[98,8]]}}}],["web",{"_index":844,"t":{"95":{"position":[[141,3]]},"187":{"position":[[118,3]]},"250":{"position":[[552,3]]}}}],["website",{"_index":900,"t":{"104":{"position":[[52,7]]},"183":{"position":[[62,7]]},"244":{"position":[[62,7]]}}}],["week",{"_index":1034,"t":{"121":{"position":[[919,4]]}}}],["welcome",{"_index":1211,"t":{"145":{"position":[[0,7]]}}}],["well",{"_index":151,"t":{"15":{"position":[[1113,4]]},"254":{"position":[[73,5]]}}}],["wf",{"_index":974,"t":{"118":{"position":[[618,2]]}}}],["wf.readframes(chunk",{"_index":983,"t":{"118":{"position":[[811,20],[870,20]]}}}],["what's",{"_index":1341,"t":{"208":{"position":[[358,6]]}}}],["whatever",{"_index":254,"t":{"21":{"position":[[283,8]]}}}],["whimsical",{"_index":930,"t":{"112":{"position":[[10,9]]}}}],["wifi",{"_index":69,"t":{"9":{"position":[[146,4]]}}}],["willing",{"_index":703,"t":{"73":{"position":[[833,7]]}}}],["windows",{"_index":1221,"t":{"147":{"position":[[109,7]]},"230":{"position":[[56,8]]}}}],["within",{"_index":674,"t":{"69":{"position":[[375,6]]}}}],["without",{"_index":454,"t":{"39":{"position":[[1126,7]]},"55":{"position":[[197,7]]},"91":{"position":[[397,7]]},"165":{"position":[[273,7]]},"208":{"position":[[104,7]]},"210":{"position":[[117,7]]},"212":{"position":[[88,7]]}}}],["won't",{"_index":910,"t":{"106":{"position":[[266,5]]}}}],["work",{"_index":325,"t":{"27":{"position":[[451,4]]},"41":{"position":[[121,4]]},"65":{"position":[[181,4]]},"210":{"position":[[112,4]]},"212":{"position":[[112,4]]},"254":{"position":[[65,4]]}}}],["workflows",{"_index":634,"t":{"65":{"position":[[119,10]]}}}],["working",{"_index":65,"t":{"9":{"position":[[98,7]]},"15":{"position":[[229,7]]},"35":{"position":[[70,7]]},"41":{"position":[[172,7]]},"47":{"position":[[5,7]]},"89":{"position":[[8,7]]},"91":{"position":[[378,7]]},"210":{"position":[[57,7]]}}}],["works",{"_index":592,"t":{"59":{"position":[[47,5]]}}}],["write",{"_index":590,"t":{"59":{"position":[[0,5]]},"118":{"position":[[79,5],[941,5]]},"127":{"position":[[79,5],[1359,5]]}}}],["written",{"_index":1399,"t":{"256":{"position":[[19,7]]}}}],["wrong",{"_index":447,"t":{"39":{"position":[[949,6]]},"208":{"position":[[365,5]]}}}],["x",{"_index":1396,"t":{"254":{"position":[[248,1]]}}}],["y",{"_index":1275,"t":{"165":{"position":[[410,1]]}}}],["yes",{"_index":265,"t":{"21":{"position":[[925,6]]},"86":{"position":[[977,6],[1033,5]]},"118":{"position":[[1202,6]]},"130":{"position":[[115,5],[424,5]]},"133":{"position":[[72,5]]},"137":{"position":[[38,5]]},"141":{"position":[[32,5]]}}}],["you'd",{"_index":758,"t":{"76":{"position":[[199,5]]},"86":{"position":[[172,5]]}}}],["you'll",{"_index":150,"t":{"15":{"position":[[1103,6]]},"76":{"position":[[10,6]]},"145":{"position":[[66,6]]},"147":{"position":[[267,6]]}}}],["you're",{"_index":702,"t":{"73":{"position":[[826,6]]},"155":{"position":[[113,6]]},"159":{"position":[[138,6]]},"161":{"position":[[168,6]]},"167":{"position":[[0,6]]},"175":{"position":[[113,6]]},"179":{"position":[[138,6]]},"181":{"position":[[168,6]]},"185":{"position":[[0,6]]},"205":{"position":[[0,6]]},"208":{"position":[[168,6]]},"228":{"position":[[0,6]]},"236":{"position":[[119,6]]},"240":{"position":[[138,6]]},"242":{"position":[[174,6]]},"246":{"position":[[0,6]]}}}],["you've",{"_index":752,"t":{"76":{"position":[[107,6]]}}}],["your_app.py",{"_index":353,"t":{"29":{"position":[[343,11]]}}}],["yourself",{"_index":1353,"t":{"212":{"position":[[227,9]]}}}]],"pipeline":["stemmer"]}}] \ No newline at end of file +[{"documents":[{"i":1,"t":"","u":"/python-sdk/docs/api-reference","b":["Docs"]},{"i":2,"t":"Building Applications","u":"/python-sdk/docs/building-applications","b":["Docs","Building Applications"]},{"i":8,"t":"Asynchronous Queries","u":"/python-sdk/docs/building-applications/async-queries","b":["Docs","Building Applications"]},{"i":16,"t":"Using Groundlight on the Edge","u":"/python-sdk/docs/building-applications/edge","b":["Docs","Building Applications"]},{"i":22,"t":"Handling Server Errors","u":"/python-sdk/docs/building-applications/handling-errors","b":["Docs","Building Applications"]},{"i":40,"t":"Grabbing Images","u":"/python-sdk/docs/building-applications/grabbing-images","b":["Docs","Building Applications"]},{"i":52,"t":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications/industrial","b":["Docs","Building Applications"]},{"i":64,"t":"Confidence Levels","u":"/python-sdk/docs/building-applications/managing-confidence","b":["Docs","Building Applications"]},{"i":66,"t":"Sample Applications","u":"/python-sdk/docs/building-applications/sample-applications","b":["Docs","Building Applications"]},{"i":76,"t":"Working with Detectors","u":"/python-sdk/docs/building-applications/working-with-detectors","b":["Docs","Building Applications"]},{"i":89,"t":"Getting Started","u":"/python-sdk/docs/getting-started","b":["Docs","Getting Started"]},{"i":98,"t":"API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","b":["Docs","Getting Started"]},{"i":113,"t":"A Quick Example: Live Stream Alert","u":"/python-sdk/docs/getting-started/streaming","b":["Docs","Getting Started"]},{"i":121,"t":"Installation","u":"/python-sdk/docs/installation","b":["Docs","Installation"]},{"i":125,"t":"Writing Queries","u":"/python-sdk/docs/getting-started/writing-queries","b":["Docs","Getting Started"]},{"i":141,"t":"Installing on Linux","u":"/python-sdk/docs/installation/linux","b":["Docs","Installation"]},{"i":161,"t":"A Serious Example: Retail Analytics","u":"/python-sdk/docs/getting-started/retail-analytics","b":["Docs","Getting Started"]},{"i":170,"t":"Monitoring Notification Server","u":"/python-sdk/docs/installation/monitoring-notification-server","b":["Docs","Installation"]},{"i":176,"t":"Installing on NVIDIA Jetson","u":"/python-sdk/docs/installation/nvidia-jetson","b":["Docs","Installation"]},{"i":190,"t":"A Fun Example: Dog-on-Couch Detector","u":"/python-sdk/docs/getting-started/dog-on-couch","b":["Docs","Getting Started"]},{"i":198,"t":"Installing on macOS","u":"/python-sdk/docs/installation/macos","b":["Docs","Installation"]},{"i":216,"t":"Optional libraries","u":"/python-sdk/docs/installation/optional-libraries","b":["Docs","Installation"]},{"i":225,"t":"Installing on Windows","u":"/python-sdk/docs/installation/windows","b":["Docs","Installation"]},{"i":243,"t":"No-Code IoT Deployment","u":"/python-sdk/docs/iot","b":["Docs"]},{"i":253,"t":"Installing on Raspberry Pi","u":"/python-sdk/docs/installation/raspberry-pi","b":["Docs","Installation"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[]],["t/2",[0,3.098,1,2.178]],["t/8",[2,3.098,3,2.543]],["t/16",[4,2.627,5,2.627,6,2.627]],["t/22",[7,2.627,8,2.157,9,2.627]],["t/40",[10,3.098,11,3.098]],["t/52",[1,1.847,12,2.627,13,2.627]],["t/64",[14,3.098,15,3.098]],["t/66",[1,2.178,16,3.098]],["t/76",[17,3.098,18,3.098]],["t/89",[19,3.098,20,3.098]],["t/98",[21,3.098,22,3.098]],["t/113",[23,2.015,24,1.417,25,2.015,26,2.015,27,2.015]],["t/121",[28,3.774]],["t/125",[3,2.543,29,3.098]],["t/141",[30,1.687,31,3.098]],["t/161",[24,1.603,32,2.281,33,2.281,34,2.281]],["t/170",[8,2.157,35,2.627,36,2.627]],["t/176",[30,1.431,37,2.627,38,2.627]],["t/190",[24,1.417,39,2.015,40,2.015,41,2.015,42,2.015]],["t/198",[30,1.687,43,3.098]],["t/216",[44,3.098,45,3.098]],["t/225",[30,1.687,46,3.098]],["t/243",[47,2.627,48,2.627,49,2.627]],["t/253",[30,1.431,50,2.627,51,2.627]]],"invertedIndex":[["alert",{"_index":27,"t":{"113":{"position":[[29,5]]}}}],["analytics",{"_index":34,"t":{"161":{"position":[[26,9]]}}}],["api",{"_index":21,"t":{"98":{"position":[[0,3]]}}}],["applications",{"_index":1,"t":{"2":{"position":[[9,12]]},"52":{"position":[[29,12]]},"66":{"position":[[7,12]]}}}],["asynchronous",{"_index":2,"t":{"8":{"position":[[0,12]]}}}],["building",{"_index":0,"t":{"2":{"position":[[0,8]]}}}],["code",{"_index":47,"t":{"243":{"position":[[3,4]]}}}],["confidence",{"_index":14,"t":{"64":{"position":[[0,10]]}}}],["couch",{"_index":41,"t":{"190":{"position":[[22,5]]}}}],["deployment",{"_index":49,"t":{"243":{"position":[[12,10]]}}}],["detector",{"_index":42,"t":{"190":{"position":[[28,8]]}}}],["detectors",{"_index":18,"t":{"76":{"position":[[13,9]]}}}],["dog",{"_index":40,"t":{"190":{"position":[[15,3]]}}}],["edge",{"_index":6,"t":{"16":{"position":[[25,4]]}}}],["errors",{"_index":9,"t":{"22":{"position":[[16,6]]}}}],["example",{"_index":24,"t":{"113":{"position":[[8,8]]},"161":{"position":[[10,8]]},"190":{"position":[[6,8]]}}}],["fun",{"_index":39,"t":{"190":{"position":[[2,3]]}}}],["getting",{"_index":19,"t":{"89":{"position":[[0,7]]}}}],["grabbing",{"_index":10,"t":{"40":{"position":[[0,8]]}}}],["groundlight",{"_index":5,"t":{"16":{"position":[[6,11]]}}}],["handling",{"_index":7,"t":{"22":{"position":[[0,8]]}}}],["images",{"_index":11,"t":{"40":{"position":[[9,6]]}}}],["industrial",{"_index":12,"t":{"52":{"position":[[0,10]]}}}],["installation",{"_index":28,"t":{"121":{"position":[[0,12]]}}}],["installing",{"_index":30,"t":{"141":{"position":[[0,10]]},"176":{"position":[[0,10]]},"198":{"position":[[0,10]]},"225":{"position":[[0,10]]},"253":{"position":[[0,10]]}}}],["iot",{"_index":48,"t":{"243":{"position":[[8,3]]}}}],["jetson",{"_index":38,"t":{"176":{"position":[[21,6]]}}}],["levels",{"_index":15,"t":{"64":{"position":[[11,6]]}}}],["libraries",{"_index":45,"t":{"216":{"position":[[9,9]]}}}],["linux",{"_index":31,"t":{"141":{"position":[[14,5]]}}}],["live",{"_index":25,"t":{"113":{"position":[[17,4]]}}}],["macos",{"_index":43,"t":{"198":{"position":[[14,5]]}}}],["manufacturing",{"_index":13,"t":{"52":{"position":[[15,13]]}}}],["monitoring",{"_index":35,"t":{"170":{"position":[[0,10]]}}}],["notification",{"_index":36,"t":{"170":{"position":[[11,12]]}}}],["nvidia",{"_index":37,"t":{"176":{"position":[[14,6]]}}}],["optional",{"_index":44,"t":{"216":{"position":[[0,8]]}}}],["pi",{"_index":51,"t":{"253":{"position":[[24,2]]}}}],["queries",{"_index":3,"t":{"8":{"position":[[13,7]]},"125":{"position":[[8,7]]}}}],["quick",{"_index":23,"t":{"113":{"position":[[2,5]]}}}],["raspberry",{"_index":50,"t":{"253":{"position":[[14,9]]}}}],["retail",{"_index":33,"t":{"161":{"position":[[19,6]]}}}],["sample",{"_index":16,"t":{"66":{"position":[[0,6]]}}}],["serious",{"_index":32,"t":{"161":{"position":[[2,7]]}}}],["server",{"_index":8,"t":{"22":{"position":[[9,6]]},"170":{"position":[[24,6]]}}}],["started",{"_index":20,"t":{"89":{"position":[[8,7]]}}}],["stream",{"_index":26,"t":{"113":{"position":[[22,6]]}}}],["tokens",{"_index":22,"t":{"98":{"position":[[4,6]]}}}],["using",{"_index":4,"t":{"16":{"position":[[0,5]]}}}],["windows",{"_index":46,"t":{"225":{"position":[[14,7]]}}}],["working",{"_index":17,"t":{"76":{"position":[[0,7]]}}}],["writing",{"_index":29,"t":{"125":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":4,"t":"Sample Applications","u":"/python-sdk/docs/building-applications","h":"#sample-applications","p":2},{"i":6,"t":"Further Reading","u":"/python-sdk/docs/building-applications","h":"#further-reading","p":2},{"i":10,"t":"Setup Submitting Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-submitting-machine","p":8},{"i":12,"t":"Setup Retrieving Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-retrieving-machine","p":8},{"i":14,"t":"Important Considerations","u":"/python-sdk/docs/building-applications/async-queries","h":"#important-considerations","p":8},{"i":18,"t":"How the Edge Endpoint works","u":"/python-sdk/docs/building-applications/edge","h":"#how-the-edge-endpoint-works","p":16},{"i":20,"t":"Configuring the Edge Endpoint","u":"/python-sdk/docs/building-applications/edge","h":"#configuring-the-edge-endpoint","p":16},{"i":24,"t":"Handling ApiException","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handling-apiexception","p":22},{"i":26,"t":"Best Practices for Handling Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#best-practices-for-handling-exceptions","p":22},{"i":28,"t":"Catch Specific Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#catch-specific-exceptions","p":22},{"i":30,"t":"Use Custom Exception Classes","u":"/python-sdk/docs/building-applications/handling-errors","h":"#use-custom-exception-classes","p":22},{"i":32,"t":"Log Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#log-exceptions","p":22},{"i":34,"t":"Implement Retry Logic","u":"/python-sdk/docs/building-applications/handling-errors","h":"#implement-retry-logic","p":22},{"i":36,"t":"Handle Exceptions Gracefully","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handle-exceptions-gracefully","p":22},{"i":38,"t":"Test Your Error Handling","u":"/python-sdk/docs/building-applications/handling-errors","h":"#test-your-error-handling","p":22},{"i":42,"t":"PIL","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#pil","p":40},{"i":44,"t":"OpenCV","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#opencv","p":40},{"i":46,"t":"Numpy","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#numpy","p":40},{"i":48,"t":"Channel order: BGR vs RGB","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#channel-order-bgr-vs-rgb","p":40},{"i":50,"t":"Framegrab","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#framegrab","p":40},{"i":54,"t":"Machine Tending","u":"/python-sdk/docs/building-applications/industrial","h":"#machine-tending","p":52},{"i":56,"t":"Process Automation","u":"/python-sdk/docs/building-applications/industrial","h":"#process-automation","p":52},{"i":58,"t":"Quality Control","u":"/python-sdk/docs/building-applications/industrial","h":"#quality-control","p":52},{"i":60,"t":"Integration with Cobots and CNC Machines","u":"/python-sdk/docs/building-applications/industrial","h":"#integration-with-cobots-and-cnc-machines","p":52},{"i":62,"t":"Contact Sales","u":"/python-sdk/docs/building-applications/industrial","h":"","p":52},{"i":68,"t":"Groundlight Stream Processor","u":"/python-sdk/docs/building-applications/sample-applications","h":"#groundlight-stream-processor","p":66},{"i":70,"t":"Arduino ESP32 Camera Sample App","u":"/python-sdk/docs/building-applications/sample-applications","h":"#arduino-esp32-camera-sample-app","p":66},{"i":72,"t":"Raspberry Pi","u":"/python-sdk/docs/building-applications/sample-applications","h":"#raspberry-pi","p":66},{"i":74,"t":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications/sample-applications","h":"#industrial-and-manufacturing-applications","p":66},{"i":77,"t":"Explicitly create a new detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#explicitly-create-a-new-detector","p":76},{"i":79,"t":"Retrieve an existing detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-existing-detector","p":76},{"i":81,"t":"List your detectors","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-detectors","p":76},{"i":83,"t":"Retrieve an image query","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-image-query","p":76},{"i":85,"t":"List your previous image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-previous-image-queries","p":76},{"i":87,"t":"Adding labels to existing image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#adding-labels-to-existing-image-queries","p":76},{"i":90,"t":"Computer Vision powered by Natural Language","u":"/python-sdk/docs/getting-started","h":"#computer-vision-powered-by-natural-language","p":89},{"i":92,"t":"How does it work?","u":"/python-sdk/docs/getting-started","h":"#how-does-it-work","p":89},{"i":94,"t":"Escalation Technology","u":"/python-sdk/docs/getting-started","h":"#escalation-technology","p":89},{"i":96,"t":"Building a simple visual application","u":"/python-sdk/docs/getting-started","h":"#building-a-simple-visual-application","p":89},{"i":99,"t":"About API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#about-api-tokens","p":98},{"i":101,"t":"Handling API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#handling-api-tokens","p":98},{"i":103,"t":"Using API Tokens with the SDK","u":"/python-sdk/docs/getting-started/api-tokens","h":"#using-api-tokens-with-the-sdk","p":98},{"i":105,"t":"Creating and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-and-revoking-api-tokens","p":98},{"i":107,"t":"Creating API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-api-tokens","p":98},{"i":109,"t":"Viewing and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#viewing-and-revoking-api-tokens","p":98},{"i":111,"t":"To revoke an API token","u":"/python-sdk/docs/getting-started/api-tokens","h":"#to-revoke-an-api-token","p":98},{"i":115,"t":"Requirements","u":"/python-sdk/docs/getting-started/streaming","h":"#requirements","p":113},{"i":117,"t":"Installation","u":"/python-sdk/docs/getting-started/streaming","h":"#installation","p":113},{"i":119,"t":"Creating the Application","u":"/python-sdk/docs/getting-started/streaming","h":"#creating-the-application","p":113},{"i":123,"t":"Platform-specific Installation Guides","u":"/python-sdk/docs/installation","h":"#platform-specific-installation-guides","p":121},{"i":126,"t":"Introduction","u":"/python-sdk/docs/getting-started/writing-queries","h":"#introduction","p":125},{"i":128,"t":"Examples","u":"/python-sdk/docs/getting-started/writing-queries","h":"#examples","p":125},{"i":129,"t":"✅ Are there any cardboard boxes on the conveyor belt?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-are-there-any-cardboard-boxes-on-the-conveyor-belt","p":125},{"i":131,"t":"🟡 Is the trash can full?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-trash-can-full","p":125},{"i":133,"t":"✅ Is the garage door completely closed?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-garage-door-completely-closed","p":125},{"i":135,"t":"🟡 Is the weather nice out?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-weather-nice-out","p":125},{"i":137,"t":"❌ Where is the thing?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-where-is-the-thing","p":125},{"i":139,"t":"🟡 Is the factory floor clean and organized?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-factory-floor-clean-and-organized","p":125},{"i":143,"t":"Prerequisites","u":"/python-sdk/docs/installation/linux","h":"#prerequisites","p":141},{"i":145,"t":"Basic Installation","u":"/python-sdk/docs/installation/linux","h":"#basic-installation","p":141},{"i":147,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#installing-groundlight-sdk","p":141},{"i":149,"t":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/linux","h":"#checking-groundlight-sdk-version","p":141},{"i":151,"t":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#upgrading-groundlight-sdk","p":141},{"i":153,"t":"Getting the right Python Version","u":"/python-sdk/docs/installation/linux","h":"#getting-the-right-python-version","p":141},{"i":155,"t":"Upgrading Python on Linux","u":"/python-sdk/docs/installation/linux","h":"#upgrading-python-on-linux","p":141},{"i":157,"t":"Special note about Ubuntu 18.04","u":"/python-sdk/docs/installation/linux","h":"#special-note-about-ubuntu-1804","p":141},{"i":159,"t":"Ready to go!","u":"/python-sdk/docs/installation/linux","h":"#ready-to-go","p":141},{"i":162,"t":"Tracking utilization of a customer service counter","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#tracking-utilization-of-a-customer-service-counter","p":161},{"i":164,"t":"Requirements","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#requirements","p":161},{"i":166,"t":"Installation","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#installation","p":161},{"i":168,"t":"Creating the Application","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#creating-the-application","p":161},{"i":172,"t":"Prerequisites","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#prerequisites","p":170},{"i":174,"t":"Deployment","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#deployment","p":170},{"i":178,"t":"Prerequisites","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#prerequisites","p":176},{"i":180,"t":"Basic Installation","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#basic-installation","p":176},{"i":182,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#installing-groundlight-sdk","p":176},{"i":184,"t":"Using RTSP Streams","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#using-rtsp-streams","p":176},{"i":186,"t":"Sample application","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#sample-application","p":176},{"i":188,"t":"Ready to go!","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#ready-to-go","p":176},{"i":192,"t":"Requirements","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#requirements","p":190},{"i":194,"t":"Installation","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#installation","p":190},{"i":196,"t":"Creating the Application","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#creating-the-application","p":190},{"i":200,"t":"Prerequisites","u":"/python-sdk/docs/installation/macos","h":"#prerequisites","p":198},{"i":202,"t":"Basic Installation","u":"/python-sdk/docs/installation/macos","h":"#basic-installation","p":198},{"i":204,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#installing-groundlight-sdk","p":198},{"i":206,"t":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/macos","h":"#checking-groundlight-sdk-version","p":198},{"i":208,"t":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#upgrading-groundlight-sdk","p":198},{"i":210,"t":"Getting the right Python Version","u":"/python-sdk/docs/installation/macos","h":"#getting-the-right-python-version","p":198},{"i":212,"t":"Upgrading Python on MacOS","u":"/python-sdk/docs/installation/macos","h":"#upgrading-python-on-macos","p":198},{"i":214,"t":"Ready to go!","u":"/python-sdk/docs/installation/macos","h":"#ready-to-go","p":198},{"i":217,"t":"Smaller is better!","u":"/python-sdk/docs/installation/optional-libraries","h":"#smaller-is-better","p":216},{"i":219,"t":"PIL - optional but default installed","u":"/python-sdk/docs/installation/optional-libraries","h":"#pil---optional-but-default-installed","p":216},{"i":221,"t":"Working without PIL","u":"/python-sdk/docs/installation/optional-libraries","h":"#working-without-pil","p":216},{"i":223,"t":"Numpy, OpenCV - fully optional","u":"/python-sdk/docs/installation/optional-libraries","h":"#numpy-opencv---fully-optional","p":216},{"i":227,"t":"Prerequisites","u":"/python-sdk/docs/installation/windows","h":"#prerequisites","p":225},{"i":229,"t":"Basic Installation","u":"/python-sdk/docs/installation/windows","h":"#basic-installation","p":225},{"i":231,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#installing-groundlight-sdk","p":225},{"i":233,"t":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/windows","h":"#checking-groundlight-sdk-version","p":225},{"i":235,"t":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#upgrading-groundlight-sdk","p":225},{"i":237,"t":"Getting the right Python Version","u":"/python-sdk/docs/installation/windows","h":"#getting-the-right-python-version","p":225},{"i":239,"t":"Upgrading Python on Windows","u":"/python-sdk/docs/installation/windows","h":"#upgrading-python-on-windows","p":225},{"i":241,"t":"Ready to go!","u":"/python-sdk/docs/installation/windows","h":"#ready-to-go","p":225},{"i":245,"t":"Easy Deployment","u":"/python-sdk/docs/iot","h":"#easy-deployment","p":243},{"i":247,"t":"Notification Options","u":"/python-sdk/docs/iot","h":"#notification-options","p":243},{"i":249,"t":"Multiple Supported Boards","u":"/python-sdk/docs/iot","h":"#multiple-supported-boards","p":243},{"i":251,"t":"Source Code","u":"/python-sdk/docs/iot","h":"#source-code","p":243},{"i":255,"t":"Prerequisites","u":"/python-sdk/docs/installation/raspberry-pi","h":"#prerequisites","p":253},{"i":257,"t":"Basic Installation","u":"/python-sdk/docs/installation/raspberry-pi","h":"#basic-installation","p":253},{"i":259,"t":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/raspberry-pi","h":"#installing-groundlight-sdk","p":253},{"i":261,"t":"Using RTSP Streams","u":"/python-sdk/docs/installation/raspberry-pi","h":"#using-rtsp-streams","p":253},{"i":263,"t":"Sample application","u":"/python-sdk/docs/installation/raspberry-pi","h":"#sample-application","p":253},{"i":265,"t":"Ready to go!","u":"/python-sdk/docs/installation/raspberry-pi","h":"#ready-to-go","p":253}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/4",[0,3.592,1,4.247]],["t/6",[2,4.816,3,4.816]],["t/10",[4,3.627,5,4.114,6,3.307]],["t/12",[4,3.627,6,3.307,7,4.114]],["t/14",[8,4.816,9,4.816]],["t/18",[10,3.627,11,3.627,12,4.114]],["t/20",[10,3.627,11,3.627,13,4.114]],["t/24",[14,3.592,15,4.816]],["t/26",[14,2.677,16,3.59,17,3.59,18,2.677]],["t/28",[18,3.068,19,4.114,20,3.627]],["t/30",[21,3.59,22,3.59,23,3.59,24,3.59]],["t/32",[18,3.592,25,4.816]],["t/34",[26,4.114,27,4.114,28,4.114]],["t/36",[18,3.068,29,4.114,30,4.114]],["t/38",[14,3.068,31,4.114,32,4.114]],["t/42",[33,4.669]],["t/44",[34,5.121]],["t/46",[35,5.121]],["t/48",[36,3.185,37,3.185,38,3.185,39,3.185,40,3.185]],["t/50",[41,5.808]],["t/54",[6,3.872,42,4.816]],["t/56",[43,4.816,44,4.816]],["t/58",[45,4.816,46,4.816]],["t/60",[47,3.59,48,3.59,49,3.59,50,3.59]],["t/62",[51,4.816,52,4.816]],["t/68",[53,2.096,54,4.114,55,4.114]],["t/70",[0,2.375,56,3.185,57,3.185,58,3.185,59,3.185]],["t/72",[60,4.816,61,4.816]],["t/74",[1,3.627,62,4.114,63,4.114]],["t/77",[64,3.59,65,3.59,66,3.59,67,3.166]],["t/79",[67,3.627,68,3.627,69,3.627]],["t/81",[70,4.247,71,4.816]],["t/83",[68,3.627,72,3.307,73,4.114]],["t/85",[70,3.166,72,2.886,74,3.59,75,3.166]],["t/87",[69,2.808,72,2.56,75,2.808,76,3.185,77,3.185]],["t/90",[78,3.185,79,3.185,80,3.185,81,3.185,82,3.185]],["t/92",[83,5.808]],["t/94",[84,4.816,85,4.816]],["t/96",[86,3.59,87,3.59,88,3.59,89,2.372]],["t/99",[90,3.023,91,3.182]],["t/101",[14,3.068,90,2.582,91,2.718]],["t/103",[90,2.253,91,2.372,92,2.886,93,1.829]],["t/105",[90,2.253,91,2.372,94,2.511,95,3.166]],["t/107",[90,2.582,91,2.718,94,2.877]],["t/109",[90,2.253,91,2.372,95,3.166,96,3.59]],["t/111",[90,2.582,97,4.114,98,4.114]],["t/115",[99,4.669]],["t/117",[100,3.327]],["t/119",[89,3.182,94,3.368]],["t/123",[20,3.166,100,2.057,101,3.59,102,3.59]],["t/126",[103,5.808]],["t/128",[104,5.808]],["t/129",[105,2.104,106,3.185,107,3.185,108,3.185,109,3.185]],["t/131",[105,2.718,110,4.114,111,4.114]],["t/133",[105,2.104,112,3.185,113,3.185,114,3.185,115,3.185]],["t/135",[105,2.372,116,3.59,117,3.59,118,3.59]],["t/137",[105,3.182,119,4.816]],["t/139",[105,2.104,120,3.185,121,3.185,122,3.185,123,3.185]],["t/143",[124,3.837]],["t/145",[100,2.759,125,3.368]],["t/147",[53,2.096,93,2.096,126,2.877]],["t/149",[53,1.829,93,1.829,127,2.886,128,2.372]],["t/151",[53,2.096,93,2.096,129,2.718]],["t/153",[128,2.372,130,2.886,131,2.886,132,2.372]],["t/155",[129,2.718,132,2.718,133,4.114]],["t/157",[134,3.59,135,3.59,136,3.59,137,3.59]],["t/159",[138,3.368,139,3.368]],["t/162",[140,3.185,141,3.185,142,3.185,143,3.185,144,3.185]],["t/164",[99,4.669]],["t/166",[100,3.327]],["t/168",[89,3.182,94,3.368]],["t/172",[124,3.837]],["t/174",[145,5.121]],["t/178",[124,3.837]],["t/180",[100,2.759,125,3.368]],["t/182",[53,2.096,93,2.096,126,2.877]],["t/184",[92,3.307,146,3.627,147,3.627]],["t/186",[0,3.592,89,3.182]],["t/188",[138,3.368,139,3.368]],["t/192",[99,4.669]],["t/194",[100,3.327]],["t/196",[89,3.182,94,3.368]],["t/200",[124,3.837]],["t/202",[100,2.759,125,3.368]],["t/204",[53,2.096,93,2.096,126,2.877]],["t/206",[53,1.829,93,1.829,127,2.886,128,2.372]],["t/208",[53,2.096,93,2.096,129,2.718]],["t/210",[128,2.372,130,2.886,131,2.886,132,2.372]],["t/212",[129,2.718,132,2.718,148,4.114]],["t/214",[138,3.368,139,3.368]],["t/217",[149,4.816,150,4.816]],["t/219",[33,2.886,151,3.166,152,3.59,153,3.59]],["t/221",[33,3.307,154,4.114,155,4.114]],["t/223",[34,3.166,35,3.166,151,3.166,156,3.59]],["t/227",[124,3.837]],["t/229",[100,2.759,125,3.368]],["t/231",[53,2.096,93,2.096,126,2.877]],["t/233",[53,1.829,93,1.829,127,2.886,128,2.372]],["t/235",[53,2.096,93,2.096,129,2.718]],["t/237",[128,2.372,130,2.886,131,2.886,132,2.372]],["t/239",[129,2.718,132,2.718,157,4.114]],["t/241",[138,3.368,139,3.368]],["t/245",[145,4.247,158,4.816]],["t/247",[159,4.816,160,4.816]],["t/249",[161,4.114,162,4.114,163,4.114]],["t/251",[164,4.816,165,4.816]],["t/255",[124,3.837]],["t/257",[100,2.759,125,3.368]],["t/259",[53,2.096,93,2.096,126,2.877]],["t/261",[92,3.307,146,3.627,147,3.627]],["t/263",[0,3.592,89,3.182]],["t/265",[138,3.368,139,3.368]]],"invertedIndex":[["",{"_index":105,"t":{"129":{"position":[[0,1]]},"131":{"position":[[0,2]]},"133":{"position":[[0,1]]},"135":{"position":[[0,2]]},"137":{"position":[[0,1]]},"139":{"position":[[0,2]]}}}],["18.04",{"_index":137,"t":{"157":{"position":[[26,5]]}}}],["adding",{"_index":76,"t":{"87":{"position":[[0,6]]}}}],["api",{"_index":90,"t":{"99":{"position":[[6,3]]},"101":{"position":[[9,3]]},"103":{"position":[[6,3]]},"105":{"position":[[22,3]]},"107":{"position":[[9,3]]},"109":{"position":[[21,3]]},"111":{"position":[[13,3]]}}}],["apiexception",{"_index":15,"t":{"24":{"position":[[9,12]]}}}],["app",{"_index":59,"t":{"70":{"position":[[28,3]]}}}],["application",{"_index":89,"t":{"96":{"position":[[25,11]]},"119":{"position":[[13,11]]},"168":{"position":[[13,11]]},"186":{"position":[[7,11]]},"196":{"position":[[13,11]]},"263":{"position":[[7,11]]}}}],["applications",{"_index":1,"t":{"4":{"position":[[7,12]]},"74":{"position":[[29,12]]}}}],["arduino",{"_index":56,"t":{"70":{"position":[[0,7]]}}}],["automation",{"_index":44,"t":{"56":{"position":[[8,10]]}}}],["basic",{"_index":125,"t":{"145":{"position":[[0,5]]},"180":{"position":[[0,5]]},"202":{"position":[[0,5]]},"229":{"position":[[0,5]]},"257":{"position":[[0,5]]}}}],["belt",{"_index":109,"t":{"129":{"position":[[48,5]]}}}],["best",{"_index":16,"t":{"26":{"position":[[0,4]]}}}],["better",{"_index":150,"t":{"217":{"position":[[11,7]]}}}],["bgr",{"_index":38,"t":{"48":{"position":[[15,3]]}}}],["boards",{"_index":163,"t":{"249":{"position":[[19,6]]}}}],["boxes",{"_index":107,"t":{"129":{"position":[[26,5]]}}}],["building",{"_index":86,"t":{"96":{"position":[[0,8]]}}}],["camera",{"_index":58,"t":{"70":{"position":[[14,6]]}}}],["cardboard",{"_index":106,"t":{"129":{"position":[[16,9]]}}}],["catch",{"_index":19,"t":{"28":{"position":[[0,5]]}}}],["channel",{"_index":36,"t":{"48":{"position":[[0,7]]}}}],["checking",{"_index":127,"t":{"149":{"position":[[0,8]]},"206":{"position":[[0,8]]},"233":{"position":[[0,8]]}}}],["classes",{"_index":24,"t":{"30":{"position":[[21,7]]}}}],["clean",{"_index":122,"t":{"139":{"position":[[24,5]]}}}],["closed",{"_index":115,"t":{"133":{"position":[[32,7]]}}}],["cnc",{"_index":49,"t":{"60":{"position":[[28,3]]}}}],["cobots",{"_index":48,"t":{"60":{"position":[[17,6]]}}}],["code",{"_index":165,"t":{"251":{"position":[[7,4]]}}}],["completely",{"_index":114,"t":{"133":{"position":[[21,10]]}}}],["computer",{"_index":78,"t":{"90":{"position":[[0,8]]}}}],["configuring",{"_index":13,"t":{"20":{"position":[[0,11]]}}}],["considerations",{"_index":9,"t":{"14":{"position":[[10,14]]}}}],["contact",{"_index":51,"t":{"62":{"position":[[0,7]]}}}],["control",{"_index":46,"t":{"58":{"position":[[8,7]]}}}],["conveyor",{"_index":108,"t":{"129":{"position":[[39,8]]}}}],["counter",{"_index":144,"t":{"162":{"position":[[43,7]]}}}],["create",{"_index":65,"t":{"77":{"position":[[11,6]]}}}],["creating",{"_index":94,"t":{"105":{"position":[[0,8]]},"107":{"position":[[0,8]]},"119":{"position":[[0,8]]},"168":{"position":[[0,8]]},"196":{"position":[[0,8]]}}}],["custom",{"_index":22,"t":{"30":{"position":[[4,6]]}}}],["customer",{"_index":142,"t":{"162":{"position":[[26,8]]}}}],["default",{"_index":152,"t":{"219":{"position":[[19,7]]}}}],["deployment",{"_index":145,"t":{"174":{"position":[[0,10]]},"245":{"position":[[5,10]]}}}],["detector",{"_index":67,"t":{"77":{"position":[[24,8]]},"79":{"position":[[21,8]]}}}],["detectors",{"_index":71,"t":{"81":{"position":[[10,9]]}}}],["door",{"_index":113,"t":{"133":{"position":[[16,4]]}}}],["easy",{"_index":158,"t":{"245":{"position":[[0,4]]}}}],["edge",{"_index":10,"t":{"18":{"position":[[8,4]]},"20":{"position":[[16,4]]}}}],["endpoint",{"_index":11,"t":{"18":{"position":[[13,8]]},"20":{"position":[[21,8]]}}}],["error",{"_index":32,"t":{"38":{"position":[[10,5]]}}}],["escalation",{"_index":84,"t":{"94":{"position":[[0,10]]}}}],["esp32",{"_index":57,"t":{"70":{"position":[[8,5]]}}}],["examples",{"_index":104,"t":{"128":{"position":[[0,8]]}}}],["exception",{"_index":23,"t":{"30":{"position":[[11,9]]}}}],["exceptions",{"_index":18,"t":{"26":{"position":[[28,10]]},"28":{"position":[[15,10]]},"32":{"position":[[4,10]]},"36":{"position":[[7,10]]}}}],["existing",{"_index":69,"t":{"79":{"position":[[12,8]]},"87":{"position":[[17,8]]}}}],["explicitly",{"_index":64,"t":{"77":{"position":[[0,10]]}}}],["factory",{"_index":120,"t":{"139":{"position":[[10,7]]}}}],["floor",{"_index":121,"t":{"139":{"position":[[18,5]]}}}],["framegrab",{"_index":41,"t":{"50":{"position":[[0,9]]}}}],["full",{"_index":111,"t":{"131":{"position":[[20,5]]}}}],["fully",{"_index":156,"t":{"223":{"position":[[16,5]]}}}],["further",{"_index":2,"t":{"6":{"position":[[0,7]]}}}],["garage",{"_index":112,"t":{"133":{"position":[[9,6]]}}}],["getting",{"_index":130,"t":{"153":{"position":[[0,7]]},"210":{"position":[[0,7]]},"237":{"position":[[0,7]]}}}],["go",{"_index":139,"t":{"159":{"position":[[9,3]]},"188":{"position":[[9,3]]},"214":{"position":[[9,3]]},"241":{"position":[[9,3]]},"265":{"position":[[9,3]]}}}],["gracefully",{"_index":30,"t":{"36":{"position":[[18,10]]}}}],["groundlight",{"_index":53,"t":{"68":{"position":[[0,11]]},"147":{"position":[[11,11]]},"149":{"position":[[9,11]]},"151":{"position":[[10,11]]},"182":{"position":[[11,11]]},"204":{"position":[[11,11]]},"206":{"position":[[9,11]]},"208":{"position":[[10,11]]},"231":{"position":[[11,11]]},"233":{"position":[[9,11]]},"235":{"position":[[10,11]]},"259":{"position":[[11,11]]}}}],["guides",{"_index":102,"t":{"123":{"position":[[31,6]]}}}],["handle",{"_index":29,"t":{"36":{"position":[[0,6]]}}}],["handling",{"_index":14,"t":{"24":{"position":[[0,8]]},"26":{"position":[[19,8]]},"38":{"position":[[16,8]]},"101":{"position":[[0,8]]}}}],["image",{"_index":72,"t":{"83":{"position":[[12,5]]},"85":{"position":[[19,5]]},"87":{"position":[[26,5]]}}}],["implement",{"_index":26,"t":{"34":{"position":[[0,9]]}}}],["important",{"_index":8,"t":{"14":{"position":[[0,9]]}}}],["industrial",{"_index":62,"t":{"74":{"position":[[0,10]]}}}],["installation",{"_index":100,"t":{"117":{"position":[[0,12]]},"123":{"position":[[18,12]]},"145":{"position":[[6,12]]},"166":{"position":[[0,12]]},"180":{"position":[[6,12]]},"194":{"position":[[0,12]]},"202":{"position":[[6,12]]},"229":{"position":[[6,12]]},"257":{"position":[[6,12]]}}}],["installed",{"_index":153,"t":{"219":{"position":[[27,9]]}}}],["installing",{"_index":126,"t":{"147":{"position":[[0,10]]},"182":{"position":[[0,10]]},"204":{"position":[[0,10]]},"231":{"position":[[0,10]]},"259":{"position":[[0,10]]}}}],["integration",{"_index":47,"t":{"60":{"position":[[0,11]]}}}],["introduction",{"_index":103,"t":{"126":{"position":[[0,12]]}}}],["labels",{"_index":77,"t":{"87":{"position":[[7,6]]}}}],["language",{"_index":82,"t":{"90":{"position":[[35,8]]}}}],["linux",{"_index":133,"t":{"155":{"position":[[20,5]]}}}],["list",{"_index":70,"t":{"81":{"position":[[0,4]]},"85":{"position":[[0,4]]}}}],["log",{"_index":25,"t":{"32":{"position":[[0,3]]}}}],["logic",{"_index":28,"t":{"34":{"position":[[16,5]]}}}],["machine",{"_index":6,"t":{"10":{"position":[[17,7]]},"12":{"position":[[17,7]]},"54":{"position":[[0,7]]}}}],["machines",{"_index":50,"t":{"60":{"position":[[32,8]]}}}],["macos",{"_index":148,"t":{"212":{"position":[[20,5]]}}}],["manufacturing",{"_index":63,"t":{"74":{"position":[[15,13]]}}}],["multiple",{"_index":161,"t":{"249":{"position":[[0,8]]}}}],["natural",{"_index":81,"t":{"90":{"position":[[27,7]]}}}],["new",{"_index":66,"t":{"77":{"position":[[20,3]]}}}],["nice",{"_index":117,"t":{"135":{"position":[[18,4]]}}}],["note",{"_index":135,"t":{"157":{"position":[[8,4]]}}}],["notification",{"_index":159,"t":{"247":{"position":[[0,12]]}}}],["numpy",{"_index":35,"t":{"46":{"position":[[0,5]]},"223":{"position":[[0,6]]}}}],["opencv",{"_index":34,"t":{"44":{"position":[[0,6]]},"223":{"position":[[7,6]]}}}],["optional",{"_index":151,"t":{"219":{"position":[[6,8]]},"223":{"position":[[22,8]]}}}],["options",{"_index":160,"t":{"247":{"position":[[13,7]]}}}],["order",{"_index":37,"t":{"48":{"position":[[8,6]]}}}],["organized",{"_index":123,"t":{"139":{"position":[[34,10]]}}}],["out",{"_index":118,"t":{"135":{"position":[[23,4]]}}}],["pi",{"_index":61,"t":{"72":{"position":[[10,2]]}}}],["pil",{"_index":33,"t":{"42":{"position":[[0,3]]},"219":{"position":[[0,3]]},"221":{"position":[[16,3]]}}}],["platform",{"_index":101,"t":{"123":{"position":[[0,8]]}}}],["powered",{"_index":80,"t":{"90":{"position":[[16,7]]}}}],["practices",{"_index":17,"t":{"26":{"position":[[5,9]]}}}],["prerequisites",{"_index":124,"t":{"143":{"position":[[0,13]]},"172":{"position":[[0,13]]},"178":{"position":[[0,13]]},"200":{"position":[[0,13]]},"227":{"position":[[0,13]]},"255":{"position":[[0,13]]}}}],["previous",{"_index":74,"t":{"85":{"position":[[10,8]]}}}],["process",{"_index":43,"t":{"56":{"position":[[0,7]]}}}],["processor",{"_index":55,"t":{"68":{"position":[[19,9]]}}}],["python",{"_index":132,"t":{"153":{"position":[[18,6]]},"155":{"position":[[10,6]]},"210":{"position":[[18,6]]},"212":{"position":[[10,6]]},"237":{"position":[[18,6]]},"239":{"position":[[10,6]]}}}],["quality",{"_index":45,"t":{"58":{"position":[[0,7]]}}}],["queries",{"_index":75,"t":{"85":{"position":[[25,7]]},"87":{"position":[[32,7]]}}}],["query",{"_index":73,"t":{"83":{"position":[[18,5]]}}}],["raspberry",{"_index":60,"t":{"72":{"position":[[0,9]]}}}],["reading",{"_index":3,"t":{"6":{"position":[[8,7]]}}}],["ready",{"_index":138,"t":{"159":{"position":[[0,5]]},"188":{"position":[[0,5]]},"214":{"position":[[0,5]]},"241":{"position":[[0,5]]},"265":{"position":[[0,5]]}}}],["requirements",{"_index":99,"t":{"115":{"position":[[0,12]]},"164":{"position":[[0,12]]},"192":{"position":[[0,12]]}}}],["retrieve",{"_index":68,"t":{"79":{"position":[[0,8]]},"83":{"position":[[0,8]]}}}],["retrieving",{"_index":7,"t":{"12":{"position":[[6,10]]}}}],["retry",{"_index":27,"t":{"34":{"position":[[10,5]]}}}],["revoke",{"_index":97,"t":{"111":{"position":[[3,6]]}}}],["revoking",{"_index":95,"t":{"105":{"position":[[13,8]]},"109":{"position":[[12,8]]}}}],["rgb",{"_index":40,"t":{"48":{"position":[[22,3]]}}}],["right",{"_index":131,"t":{"153":{"position":[[12,5]]},"210":{"position":[[12,5]]},"237":{"position":[[12,5]]}}}],["rtsp",{"_index":146,"t":{"184":{"position":[[6,4]]},"261":{"position":[[6,4]]}}}],["sales",{"_index":52,"t":{"62":{"position":[[8,5]]}}}],["sample",{"_index":0,"t":{"4":{"position":[[0,6]]},"70":{"position":[[21,6]]},"186":{"position":[[0,6]]},"263":{"position":[[0,6]]}}}],["sdk",{"_index":93,"t":{"103":{"position":[[26,3]]},"147":{"position":[[23,3]]},"149":{"position":[[21,3]]},"151":{"position":[[22,3]]},"182":{"position":[[23,3]]},"204":{"position":[[23,3]]},"206":{"position":[[21,3]]},"208":{"position":[[22,3]]},"231":{"position":[[23,3]]},"233":{"position":[[21,3]]},"235":{"position":[[22,3]]},"259":{"position":[[23,3]]}}}],["service",{"_index":143,"t":{"162":{"position":[[35,7]]}}}],["setup",{"_index":4,"t":{"10":{"position":[[0,5]]},"12":{"position":[[0,5]]}}}],["simple",{"_index":87,"t":{"96":{"position":[[11,6]]}}}],["smaller",{"_index":149,"t":{"217":{"position":[[0,7]]}}}],["source",{"_index":164,"t":{"251":{"position":[[0,6]]}}}],["special",{"_index":134,"t":{"157":{"position":[[0,7]]}}}],["specific",{"_index":20,"t":{"28":{"position":[[6,8]]},"123":{"position":[[9,8]]}}}],["stream",{"_index":54,"t":{"68":{"position":[[12,6]]}}}],["streams",{"_index":147,"t":{"184":{"position":[[11,7]]},"261":{"position":[[11,7]]}}}],["submitting",{"_index":5,"t":{"10":{"position":[[6,10]]}}}],["supported",{"_index":162,"t":{"249":{"position":[[9,9]]}}}],["technology",{"_index":85,"t":{"94":{"position":[[11,10]]}}}],["tending",{"_index":42,"t":{"54":{"position":[[8,7]]}}}],["test",{"_index":31,"t":{"38":{"position":[[0,4]]}}}],["thing",{"_index":119,"t":{"137":{"position":[[15,6]]}}}],["token",{"_index":98,"t":{"111":{"position":[[17,5]]}}}],["tokens",{"_index":91,"t":{"99":{"position":[[10,6]]},"101":{"position":[[13,6]]},"103":{"position":[[10,6]]},"105":{"position":[[26,6]]},"107":{"position":[[13,6]]},"109":{"position":[[25,6]]}}}],["tracking",{"_index":140,"t":{"162":{"position":[[0,8]]}}}],["trash",{"_index":110,"t":{"131":{"position":[[10,5]]}}}],["ubuntu",{"_index":136,"t":{"157":{"position":[[19,6]]}}}],["upgrading",{"_index":129,"t":{"151":{"position":[[0,9]]},"155":{"position":[[0,9]]},"208":{"position":[[0,9]]},"212":{"position":[[0,9]]},"235":{"position":[[0,9]]},"239":{"position":[[0,9]]}}}],["use",{"_index":21,"t":{"30":{"position":[[0,3]]}}}],["using",{"_index":92,"t":{"103":{"position":[[0,5]]},"184":{"position":[[0,5]]},"261":{"position":[[0,5]]}}}],["utilization",{"_index":141,"t":{"162":{"position":[[9,11]]}}}],["version",{"_index":128,"t":{"149":{"position":[[25,7]]},"153":{"position":[[25,7]]},"206":{"position":[[25,7]]},"210":{"position":[[25,7]]},"233":{"position":[[25,7]]},"237":{"position":[[25,7]]}}}],["viewing",{"_index":96,"t":{"109":{"position":[[0,7]]}}}],["vision",{"_index":79,"t":{"90":{"position":[[9,6]]}}}],["visual",{"_index":88,"t":{"96":{"position":[[18,6]]}}}],["vs",{"_index":39,"t":{"48":{"position":[[19,2]]}}}],["weather",{"_index":116,"t":{"135":{"position":[[10,7]]}}}],["windows",{"_index":157,"t":{"239":{"position":[[20,7]]}}}],["without",{"_index":155,"t":{"221":{"position":[[8,7]]}}}],["work",{"_index":83,"t":{"92":{"position":[[12,5]]}}}],["working",{"_index":154,"t":{"221":{"position":[[0,7]]}}}],["works",{"_index":12,"t":{"18":{"position":[[22,5]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Groundlight provides a powerful \"computer vision powered by natural language\" system that enables you to build visual applications with minimal code. With Groundlight, you can quickly create applications for various use cases, from simple object detection to complex visual analysis. In this page, we'll introduce you to some sample applications built using Groundlight and provide links to more detailed guides on various topics.","s":"Building Applications","u":"/python-sdk/docs/building-applications","h":"","p":2},{"i":5,"t":"Sample Applications: Find repositories with examples of applications built with Groundlight","s":"Sample Applications","u":"/python-sdk/docs/building-applications","h":"#sample-applications","p":2},{"i":7,"t":"For more in-depth guides on various aspects of building applications with Groundlight, check out the following pages: Grabbing images: Understand the intricacies of how to submit images from various input sources to Groundlight. Working with detectors: Learn how to create, configure, and use detectors in your Groundlight-powered applications. Confidence levels: Master how to control the trade-off of latency against accuracy by configuring the desired confidence level for your detectors. Handling server errors: Understand how to handle and troubleshoot HTTP errors that may occur while using Groundlight. Asynchronous queries: Groundlight makes it easy to submit asynchronous queries. Learn how to submit queries asynchronously and retrieve the results later. Using Groundlight on the edge: Discover how to deploy Groundlight in edge computing environments for improved performance and reduced latency. Industrial applications: Learn how to apply modern natural-language-based computer vision to your industrial and manufacturing applications. By exploring these resources and sample applications, you'll be well on your way to building powerful visual applications using Groundlight's computer vision and natural language capabilities.","s":"Further Reading","u":"/python-sdk/docs/building-applications","h":"#further-reading","p":2},{"i":9,"t":"Groundlight provides a simple interface for submitting asynchronous queries. This is useful for times in which the thread or process or machine submitting image queries is not the same thread or machine that will be retrieving and using the results. For example, you might have a forward deployed robot or camera that submits image queries to Groundlight, and a separate server that retrieves the results and takes action based on them. We will refer to these two machines as the submitting machine and the retrieving machine.","s":"Asynchronous Queries","u":"/python-sdk/docs/building-applications/async-queries","h":"","p":8},{"i":11,"t":"On the submitting machine, you will need to install the Groundlight Python SDK. Then you can submit image queries asynchronously using the ask_async interface (read the full documentation here). ask_async submits your query and returns as soon as the query is submitted. It does not wait for an answer to be available prior to returning to minimize the time your program spends interacting with Groundlight. As a result, the ImageQuery object ask_async returns lacks a result (the result field will be None). This is acceptable for this use case as the submitting machine is not interested in the result. Instead, the submitting machine just needs to communicate the ImageQuery.ids to the retrieving machine - this might be done via a database, a message queue, or some other mechanism. For this example, we assume you are using a database where you save the ImageQuery.id to it via db.save(image_query.id). from groundlight import Groundlight import cv2 from time import sleep detector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\") cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index) while True: _, image = cam.read() # Capture one frame from the camera image_query = gl.ask_async(detector=detector, image=image) # Submit the frame to Groundlight db.save(image_query.id) # Save the image_query.id to a database for the retrieving machine to use sleep(10) # Sleep for 10 seconds before submitting the next query cam.release() # Release the camera","s":"Setup Submitting Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-submitting-machine","p":8},{"i":13,"t":"On the retrieving machine you will need to install the Groundlight Python SDK. Then you can retrieve the results of the image queries submitted by another machine using get_image_query. The retrieving machine can then use the ImageQuery.result to take action based on the result for whatever application you are building. For this example, we assume your application looks up the next image query to process from a database via db.get_next_image_query_id() and that this function returns None once all ImageQuerys are processed. from groundlight import Groundlight detector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\") image_query_id = db.get_next_image_query_id() while image_query_id is not None: image_query = gl.get_image_query(id=image_query_id) # retrieve the image query from Groundlight result = image_query.result # take action based on the result of the image query if result.label == 'YES': pass # TODO: do something based on your application elif result.label == 'NO': pass # TODO: do something based on your application elif result.label == 'UNCLEAR': pass # TODO: do something based on your application # update image_query_id for next iteration of the loop image_query_id = db.get_next_image_query_id()","s":"Setup Retrieving Machine","u":"/python-sdk/docs/building-applications/async-queries","h":"#setup-retrieving-machine","p":8},{"i":15,"t":"When you submit an image query asynchronously, ML prediction on your query is not instant. So attempting to retrieve the result immediately after submitting an async query will likely result in an UNCLEAR result as Groundlight is still processing your query. Instead, if your code needs a result synchronously we recommend using one of our methods with a polling mechanism to retrieve the result. You can see all of the interfaces available in the documentation here. from groundlight import Groundlight from PIL import Image detector = gl.get_or_create_detector(name=\"your_detector_name\", query=\"your_query\") image = Image.open(\"/path/to/your/image.jpg\") image_query = gl.ask_async(detector=detector, image=image) # Submit async query to Groundlight result = image_query.result # This will always be 'None' as you asked asynchronously image_query = gl.get_image_query(id=image_query.id) # Immediately retrieve the image query from Groundlight result = image_query.result # This will likely be 'UNCLEAR' as Groundlight is still processing your query image_query = gl.wait_for_confident_result(id=image_query.id) # Poll for a confident result from Groundlight result = image_query.result","s":"Important Considerations","u":"/python-sdk/docs/building-applications/async-queries","h":"#important-considerations","p":8},{"i":17,"t":"If your account has access to edge models, you can download and install them to your edge devices. This allows you to run your model evaluations on the edge, reducing latency, cost, network bandwidth, and energy.","s":"Using Groundlight on the Edge","u":"/python-sdk/docs/building-applications/edge","h":"","p":16},{"i":19,"t":"The Edge Endpoint runs as a set of docker containers on an \"edge device\". This edge device can be an NVIDIA Jetson device, rack-mounted server, or even a Raspberry Pi. The Edge Endpoint is responsible for downloading and running the models, and for communicating with the Groundlight cloud service. To use the edge endpoint, simply configure the Groundlight SDK to use the edge endpoint's URL instead of the cloud endpoint. All application logic will work seamlessly and unchanged with the Groundlight Edge Endpoint, except some ML answers will return much faster locally. The only visible difference is that image queries answered at the edge endpoint will have the prefix iqe_ instead of iq_ for image queries answered in the cloud. iqe_ stands for \"image query edge\". Edge-originated image queries will not appear in the cloud dashboard.","s":"How the Edge Endpoint works","u":"/python-sdk/docs/building-applications/edge","h":"#how-the-edge-endpoint-works","p":16},{"i":21,"t":"To configure the Groundlight SDK to use the edge endpoint, you can either pass the endpoint URL to the Groundlight constructor like: from groundlight import Groundlight gl = Groundlight(endpoint=\"http://localhost:6717\") or by setting the GROUNDLIGHT_ENDPOINT environment variable like: export GROUNDLIGHT_ENDPOINT=http://localhost:6717 python your_app.py","s":"Configuring the Edge Endpoint","u":"/python-sdk/docs/building-applications/edge","h":"#configuring-the-edge-endpoint","p":16},{"i":23,"t":"When building applications with the Groundlight SDK, you may encounter server errors during API calls. This page covers how to handle such errors and build robust code that can gracefully handle exceptions.","s":"Handling Server Errors","u":"/python-sdk/docs/building-applications/handling-errors","h":"","p":22},{"i":25,"t":"If there is an HTTP error during an API call, the SDK will raise an ApiException. You can access different metadata from that exception: import traceback from groundlight import ApiException, Groundlight gl = Groundlight() try: d = gl.get_or_create_detector( \"Road Checker\", \"Is the site access road blocked?\") iq = gl.submit_image_query(d, get_image(), wait=60) except ApiException as e: # Print a traceback for debugging traceback.print_exc() # e.reason contains a textual description of the error print(f\"Error reason: {e.reason}\") # e.status contains the HTTP status code print(f\"HTTP status code: {e.status}\") # Common HTTP status codes: # 400 Bad Request: The request was invalid or malformed # 401 Unauthorized: Your GROUNDLIGHT_API_TOKEN is missing or invalid # 403 Forbidden: The request is not allowed due to insufficient permissions # 404 Not Found: The requested resource was not found # 429 Too Many Requests: The rate limit for the API has been exceeded # 500 Internal Server Error: An error occurred on the server side","s":"Handling ApiException","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handling-apiexception","p":22},{"i":27,"t":"When working with the Groundlight SDK, follow these best practices to handle exceptions and build robust code:","s":"Best Practices for Handling Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#best-practices-for-handling-exceptions","p":22},{"i":29,"t":"Catch only the specific exceptions that you expect to be raised, such as ApiException. Avoid catching broad exceptions like Exception, as it may make debugging difficult and obscure other unrelated issues.","s":"Catch Specific Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#catch-specific-exceptions","p":22},{"i":31,"t":"Consider creating custom exception classes for your application-specific errors. This can help you differentiate between errors originating from the Groundlight SDK and those from your application.","s":"Use Custom Exception Classes","u":"/python-sdk/docs/building-applications/handling-errors","h":"#use-custom-exception-classes","p":22},{"i":33,"t":"Log exceptions with appropriate log levels (e.g., error, warning, etc.) and include relevant context information. This will help you debug issues more effectively and monitor the health of your application.","s":"Log Exceptions","u":"/python-sdk/docs/building-applications/handling-errors","h":"#log-exceptions","p":22},{"i":35,"t":"When handling exceptions, implement retry logic with exponential backoff for transient errors, such as network issues or rate-limiting. This can help your application recover from temporary issues without manual intervention.","s":"Implement Retry Logic","u":"/python-sdk/docs/building-applications/handling-errors","h":"#implement-retry-logic","p":22},{"i":37,"t":"In addition to logging exceptions, handle them gracefully to ensure that your application remains functional despite errors. This might include displaying an error message to users or falling back to a default behavior.","s":"Handle Exceptions Gracefully","u":"/python-sdk/docs/building-applications/handling-errors","h":"#handle-exceptions-gracefully","p":22},{"i":39,"t":"Write tests to ensure that your error handling works as expected. This can help you catch issues early and ensure that your application can handle errors gracefully in production. By following these best practices, you can create robust and resilient applications that can handle server errors and other exceptions when using the Groundlight SDK.","s":"Test Your Error Handling","u":"/python-sdk/docs/building-applications/handling-errors","h":"#test-your-error-handling","p":22},{"i":41,"t":"Groundlight's SDK accepts images in many popular formats, including PIL, OpenCV, and numpy arrays.","s":"Grabbing Images","u":"/python-sdk/docs/building-applications/grabbing-images","h":"","p":40},{"i":43,"t":"The Groundlight SDK can accept PIL images directly in submit_image_query. Here's an example: from groundlight import Groundlight from PIL import Image gl = Groundlight() det = gl.get_or_create_detector(name=\"path-clear\", query=\"Is the path clear?\") pil_img = Image.open(\"./docs/static/img/doorway.jpg\") gl.submit_image_query(det, pil_img)","s":"PIL","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#pil","p":40},{"i":45,"t":"OpenCV is a popular image processing library, with many utilities for working with images. OpenCV images are stored as numpy arrays. (Note they are stored in BGR order, not RGB order, but as of Groundlight SDK v0.8 this is the expected order.) OpenCV's images can be send directly to submit_image_query as follows: import cv2 cam = cv2.VideoCapture(0) # Initialize camera (0 is the default index) _, frame = cam.read() # Capture one frame gl.submit_image_query(detector, frame) # Send the frame to Groundlight cam.release() # Release the camera","s":"OpenCV","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#opencv","p":40},{"i":47,"t":"The Groundlight SDK can accept images as numpy arrays. They should be in the standard HWN format in BGR color order, matching OpenCV standards. Pixel values should be from 0-255 (not 0.0-1.0 as floats). So uint8 data type is preferable since it saves memory. Here's sample code to create an 800x600 random image in numpy: import numpy as np np_img = np.random.uniform(low=0, high=255, size=(600, 800, 3)).astype(np.uint8) # Note: channel order is interpretted as BGR not RGB gl.submit_image_query(detector, np_img)","s":"Numpy","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#numpy","p":40},{"i":49,"t":"Groundlight expects images in BGR order, because this is standard for OpenCV, which uses numpy arrays as image storage. (OpenCV uses BGR because it was originally developed decades ago for compatibility with the BGR color format used by many cameras and image processing hardware at the time of its creation.) Most other image libraries use RGB order, so if you are using images as numpy arrays which did not originate from OpenCV you likely need to reverse the channel order before sending the images to Groundlight. Note this change was made in v0.8 of the Groundlight SDK - in previous versions, RGB order was expected. If you have an RGB array, you must reverse the channel order before sending it to Groundlight, like: # Convert numpy image in RGB channel order to BGR order bgr_img = rgb_img[:, :, ::-1] The difference can be surprisingly subtle when red and blue get swapped. Often images just look a little off, but sometimes they look very wrong. Here's an example of a natural-scene image where you might think the color balance is just off: In industrial settings, the difference can be almost impossible to detect without prior knowledge of the scene:","s":"Channel order: BGR vs RGB","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#channel-order-bgr-vs-rgb","p":40},{"i":51,"t":"For a unified interface to many different kinds of image sources, see the framegrab library. Framegrab is still an early work in progress, but has many useful features for working with cameras and other image sources. Framegrab provides a single interface for many different kinds of image sources, including: USB cameras IP cameras Video files Image files","s":"Framegrab","u":"/python-sdk/docs/building-applications/grabbing-images","h":"#framegrab","p":40},{"i":53,"t":"Modern natural language-based computer vision is transforming industrial and manufacturing applications by enabling more intuitive interaction with automation systems. Groundlight offers cutting-edge computer vision technology that can be seamlessly integrated into various industrial processes, enhancing efficiency, productivity, and quality control.","s":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications/industrial","h":"","p":52},{"i":55,"t":"Groundlight's computer vision technology can assist in automating machine-tending tasks, such as loading and unloading materials in CNC machines, milling centers, or injection molding equipment. By enabling robots to recognize parts and tools using natural language, complex machine-tending tasks become more accessible and efficient.","s":"Machine Tending","u":"/python-sdk/docs/building-applications/industrial","h":"#machine-tending","p":52},{"i":57,"t":"Integrating Groundlight's computer vision into your process automation systems can help identify bottlenecks, optimize workflows, and reduce manual intervention. Our technology can work hand-in-hand with robotic systems to perform tasks like sorting, assembly, all while interpreting natural language commands to streamline operations.","s":"Process Automation","u":"/python-sdk/docs/building-applications/industrial","h":"#process-automation","p":52},{"i":59,"t":"Groundlight's computer vision technology can play a vital role in ensuring the highest quality standards in your manufacturing processes. By identifying defects or irregularities in products, our computer vision system can help maintain strict quality control, reducing the need for manual inspections and increasing overall product quality.","s":"Quality Control","u":"/python-sdk/docs/building-applications/industrial","h":"#quality-control","p":52},{"i":61,"t":"Groundlight's computer vision technology can be easily integrated with popular cobot robotic arms, such as Universal Robots, to enhance their capabilities and improve collaboration between humans and robots. Additionally, our technology can be integrated into existing CNC machines or other devices using the Modbus interface, allowing for seamless communication and control within your manufacturing environment.","s":"Integration with Cobots and CNC Machines","u":"/python-sdk/docs/building-applications/industrial","h":"#integration-with-cobots-and-cnc-machines","p":52},{"i":63,"t":"To learn more about how Groundlight's natural language computer vision technology can revolutionize your industrial and manufacturing processes, please reach out to us at info@groundlight.ai.","s":"Contact Sales","u":"/python-sdk/docs/building-applications/industrial","h":"","p":52},{"i":65,"t":"Groundlight gives you a simple way to control the trade-off of latency against accuracy. The longer you can wait for an answer to your image query, the better accuracy you can get. In particular, if the ML models are unsure of the best response, they will escalate the image query to more intensive analysis with more complex models and real-time human monitors as needed. Your code can easily wait for this delayed response. Either way, these new results are automatically trained into your models so your next queries will get better results faster. The desired confidence level is set as the escalation threshold on your detector. This determines the minimum confidence score for the ML system to provide before the image query is escalated. For example, say you want to set your desired confidence level to 0.95, but that you're willing to wait up to 60 seconds to get a confident response. from groundlight import Groundlight from PIL import Image import requests gl = Groundlight() image_url = \"https://www.photos-public-domain.com/wp-content/uploads/2010/11/over_flowing_garbage_can.jpg\" image = Image.open(requests.get(image_url, stream=True).raw) d = gl.get_or_create_detector(name=\"trash\", query=\"Is the trash can full?\", confidence_threshold=0.95) # This will wait until either 60 seconds have passed or the confidence reaches 0.95 image_query = gl.submit_image_query(detector=d, image=image, wait=60) print(f\"The answer is {image_query.result}\") tip Tuning confidence lets you balance accuracy against latency. Higher confidence will get higher accuracy, but will generally require higher latency. Higher confidence also requires more labels, which increases labor costs. Or if you want to execute submit_image_query as fast as possible, set wait=0. You will either get the ML results or a placeholder response if the ML model hasn't finished executing. Image queries which are below the desired confidence level will still be escalated for further analysis, and the results are incorporated as training data to improve your ML model, but your code will not wait for that to happen. image_query = gl.submit_image_query(detector=d, image=image, wait=0) If the returned result was generated from an ML model, you can see the confidence score returned for the image query: print(f\"The confidence is {image_query.result.confidence}\")","s":"Confidence Levels","u":"/python-sdk/docs/building-applications/managing-confidence","h":"","p":64},{"i":67,"t":"Explore these GitHub repositories to see examples of Groundlight-powered applications:","s":"Sample Applications","u":"/python-sdk/docs/building-applications/sample-applications","h":"","p":66},{"i":69,"t":"Repository: https://github.com/groundlight/stream The Groundlight Stream Processor is an easy-to-use Docker container for analyzing RTSP streams or common USB-based cameras. You can run it with a single Docker command, such as: docker run stream:local --help","s":"Groundlight Stream Processor","u":"/python-sdk/docs/building-applications/sample-applications","h":"#groundlight-stream-processor","p":66},{"i":71,"t":"Repository: https://github.com/groundlight/esp32cam This sample application allows you to build a working AI vision detector using an inexpensive WiFi camera. With a cost of under $10, you can create a powerful and affordable AI vision system.","s":"Arduino ESP32 Camera Sample App","u":"/python-sdk/docs/building-applications/sample-applications","h":"#arduino-esp32-camera-sample-app","p":66},{"i":73,"t":"Repository: https://github.com/groundlight/raspberry-pi-door-lock This sample application demonstrates how to set up a Raspberry Pi-based door lock system. The application monitors a door and sends a notification if the door is observed to be unlocked during non-standard business hours.","s":"Raspberry Pi","u":"/python-sdk/docs/building-applications/sample-applications","h":"#raspberry-pi","p":66},{"i":75,"t":"Groundlight can be used to apply modern natural-language-based computer vision to industrial and manufacturing applications.","s":"Industrial and Manufacturing Applications","u":"/python-sdk/docs/building-applications/sample-applications","h":"#industrial-and-manufacturing-applications","p":66},{"i":78,"t":"Typically you'll use the get_or_create_detector(name: str, query: str) method to find an existing detector you've already created with the same name, or create a new one if it doesn't exists. But if you'd like to force creating a new detector you can also use the create_detector(name: str, query: str) method from groundlight import Groundlight gl = Groundlight() detector = gl.create_detector(name=\"your_detector_name\", query=\"is this what we want to see?\")","s":"Explicitly create a new detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#explicitly-create-a-new-detector","p":76},{"i":80,"t":"from groundlight import Groundlight gl = Groundlight() detector = gl.get_detector(id=\"YOUR_DETECTOR_ID\")","s":"Retrieve an existing detector","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-existing-detector","p":76},{"i":82,"t":"from groundlight import Groundlight gl = Groundlight() # Defaults to 10 results per page detectors = gl.list_detectors() # Pagination: 1st page of 5 results per page detectors = gl.list_detectors(page=1, page_size=5)","s":"List your detectors","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-detectors","p":76},{"i":84,"t":"In practice, you may want to check for a new result on your query. For example, after a cloud reviewer labels your query. For example, you can use the image_query.id after the above submit_image_query() call. from groundlight import Groundlight gl = Groundlight() image_query = gl.get_image_query(id=\"iq_YOUR_IMAGE_QUERY_ID\")","s":"Retrieve an image query","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#retrieve-an-image-query","p":76},{"i":86,"t":"from groundlight import Groundlight gl = Groundlight() # Defaults to 10 results per page image_queries = gl.list_image_queries() # Pagination: 1st page of 5 results per page image_queries = gl.list_image_queries(page=1, page_size=5)","s":"List your previous image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#list-your-previous-image-queries","p":76},{"i":88,"t":"Groundlight lets you start using models by making queries against your very first image, but there are a few situations where you might either have an existing dataset, or you'd like to handle the escalation response programatically in your own code but still include the label to get better responses in the future. With your image_query from either submit_image_query() or get_image_query() you can add the label directly. Note that if the query is already in the escalation queue due to low ML confidence or audit thresholds, it may also receive labels from another source. from groundlight import Groundlight from PIL import Image import requests gl = Groundlight() d = gl.get_or_create_detector(name=\"doorway\", query=\"Is the doorway open?\") image_url= \"https://images.selfstorage.com/large-compress/2174925f24362c479b2.jpg\" image = Image.open(requests.get(image_url, stream=True).raw) image_query = gl.submit_image_query(detector=d, image=image) gl.add_label(image_query, 'YES') # or 'NO' The only valid labels at this time are 'YES' and 'NO'.","s":"Adding labels to existing image queries","u":"/python-sdk/docs/building-applications/working-with-detectors","h":"#adding-labels-to-existing-image-queries","p":76},{"i":91,"t":"Build a working computer vision system in just a few lines of python: from groundlight import Groundlight gl = Groundlight() det = gl.get_or_create_detector(name=\"doorway\", query=\"Is the doorway open?\") img = \"./docs/static/img/doorway.jpg\" # Image can be a file or a Python object image_query = gl.submit_image_query(detector=det, image=img) print(f\"The answer is {image_query.result}\") Note: The SDK is currently in \"beta\" phase. Interfaces are subject to change in future versions. We will follow semver semantics for breaking changes.","s":"Computer Vision powered by Natural Language","u":"/python-sdk/docs/getting-started","h":"#computer-vision-powered-by-natural-language","p":89},{"i":93,"t":"Your images are first analyzed by machine learning (ML) models which are automatically trained on your data. If those models have high enough confidence, that's your answer. But if the models are unsure, then the images are progressively escalated to more resource-intensive analysis methods up to real-time human review. So what you get is a computer vision system that starts working right away without even needing to first gather and label a dataset. At first it will operate with high latency, because people need to review the image queries. But over time, the ML systems will learn and improve so queries come back faster with higher confidence.","s":"How does it work?","u":"/python-sdk/docs/getting-started","h":"#how-does-it-work","p":89},{"i":95,"t":"Groundlight's Escalation Technology combines the power of generative AI using our Visual LLM, along with the speed of edge computing, and the reliability of real-time human oversight.","s":"Escalation Technology","u":"/python-sdk/docs/getting-started","h":"#escalation-technology","p":89},{"i":97,"t":"Install the groundlight SDK. Requires python version 3.7 or higher. See prerequisites. pip3 install groundlight Head over to the groundlight web app to create an API token. You will need to set the GROUNDLIGHT_API_TOKEN environment variable to access the API. export GROUNDLIGHT_API_TOKEN=api_2GdXMflhJi6L_example Create a python script. ask.py from groundlight import Groundlight gl = Groundlight() det = gl.get_or_create_detector(name=\"doorway\", query=\"Is the doorway open?\") img = \"./docs/static/img/doorway.jpg\" # Image can be a file or a Python object image_query = gl.submit_image_query(detector=det, image=img) print(f\"The answer is {image_query.result}\") Run it! python ask.py","s":"Building a simple visual application","u":"/python-sdk/docs/getting-started","h":"#building-a-simple-visual-application","p":89},{"i":100,"t":"To use the Groundlight SDK or API, you need a security token which we call an \"API Token.\" These authenticate you to Groundlight and authorize your code to use services in your account. API tokens look like api_2GdXMflhJ... and consist of a ksuid (a kind of sortable UUID) followed by a secret string.","s":"About API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#about-api-tokens","p":98},{"i":102,"t":"You should treat API tokens like passwords. Never check them directly into your code or share them. Please use best security practices with your API tokens, because if anybody gets your API token, they have nearly full control over your Groundlight account. Here are some best practices for handling API tokens: Store API tokens in a secure location, such as an encrypted vault. Use environment variables to store API tokens, rather than hardcoding them in your application. Limit the number of people who have access to API tokens. Rotate API tokens regularly and revoke old ones when they are no longer needed.","s":"Handling API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#handling-api-tokens","p":98},{"i":104,"t":"There are a couple of ways the SDK can find your API token: Environment variable (recommended): As a best practice, we recommend storing API tokens in the environment variable GROUNDLIGHT_API_TOKEN. This helps avoid accidentally committing the token to your code repository. The SDK will automatically look for the API token there, so you don't have to put it in your code at all. from groundlight import Groundlight # looks for API token in environment variable GROUNDLIGHT_API_TOKEN gl = Groundlight() Constructor argument: Alternatively, you can pass the API token directly to the Groundlight constructor. However, be cautious not to commit this code to your repository. from groundlight import Groundlight token = get_token_from_secure_location() gl = Groundlight(api_token=token)","s":"Using API Tokens with the SDK","u":"/python-sdk/docs/getting-started/api-tokens","h":"#using-api-tokens-with-the-sdk","p":98},{"i":106,"t":"You can manage your API tokens from the Groundlight website at https://app.groundlight.ai/reef/my-account/api-tokens.","s":"Creating and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-and-revoking-api-tokens","p":98},{"i":108,"t":"Log in to your Groundlight account and navigate to the API tokens page. Click the \"Create New API Token\" button. Give the new token a descriptive name, so you can easily identify it later. Click \"Create Token.\" Copy the generated token and store it securely, as you won't be able to see it again. Groundlight does not store a copy of your API tokens.","s":"Creating API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#creating-api-tokens","p":98},{"i":110,"t":"On the API tokens page, you can see a list of your current tokens, along with the following information: Token Name: The descriptive name you assigned when creating the token Snippet (prefix): A short, unique identifier for each token Last used: The date and time the token was last used","s":"Viewing and Revoking API Tokens","u":"/python-sdk/docs/getting-started/api-tokens","h":"#viewing-and-revoking-api-tokens","p":98},{"i":112,"t":"Locate the token you want to revoke in the list. Click the \"Delete\" button next to the token. Confirm that you want to revoke the token. Note: Revoking an API token will immediately invalidate it and prevent any applications using it from accessing your Groundlight account. Be sure to update your applications with a new token before revoking an old one.","s":"To revoke an API token","u":"/python-sdk/docs/getting-started/api-tokens","h":"#to-revoke-an-api-token","p":98},{"i":114,"t":"A quick example to get used to setting up detectors and asking good questions: set up a monitor on a live stream.","s":"A Quick Example: Live Stream Alert","u":"/python-sdk/docs/getting-started/streaming","h":"","p":113},{"i":116,"t":"Groundlight SDK with Python 3.7 or higher The video ID of a YouTube live stream you'd like to monitor","s":"Requirements","u":"/python-sdk/docs/getting-started/streaming","h":"#requirements","p":113},{"i":118,"t":"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library: pip install groundlight pillow ffmpeg yt-dlp typer","s":"Installation","u":"/python-sdk/docs/getting-started/streaming","h":"#installation","p":113},{"i":120,"t":"Save this command as a shell script get_latest_frame.sh: #!/bin/bash ffmpeg -i \"$(yt-dlp -g $1 | head -n 1)\" -vframes 1 last.jpg -y This will download the most recent frame from a YouTube live stream and save it to a local file last.jpg. Log in to the Groundlight application and get an API Token. Next, we'll write the Python script for the application. import os import subprocess import typer from groundlight import Groundlight from PIL import Image def main(*, video_id: str = None, detector_name: str = None, query: str = None, confidence: float = 0.75, wait: int = 60): \"\"\" Run the script to get the stream's last frame as a subprocess, and submit result as an image query to a Groundlight detector :param video_id: Video ID of the YouTube live stream (the URLs have the form https://www.youtube.com/watch?v=) :param detector_name: Name for your Groundlight detector :param query: Question you want to ask of the stream (we will alert on the answer of NO) \"\"\" gl = Groundlight() detector = gl.create_detector(name=detector_name, query=query, confidence_threshold=confidence) while True: p = subprocess.run([\"./get_latest_frame.sh\", video_id]) if p.returncode != 0: raise RuntimeError(f\"Could not get image from video ID: {video_id}. Process exited with return code {p.returncode}.\") image = Image.open(\"last.jpg\").convert(\"RGB\") response = gl.submit_image_query(detector=detector, image=image, wait=wait) if response.result.label == \"NO\": os.system(\"say 'Alert!'\") # this may not work on all operating systems if __name__ == \"__main__\": typer.run(main) Save the script as streaming_alert.py in the same directory as get_latest_frame.sh above and run it: python streaming_alert.py --detector_name --query ","s":"Creating the Application","u":"/python-sdk/docs/getting-started/streaming","h":"#creating-the-application","p":113},{"i":122,"t":"Welcome to the Groundlight SDK installation guide. In this guide, you'll find step-by-step instructions on how to install and set up the Groundlight SDK on various platforms.","s":"Installation","u":"/python-sdk/docs/installation","h":"","p":121},{"i":124,"t":"Choose your platform from the list below and follow the instructions in the corresponding guide: Linux macOS Windows Raspberry Pi NVIDIA Jetson Linux with Monitoring Notification Server ESP32 Camera Device After completing the installation process for your platform, you'll be ready to start building visual applications using the Groundlight SDK.","s":"Platform-specific Installation Guides","u":"/python-sdk/docs/installation","h":"#platform-specific-installation-guides","p":121},{"i":127,"t":"With Groundlight's detectors, you can ask binary questions about images — i.e., the answer should be unambiguously \"YES\" or \"NO\". If you ask an ambiguous question, you may receive an \"UNSURE\" response. detector = gl.get_or_create_detector( name=\"Conveyor belt boxes\", query=\"Are there any cardboard boxes on the conveyor belt?\" ) image_query = gl.submit_image_query(detector=detector, image=some_image) # The SDK can return \"YES\" or \"NO\" (or \"UNSURE\") print(f\"The answer is {image_query.result.label}\") So, what makes a good question? Let's look at a few good ✅, moderate 🟡, and bad ❌ examples!","s":"Introduction","u":"/python-sdk/docs/getting-started/writing-queries","h":"#introduction","p":125},{"i":130,"t":"This question is binary and can be answered unambiguously with a simple \"YES\" or \"NO\" based on the image content.","s":"✅ Are there any cardboard boxes on the conveyor belt?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-are-there-any-cardboard-boxes-on-the-conveyor-belt","p":125},{"i":132,"t":"This question is okay, but it could be rephrased to be more specific. For example, \"Is the black trash can more than 80% full?\" tip With Groundlight, your questions may be routed to a machine learning model or a human reviewer. One way to improve your questions is to think, \"If I saw this question for the first time, would I know precisely what the person was trying to convey?\"","s":"🟡 Is the trash can full?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-trash-can-full","p":125},{"i":134,"t":"The query is very specific about what \"YES\" means. According to this query, any slight / partial opening would be considered \"NO\".","s":"✅ Is the garage door completely closed?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-garage-door-completely-closed","p":125},{"i":136,"t":"This question is somewhat ambiguous. Different people may have different opinions on what is nice weather. Instead, you might ask \"Can you see any clouds in the sky?\"","s":"🟡 Is the weather nice out?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-weather-nice-out","p":125},{"i":138,"t":"This is not a binary question — \"YES\" and \"NO\" don't make sense in this context. Also, it's not clear what the \"thing\" refers to.","s":"❌ Where is the thing?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-where-is-the-thing","p":125},{"i":140,"t":"While this question is binary, \"cleanliness\" can be somewhat subjective. An improved version could be: \"Are there any visible spills or clutter on the factory floor?\"","s":"🟡 Is the factory floor clean and organized?","u":"/python-sdk/docs/getting-started/writing-queries","h":"#-is-the-factory-floor-clean-and-organized","p":125},{"i":142,"t":"This guide will help you install the Groundlight SDK on Linux. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on Linux","u":"/python-sdk/docs/installation/linux","h":"","p":141},{"i":144,"t":"Ensure that you have the following installed on your system: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/linux","h":"#prerequisites","p":141},{"i":146,"t":"Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/linux","h":"#basic-installation","p":141},{"i":148,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip install groundlight If you're also using python2 on your system, you might need to use pip3 instead: pip3 install groundlight The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#installing-groundlight-sdk","p":141},{"i":150,"t":"To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner: python -c \"import groundlight; print(groundlight.__version__)\"","s":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/linux","h":"#checking-groundlight-sdk-version","p":141},{"i":152,"t":"If you need to upgrade the Groundlight SDK to the latest version, use the following pip command: pip install --upgrade groundlight Or, if you're using pip3: pip3 install --upgrade groundlight After upgrading, you can use the Python one-liner mentioned in the \"Checking Groundlight SDK Version\" section to verify that the latest version is now installed.","s":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/linux","h":"#upgrading-groundlight-sdk","p":141},{"i":154,"t":"To check your installed Python version, open a terminal and run: python --version If you see a version number starting with \"3.7\" or higher (e.g., \"3.7.5\" or \"3.9.0\"), you're good to go. If not, you might need to upgrade Python on your system.","s":"Getting the right Python Version","u":"/python-sdk/docs/installation/linux","h":"#getting-the-right-python-version","p":141},{"i":156,"t":"Use your distribution's package manager to install the latest Python version: For Ubuntu or Debian-based systems: sudo apt update sudo apt install python3 (For Ubuntu 18.04 see note below.) For Fedora-based systems: sudo dnf install python3 For Arch Linux: sudo pacman -S python After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.","s":"Upgrading Python on Linux","u":"/python-sdk/docs/installation/linux","h":"#upgrading-python-on-linux","p":141},{"i":158,"t":"Ubuntu 18.04 still uses python 3.6 by default, which is end-of-life. We generally recommend using python 3.10. If you know how to install py3.10, please go ahead. But the easiest version of python 3 to use with Ubuntu 18.04 is python 3.8, which can be installed as follows without adding any extra repositories: # Prepare Ubuntu to install things sudo apt-get update # Install the basics sudo apt-get install -y python3.8 python3.8-distutils curl # Configure `python3` to run python3.8 by default sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 10 # Download and install pip3.8 curl https://bootstrap.pypa.io/get-pip.py > /tmp/get-pip.py sudo python3.8 /tmp/get-pip.py # Configure `pip3` to run pip3.8 sudo update-alternatives --install /usr/bin/pip3 pip3 $(which pip3.8) 10 # Now we can install Groundlight! pip3 install groundlight","s":"Special note about Ubuntu 18.04","u":"/python-sdk/docs/installation/linux","h":"#special-note-about-ubuntu-1804","p":141},{"i":160,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/linux","h":"#ready-to-go","p":141},{"i":163,"t":"This example demonstrates the application of Groundlight to a retail analytics solution, which monitors the usage of a service counter by customers throughout the day. The application creates a detector to identify when the service desk is being utilized by a customer. It checks the detector every minute, and once an hour, it prints out a summary of the percentage of time that the service counter is in use. At the end of the day, it emails the daily log. This retail analytics application can be beneficial in various ways: Staff allocation and scheduling: By analyzing the usage patterns of the service counter, store managers can optimize staff allocation and scheduling, ensuring that enough employees are available during peak hours and reducing wait times for customers. Identifying trends: The application can help identify trends in customer behavior, such as busier times of the day or specific days of the week with higher traffic. This information can be used to plan targeted marketing campaigns or promotions to increase sales and customer engagement. Improving store layout: Understanding when and how often customers use the service counter can provide insights into the effectiveness of the store's layout. Retailers can use this information to make data-driven decisions about rearranging the store layout to encourage customers to visit the service counter or explore other areas of the store. Customer satisfaction: By monitoring the usage of the service counter and proactively addressing long wait times or crowded areas, retailers can improve customer satisfaction and loyalty. A positive customer experience can lead to increased sales and return visits. To implement this retail analytics solution, a store would need to install a supported camera near the service counter, ensuring a clear view of the area. The camera would then be connected to a computer running the Groundlight-based application. Store managers would receive hourly summaries of the service counter usage and a daily log via email, enabling them to make informed decisions to improve store operations and customer experience.","s":"Tracking utilization of a customer service counter","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#tracking-utilization-of-a-customer-service-counter","p":161},{"i":165,"t":"Groundlight SDK with Python 3.7 or higher A supported USB or network-connected camera An email account with SMTP access to send the daily log","s":"Requirements","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#requirements","p":161},{"i":167,"t":"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK, OpenCV library, and other required libraries: pip install groundlight opencv-python pillow","s":"Installation","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#installation","p":161},{"i":169,"t":"First, log in to the Groundlight application and get an API Token. Next, we'll write the Python script for the application. Import the required libraries: import time import cv2 import smtplib from groundlight import Groundlight from PIL import Image from datetime import datetime, timedelta from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText Define a function to capture an image from the camera using OpenCV: def capture_image(): cap = cv2.VideoCapture(0) ret, frame = cap.read() cap.release() if ret: # Convert to PIL image return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) else: return None Define a function to send the daily log via email. You will need to customize this for your particular network environment. def send_email(sender, receiver, subject, body): msg = MIMEMultipart() msg['From'] = sender msg['To'] = receiver msg['Subject'] = subject msg.attach(MIMEText(body, 'plain')) server = smtplib.SMTP('smtp.example.com', 587) server.starttls() server.login(sender, \"your-password\") text = msg.as_string() server.sendmail(sender, receiver, text) server.quit() Define when your business's operating hours are: START_OF_BUSINESS = 9 # e.g. 9am END_OF_BUSINESS = 17 # e.g. 5pm def is_within_business_hours(): current_hour = datetime.now().hour return START_OF_BUSINESS <= current_hour < END_OF_BUSINESS Write the main application loop: gl = Groundlight() detector = gl.get_or_create_detector( name=\"counter-in-use\", query=\"Is there a customer at the service counter?\", # We can get away with relatively low confidence since we're aggregating confidence_threshold=0.8) DELAY = 60 log = [] daily_log = [] next_hourly_start = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1) while True: if not is_within_business_hours(): time.sleep(DELAY) continue image = capture_image() if not image: print(\"Failed to capture image\") time.sleep(DELAY) continue try: iq = gl.submit_image_query(image=image, detector=detector, wait=60) except Exception as e: print(f\"Error submitting image query: {e}\") time.sleep(DELAY) continue answer = iq.result.label log.append(answer) if datetime.now() >= next_hourly_start: next_hourly_start += timedelta(hours=1) percent_in_use = (log.count(\"YES\") / len(log)) * 100 current_time = datetime.now().replace(hour=START_OF_BUSINESS, minute=0, second=0) formatted_time = current_time.strftime(\"%I%p\") # like 3pm msg = f\"Hourly summary for {formatted_time}: {percent_in_use:.0f}% counter in use\" print(msg) daily_log.append(msg) log = [] current_hour = datetime.now().hour if current_hour == END_OF_BUSINESS and not daily_log == []: daily_summary = \"Daily summary:\\n\" for msg in daily_log: daily_summary += f\"{msg}\\n\" print(daily_summary) send_email(sender=\"counterbot@example.com\", receiver=\"manager@example.com\", subject=\"Daily Service Counter Usage Log\", body=daily_summary) daily_log = [] time.sleep(DELAY) This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If a customer is detected at the counter, it logs the event. Every hour, it prints a summary of the counter's usage percentage, and at the end of the day, it emails the daily log using the send_email function. Save the script as service_counter_monitor.py and run it: python service_counter_monitor.py","s":"Creating the Application","u":"/python-sdk/docs/getting-started/retail-analytics","h":"#creating-the-application","p":161},{"i":171,"t":"This is the easiest way to deploy your Groundlight detectors on a linux computer. All configuration is done through a web user interface, and no code development is required.","s":"Monitoring Notification Server","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"","p":170},{"i":173,"t":"Internet connected linux computer Video source (USB camera or RTSP stream) Groundlight API Key (available from groundlight.ai)","s":"Prerequisites","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#prerequisites","p":170},{"i":175,"t":"Install Docker on your computer. See Docker's installation instructions. Create a new file called docker-compose.yml in your project directory. Copy the following into it: services: frontend: image: docker.io/groundlight/monitoring-notification-server-frontend:latest ports: - \"3000:3000\" depends_on: - backend backend: image: docker.io/groundlight/monitoring-notification-server-backend:latest ports: - \"8000:8000\" devices: - /dev/video0:/dev/video0 - /dev/video1:/dev/video1 - /dev/video2:/dev/video2 - /dev/video3:/dev/video3 privileged: true volumes: - /dev/bus/usb:/dev/bus/usb Run the following command in your project directory: docker-compose up If installed locally, open http://localhost:3000 in your browser. If installed on a remote device, replace localhost with the IP address of your device. You should see the following page:","s":"Deployment","u":"/python-sdk/docs/installation/monitoring-notification-server","h":"#deployment","p":170},{"i":177,"t":"This guide will help you install the Groundlight SDK on NVIDIA Jetson devices. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on NVIDIA Jetson","u":"/python-sdk/docs/installation/nvidia-jetson","h":"","p":176},{"i":179,"t":"Ensure that you have the following installed on your NVIDIA Jetson: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#prerequisites","p":176},{"i":181,"t":"Assuming you have Python 3.7 or higher installed on your NVIDIA Jetson, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#basic-installation","p":176},{"i":183,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip3 install groundlight An ARM-compatible version will automatically get installed. The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#installing-groundlight-sdk","p":176},{"i":185,"t":"If you have docker installed on your NVIDIA Jetson, you can even just run docker run groundlight/stream as we publish an ARM version of our streaming application to Docker Hub.","s":"Using RTSP Streams","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#using-rtsp-streams","p":176},{"i":187,"t":"For a complete end-to-end example of running on an NVIDIA Jetson, see this GitHub repo.","s":"Sample application","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#sample-application","p":176},{"i":189,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and [Building Applications","s":"Ready to go!","u":"/python-sdk/docs/installation/nvidia-jetson","h":"#ready-to-go","p":176},{"i":191,"t":"Here is a whimsical example of how you could use Groundlight in your home to keep your dog off the couch. This document will guide you through creating a complete application. If the dog is detected on the couch, the application will play a pre-recorded sound over the computer's speakers, instructing the dog to get off the couch. Be sure to record your own voice so that your dog pays attention to you.","s":"A Fun Example: Dog-on-Couch Detector","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"","p":190},{"i":193,"t":"Groundlight SDK with Python 3.7 or higher A supported USB or network-connected camera A pre-recorded sound file (e.g., get_off_couch.mp3) A couch and a dog are recommended for proper end-to-end testing.","s":"Requirements","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#requirements","p":190},{"i":195,"t":"Ensure you have Python 3.7 or higher installed, and then install the Groundlight SDK and OpenCV library: pip install groundlight opencv-python pillow pyaudio","s":"Installation","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#installation","p":190},{"i":197,"t":"First, log in to the Groundlight application and get an API Token. Next, we'll write the Python script for the application. Import the required libraries: import time import cv2 from groundlight import Groundlight from PIL import Image import pyaudio import wave Define a function to capture an image from the camera using OpenCV: def capture_image(): cap = cv2.VideoCapture(0) ret, frame = cap.read() cap.release() if ret: # Convert to PIL image return Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) else: return None Define a function to play the pre-recorded sound: def play_sound(file_path): CHUNK = 1024 wf = wave.open(file_path, 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(CHUNK) while data: stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate() Write the main application loop: gl = Groundlight() detector = gl.get_detector(\"Dog on Couch Detector\") while True: image = capture_image() if image: try: iq = gl.submit_image_query(image=image, detector=detector, wait=60) answer = iq.result.label if answer == \"YES\": print(\"Dog detected on the couch!\") play_sound(\"get_off_couch.mp3\") except Exception as e: print(f\"Error submitting image query: {e}\") else: print(\"Failed to capture image\") # Sleep for a minute before checking again time.sleep(60) This application captures an image using the capture_image function, then submits it to the Groundlight API for analysis. If the dog is detected on the couch, it plays the pre-recorded sound using the play_sound function. Save the script as dog_on_couch_detector.py and run it: python dog_on_couch_detector.py","s":"Creating the Application","u":"/python-sdk/docs/getting-started/dog-on-couch","h":"#creating-the-application","p":190},{"i":199,"t":"This guide will help you install the Groundlight SDK on macOS. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on macOS","u":"/python-sdk/docs/installation/macos","h":"","p":198},{"i":201,"t":"Ensure that you have the following installed on your system: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/macos","h":"#prerequisites","p":198},{"i":203,"t":"Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/macos","h":"#basic-installation","p":198},{"i":205,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip install groundlight If you're also using python2 on your system, you might need to use pip3 instead: pip3 install groundlight The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#installing-groundlight-sdk","p":198},{"i":207,"t":"To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner: python -c \"import groundlight; print(groundlight.__version__)\"","s":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/macos","h":"#checking-groundlight-sdk-version","p":198},{"i":209,"t":"If you need to upgrade the Groundlight SDK to the latest version, use the following pip command: pip install --upgrade groundlight Or, if you're using pip3: pip3 install --upgrade groundlight After upgrading, you can use the Python one-liner mentioned in the \"Checking Groundlight SDK Version\" section to verify that the latest version is now installed.","s":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/macos","h":"#upgrading-groundlight-sdk","p":198},{"i":211,"t":"To check your installed Python version, open a terminal and run: python --version If you see a version number starting with \"3.7\" or higher (e.g., \"3.7.5\" or \"3.9.0\"), you're good to go. If not, you might need to upgrade Python on your system.","s":"Getting the right Python Version","u":"/python-sdk/docs/installation/macos","h":"#getting-the-right-python-version","p":198},{"i":213,"t":"Download the latest Python installer from the official Python website and run it, or use Homebrew to install Python: brew install python After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.","s":"Upgrading Python on MacOS","u":"/python-sdk/docs/installation/macos","h":"#upgrading-python-on-macos","p":198},{"i":215,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/macos","h":"#ready-to-go","p":198},{"i":218,"t":"The Groundlight SDK is optimized to run on small edge devices. As such, you can use the Groundlight SDK without installing large libraries like numpy or OpenCV. But if you're already installing them, we'll use them. Our SDK detects if these libraries are installed and will make use of them if they're present. If not, we'll gracefully degrade, and tell you what's wrong if you try to use these features.","s":"Smaller is better!","u":"/python-sdk/docs/installation/optional-libraries","h":"#smaller-is-better","p":216},{"i":220,"t":"The PIL library offers a bunch of standard utilities for working with images in python. The Groundlight SDK can work without PIL. Because PIL is not very large, and is quite useful, we install it by default with the normal build of the Groundlight SDK. So when you pip3 install groundlight it comes with the pillow version of the PIL library already installed.","s":"PIL - optional but default installed","u":"/python-sdk/docs/installation/optional-libraries","h":"#pil---optional-but-default-installed","p":216},{"i":222,"t":"If you are extremely space constrained, you can install the Groundlight SDK from source without PIL and it will work properly, but with reduced functionality. Specifically, you will need to convert your images into JPEG format yourself. The SDK normally relies on PIL to do JPEG compression (which is a non-trivial algorithm), and the API requires images to be in JPEG format. However on space-constrained platforms, sometimes this conversion is done in hardware, and so we don't want to force you to install PIL if you don't need it.","s":"Working without PIL","u":"/python-sdk/docs/installation/optional-libraries","h":"#working-without-pil","p":216},{"i":224,"t":"These commonly-used libraries are not installed by default, because they are quite large, and their installation can often cause conflicts with other dependent libraries. If you want to use them, install them directly.","s":"Numpy, OpenCV - fully optional","u":"/python-sdk/docs/installation/optional-libraries","h":"#numpy-opencv---fully-optional","p":216},{"i":226,"t":"This guide will help you install the Groundlight SDK on Windows. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on Windows","u":"/python-sdk/docs/installation/windows","h":"","p":225},{"i":228,"t":"Ensure that you have the following installed on your system: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/windows","h":"#prerequisites","p":225},{"i":230,"t":"Assuming you have Python 3.7 or higher installed on your system, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/windows","h":"#basic-installation","p":225},{"i":232,"t":"To install the Groundlight SDK using pip, run the following command in your Command Prompt: pip install groundlight If you're also using python2 on your system, you might need to use pip3 instead: pip3 install groundlight The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#installing-groundlight-sdk","p":225},{"i":234,"t":"To check if the Groundlight SDK is installed and to display its version, you can use the following Python one-liner: python -c \"import groundlight; print(groundlight.__version__)\"","s":"Checking Groundlight SDK Version","u":"/python-sdk/docs/installation/windows","h":"#checking-groundlight-sdk-version","p":225},{"i":236,"t":"If you need to upgrade the Groundlight SDK to the latest version, use the following pip command: pip install --upgrade groundlight Or, if you're using pip3: pip3 install --upgrade groundlight After upgrading, you can use the Python one-liner mentioned in the \"Checking Groundlight SDK Version\" section to verify that the latest version is now installed.","s":"Upgrading Groundlight SDK","u":"/python-sdk/docs/installation/windows","h":"#upgrading-groundlight-sdk","p":225},{"i":238,"t":"To check your installed Python version, open a Command Prompt and run: python --version If you see a version number starting with \"3.7\" or higher (e.g., \"3.7.5\" or \"3.9.0\"), you're good to go. If not, you might need to upgrade Python on your system.","s":"Getting the right Python Version","u":"/python-sdk/docs/installation/windows","h":"#getting-the-right-python-version","p":225},{"i":240,"t":"Download the latest Python installer from the official Python website and run it. After upgrading, verify the Python version by running python --version or python3 --version, as described earlier.","s":"Upgrading Python on Windows","u":"/python-sdk/docs/installation/windows","h":"#upgrading-python-on-windows","p":225},{"i":242,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/windows","h":"#ready-to-go","p":225},{"i":244,"t":"Groundlight supplies a tool for no-code deployment of a detector to an ESP32 Camera board. You can find it at https://iot.groundlight.ai/espcam.","s":"No-Code IoT Deployment","u":"/python-sdk/docs/iot","h":"","p":243},{"i":246,"t":"This tool is designed to make it as easy as possible to deploy your Groundlight detector on an ESP32 Camera Board. You can deploy your detector in just a few clicks. Go to https://iot.groundlight.ai/espcam Plug your ESP32 Camera Board into your computer with a USB cable. Click through the steps to upload your detector to your ESP32 Camera Board. When prompted, allow your browser access to the serial port, so that it can program the device. If you don't see a prompt like this, try using a current version of Chrome or another browser that supports Web Serial.","s":"Easy Deployment","u":"/python-sdk/docs/iot","h":"#easy-deployment","p":243},{"i":248,"t":"The tool supports the following notification options for your deployed detector: Email SMS (With Twilio) Slack","s":"Notification Options","u":"/python-sdk/docs/iot","h":"#notification-options","p":243},{"i":250,"t":"Tested with the following boards. Many other ESP32 boards should work as well, but may require building the firmware from source and changing the IO pin definitions. M5Stack ESP32 PSRAM Timer Camera [purchase here] M5Stack ESP32 PSRAM Timer Camera X [purchase here] ESP32-CAM [purchase here] SeeedStudio ESP32S3 Sense [purchase here]","s":"Multiple Supported Boards","u":"/python-sdk/docs/iot","h":"#multiple-supported-boards","p":243},{"i":252,"t":"The source code is written as an Arduino-based PlatformIO project for ESP32, and is available on GitHub at https://github.com/groundlight/esp32cam If you need assistance or have questions about integrating Groundlight with Arduino, please consider opening an issue on the GitHub repository or reaching out to our support team.","s":"Source Code","u":"/python-sdk/docs/iot","h":"#source-code","p":243},{"i":254,"t":"This guide will help you install the Groundlight SDK on Raspberry Pi. The Groundlight SDK requires Python 3.7 or higher.","s":"Installing on Raspberry Pi","u":"/python-sdk/docs/installation/raspberry-pi","h":"","p":253},{"i":256,"t":"Ensure that you have the following installed on your Raspberry Pi: Python 3.7 or higher pip (Python package installer)","s":"Prerequisites","u":"/python-sdk/docs/installation/raspberry-pi","h":"#prerequisites","p":253},{"i":258,"t":"Assuming you have Python 3.7 or higher installed on your Raspberry Pi, you can proceed with the following steps to install or upgrade the Groundlight SDK:","s":"Basic Installation","u":"/python-sdk/docs/installation/raspberry-pi","h":"#basic-installation","p":253},{"i":260,"t":"To install the Groundlight SDK using pip, run the following command in your terminal: pip3 install groundlight An ARM-compatible version will automatically get installed. The Groundlight SDK is now installed and ready for use.","s":"Installing Groundlight SDK","u":"/python-sdk/docs/installation/raspberry-pi","h":"#installing-groundlight-sdk","p":253},{"i":262,"t":"If you have docker installed on your Raspberry Pi, you can even just run docker run groundlight/stream as we publish an ARM version of our streaming application to Docker Hub.","s":"Using RTSP Streams","u":"/python-sdk/docs/installation/raspberry-pi","h":"#using-rtsp-streams","p":253},{"i":264,"t":"For a complete end-to-end example of running on a Raspberry Pi, see this GitHub repo.","s":"Sample application","u":"/python-sdk/docs/installation/raspberry-pi","h":"#sample-application","p":253},{"i":266,"t":"You're now ready to start using the Groundlight SDK in your projects. For more information on using the SDK, refer to the API Tokens and Building Applications documentation pages.","s":"Ready to go!","u":"/python-sdk/docs/installation/raspberry-pi","h":"#ready-to-go","p":253}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,0.624,1,3.44,2,3.44,3,1.964,4,2.228,5,3.44,6,2.595,7,2.714,8,1.805,9,4.246,10,2.851,11,4.468,12,3.255,13,4.246,14,2.024,15,4.246,16,2.489,17,4.202,18,1.349,19,4.246,20,3.2,21,3.2,22,4.246,23,3.44,24,3.01,25,2.714,26,3.01,27,4.246,28,2.851,29,3.76,30,1.319,31,3.44,32,4.246,33,2.087,34,4.246,35,3.76,36,4.246]],["t/5",[0,0.602,12,3.761,28,4.428,29,5.841,37,4.675,38,5.343,39,5.343]],["t/7",[0,0.627,2,1.985,3,1.814,4,2.058,5,1.985,6,2.397,7,2.507,11,1.847,12,3.117,16,1.437,17,2.78,18,0.778,28,1.645,30,1.523,33,1.204,35,2.17,40,2.45,41,2.45,42,2.211,43,1.437,44,1.847,45,0.853,46,1.737,47,2.45,48,2.211,49,3.921,50,2.45,51,3.696,52,2.45,53,2.17,54,1.498,55,3.475,56,3.972,57,1.847,58,2.633,59,2.17,60,2.45,61,1.645,62,2.17,63,2.956,64,1.985,65,2.17,66,2.45,67,2.17,68,2.17,69,1.847,70,1.437,71,2.633,72,1.645,73,2.45,74,2.17,75,2.45,76,3.473,77,2.997,78,2.17,79,1.985,80,1.985,81,1.985,82,1.645,83,2.17,84,2.507,85,2.45,86,1.985,87,2.17,88,2.45,89,2.17,90,2.45,91,2.17,92,2.78,93,2.17,94,1.985,95,1.332,96,1.645,97,2.45,98,2.45,99,1.847,100,2.17,101,1.847,102,1.437,103,2.17]],["t/9",[0,0.537,1,3.405,20,3.168,30,1.306,70,2.464,76,3.722,77,4.152,82,3.952,95,2.284,104,2.979,105,4.815,106,3.405,107,3.722,108,5.886,109,2.979,110,4.941,111,2.437,112,3.405,113,4.768,114,2.133,115,4.203,116,3.722,117,4.203,118,2.066,119,3.168,120,4.203,121,4.203,122,4.203,123,3.722,124,2.822,125,4.203,126,3.405]],["t/11",[0,0.529,18,1.139,21,1.653,30,1.114,51,2.702,77,1.34,80,1.776,104,1.554,105,3.722,110,3.887,111,1.484,113,2.904,114,1.113,118,2.235,119,1.653,127,0.908,128,0.652,129,0.538,130,0.409,131,4.547,132,2.193,133,1.653,134,1.472,135,1.554,136,2.386,137,3.174,138,2.193,139,1.942,140,1.653,141,1.286,142,1.554,143,1.942,144,2.193,145,2.193,146,1.948,147,1.942,148,2.193,149,2.193,150,3.526,151,2.193,152,2.193,153,2.193,154,1.472,155,2.193,156,2.193,157,2.193,158,1.402,159,1.942,160,2.193,161,2.193,162,1.776,163,2.702,164,4.026,165,1.942,166,1.942,167,1.942,168,1.942,169,2.702,170,2.193,171,3.584,172,1.7,173,1.653,174,3.174,175,1.045,176,2.596,177,1.776,178,1.776,179,1.776,180,1.653,181,1.942,182,1.653,183,1.472,184,1.942,185,1.554,186,1.942,187,1.942,188,1.653,189,1.151,190,2.541,191,1.286,192,1.942,193,1.554,194,1.942,195,2.193,196,1.554,197,1.942,198,1.554,199,1.402,200,1.942,201,1.942]],["t/13",[0,0.517,18,0.792,30,0.775,42,1.406,77,1.525,81,3.222,82,1.674,95,3.362,109,1.768,110,3.331,111,2.344,113,3.222,114,1.266,123,3.522,127,1.032,128,0.741,129,0.612,130,0.466,136,2.604,137,2.209,139,2.209,150,3.331,154,2.67,163,1.88,164,2.209,168,2.209,172,0.933,175,1.189,176,2.892,177,2.02,178,2.02,191,1.462,199,2.543,202,2.02,203,2.209,204,2.494,205,3.978,206,2.494,207,2.78,208,2.209,209,1.594,210,4.961,211,2.02,212,2.209,213,2.494,214,2.494,215,5.661,216,2.494,217,1.768,218,4.961,219,1.594,220,4.019,221,4.961,222,4.961,223,3.978,224,2.209,225,1.88,226,2.494,227,2.02]],["t/15",[0,0.651,14,1.289,30,0.84,51,3.196,80,3.435,81,4.238,105,1.917,111,2.452,134,1.816,135,1.917,136,3.745,142,1.917,150,5.1,154,1.816,158,1.729,159,2.395,167,2.395,172,1.586,175,1.289,176,2.91,177,2.191,178,2.191,189,1.419,191,3.067,192,2.395,193,1.917,217,3.708,224,3.755,228,1.917,229,2.704,230,2.704,231,2.704,232,3.755,233,4.24,234,3.006,235,3.435,236,2.704,237,2.191,238,2.395,239,2.704,240,1.215,241,2.395,242,1.525,243,2.704,244,2.704,245,2.704,246,2.704,247,2.704,248,2.704,249,2.395]],["t/17",[63,4.235,84,5.024,128,1.67,250,3.772,251,3.772,252,3.983,253,3.983,254,3.983,255,4.975,256,2.266,257,4.552,258,5.619,259,4.552,260,4.975,261,3.983,262,5.619,263,5.619]],["t/19",[0,0.507,18,1.45,57,2.242,70,1.744,77,3.396,84,5.102,111,2.58,130,0.555,136,1.561,158,2.919,207,1.337,228,2.108,252,2.108,264,6.284,265,2.974,266,1.997,267,2.108,268,2.974,269,4.188,270,1.901,271,1.901,272,2.974,273,2.974,274,2.242,275,1.818,276,1.818,277,2.974,278,2.974,279,1.901,280,2.974,281,5.519,282,2.409,283,2.974,284,2.974,285,2.634,286,2.634,287,1.901,288,2.634,289,2.974,290,2.242,291,2.974,292,1.997,293,2.974,294,2.409,295,2.634,296,2.634,297,2.634,298,4.043,299,2.634,300,4.565,301,2.974,302,2.974,303,2.974,304,2.974,305,2.974]],["t/21",[0,0.733,18,1.651,57,3.918,84,3.323,129,1.275,130,0.971,172,1.944,176,1.853,220,4.211,264,6.019,285,4.603,306,4.603,307,2.405,308,5.198,309,4.603,310,5.198,311,3.49,312,4.211,313,4.603,314,5.198,315,5.198]],["t/23",[0,0.5,10,3.673,12,2.608,14,2.608,25,3.498,42,3.085,70,3.208,71,4.717,72,4.717,130,1.022,316,5.471,317,4.124,318,2.265,319,5.471,320,5.471,321,3.208,322,4.432,323,4.124,324,3.498]],["t/25",[0,0.453,14,1.896,70,2.332,74,4.393,130,0.466,172,1.488,176,2.854,251,2.67,290,1.88,307,1.154,317,1.88,318,1.647,325,4.267,326,2.02,327,2.209,328,4.393,329,2.02,330,2.494,331,1.768,332,3.978,333,1.768,334,2.02,335,2.02,336,3.978,337,2.494,338,2.494,339,2.494,340,2.02,341,2.494,342,2.494,343,1.88,344,2.02,345,2.494,346,2.209,347,2.494,348,3.978,349,3.978,350,2.494,351,2.494,352,2.02,353,2.494,354,3.978,355,4.961,356,2.494,357,2.209,358,2.494,359,2.494,360,2.209,361,4.961,362,3.978,363,2.494,364,2.494,365,2.494,366,2.02,367,2.494,368,2.494,369,2.494,370,2.494,371,2.209,372,2.494,373,2.494,374,2.494,375,3.978,376,2.494,377,2.209,378,2.494,379,1.674,380,2.02,381,2.209,382,2.209,383,2.494,384,2.494,385,2.494,386,2.494,387,2.494]],["t/27",[0,0.575,10,4.228,14,3.001,54,3.849,72,4.228,130,1.176,322,5.101,324,4.026,388,5.101,389,4.464,390,5.101]],["t/29",[321,3.339,324,4.608,328,5.043,331,4.037,346,5.043,391,5.043,392,4.037,393,5.695,394,5.695,395,5.043,396,5.695,397,5.695,398,4.037,399,5.695,400,5.695,401,5.695,402,4.293]],["t/31",[0,0.527,71,4.882,130,1.078,207,3.268,331,4.093,392,4.093,403,5.113,404,4.352,405,5.774,406,5.774,407,2.931,408,5.774,409,5.113,410,5.774,411,5.113]],["t/33",[33,2.689,59,4.845,207,2.459,324,3.498,325,4.124,402,4.124,407,2.777,412,4.492,413,5.471,414,3.673,415,5.471,416,5.471,417,4.432,418,5.471,419,4.845,420,3.344,421,5.471,422,5.471,423,4.432,424,5.471]],["t/35",[69,4.071,71,3.626,207,2.427,261,3.828,286,4.782,321,3.166,324,3.452,381,4.782,402,5.252,407,2.741,425,4.782,426,5.4,427,5.4,428,5.4,429,5.4,430,5.4,431,5.4,432,5.4,433,3.452,434,4.375,435,4.782]],["t/37",[71,3.722,72,3.722,165,4.909,183,3.722,207,2.492,323,4.179,324,3.544,325,4.179,417,4.491,436,5.544,437,5.544,438,3.126,439,5.544,440,5.544,441,5.544,442,5.544,443,5.544,444,5.544,445,4.909,446,4.909]],["t/39",[0,0.442,12,2.305,16,2.836,30,1.503,45,1.684,69,3.646,70,2.836,71,4.351,72,4.351,130,0.903,207,2.174,322,3.918,323,3.646,324,3.092,325,3.646,389,3.428,390,3.918,391,4.283,402,3.646,407,2.455,438,3.654,447,3.646,448,4.837,449,4.837,450,3.918,451,4.283,452,4.837,453,4.837]],["t/41",[48,3.498,102,3.637,130,1.159,242,3.498,379,4.165,454,6.203,455,5.026,456,6.203,457,5.493,458,3.498,459,4.397,460,4.676]],["t/43",[0,0.716,48,2.759,111,2.026,114,2.484,130,0.914,172,2.443,176,2.62,242,3.683,307,2.264,461,4.333,462,3.285,463,3.469,464,3.964,465,3.964,466,4.893,467,5.291,468,3.128,469,4.893,470,6.531,471,4.893,472,4.893]],["t/45",[0,0.483,48,3.524,54,2.212,111,1.498,118,2.6,130,0.676,172,1.354,173,2.728,176,2.722,179,2.932,180,2.728,181,3.205,182,2.728,183,2.43,184,3.205,186,3.205,187,3.205,188,2.728,189,1.9,190,4.873,200,3.205,201,3.205,235,2.932,379,2.43,450,2.932,455,2.932,458,2.982,459,2.566,460,2.728,462,2.43,463,2.566,473,2.43,474,3.205,475,5.289,476,2.314,477,2.932,478,5.063,479,2.932,480,3.205,481,3.62,482,4.285,483,3.205,484,3.205]],["t/47",[0,0.345,14,1.803,16,2.218,28,2.54,48,2.134,111,1.566,130,0.707,172,1.415,176,1.947,182,2.852,458,2.134,459,4.543,460,2.852,461,3.351,464,3.065,476,2.419,477,4.425,478,4.425,479,3.065,484,3.351,485,2.852,486,3.784,487,3.065,488,3.351,489,3.784,490,3.351,491,3.784,492,3.784,493,3.784,494,3.784,495,3.784,496,3.784,497,3.784,498,2.682,499,3.784,500,3.784,501,3.784,502,3.784,503,3.784,504,3.784,505,3.784,506,5.462,507,3.784,508,3.784,509,3.784,510,3.784,511,3.784,512,3.351,513,3.784]],["t/49",[0,0.513,6,1.506,18,0.783,30,0.766,48,3.171,92,1.747,111,2.545,114,1.251,127,1.02,130,0.46,143,2.182,146,1.34,176,2.004,198,2.793,235,1.997,297,3.489,379,1.655,433,1.576,450,1.997,458,2.776,459,3.489,460,2.97,464,1.997,476,1.576,477,4.555,478,5.576,479,4.555,480,2.182,485,1.858,487,1.997,488,3.489,512,4.359,514,2.465,515,3.489,516,2.465,517,2.465,518,2.465,519,2.465,520,2.465,521,2.465,522,1.655,523,1.997,524,2.182,525,2.465,526,1.655,527,2.465,528,3.94,529,3.94,530,2.182,531,2.465,532,2.465,533,2.182,534,2.465,535,1.858,536,2.465,537,2.465,538,2.182,539,2.465,540,2.465,541,2.465,542,2.465,543,2.465,544,2.97,545,2.465,546,2.182,547,1.858,548,2.182,549,3.94,550,2.182,551,2.182,552,2.465,553,2.465,554,2.465,555,2.465]],["t/51",[1,3.548,53,6.148,54,2.677,104,4.293,106,3.548,111,3.101,234,3.104,240,1.968,287,2.8,329,4.907,379,4.662,451,3.878,457,3.878,473,2.94,523,5.625,556,4.38,557,6.057,558,6.943,559,4.38,560,3.878,561,3.878,562,2.94,563,3.878,564,3.301,565,6.057]],["t/53",[0,0.432,3,2.952,4,3.349,6,2.889,7,3.022,12,2.253,17,3.351,33,2.324,61,3.174,84,3.022,92,4.523,94,3.829,95,2.569,96,3.174,288,4.186,566,4.727,567,3.829,568,4.727,569,4.727,570,4.186,571,3.351,572,4.186,573,4.727,574,3.022,575,4.186,576,3.829,577,4.727,578,4.727,579,4.727,580,4.186]],["t/55",[3,2.115,4,2.399,6,2.794,7,2.923,23,3.704,30,1.42,33,2.247,102,2.68,110,4.188,126,3.704,321,2.68,567,3.704,574,2.923,581,4.572,582,4.572,583,6.238,584,5.524,585,4.572,586,4.572,587,4.572,588,4.048,589,4.572,590,4.572,591,4.572,592,4.572,593,4.572,594,4.048,595,4.572,596,4.572,597,4.572,598,4.572,599,4.572,600,4.572]],["t/57",[3,2.237,4,2.538,6,2.956,7,3.092,102,2.836,109,3.428,287,3.092,407,2.455,434,3.918,435,4.283,570,4.283,571,4.593,574,3.092,584,4.283,601,4.283,602,3.918,603,4.837,604,4.283,605,4.837,606,4.837,607,6.48,608,4.283,609,4.837,610,4.837,611,4.837,612,4.837,613,4.837,614,4.837,615,4.283]],["t/59",[3,2.952,4,3.349,8,2.01,61,3.174,96,3.174,102,2.772,127,1.957,259,3.829,407,2.399,434,3.829,490,4.186,574,3.022,576,3.829,580,6.397,616,3.829,617,4.727,618,4.727,619,4.186,620,4.727,621,4.186,622,4.727,623,4.727,624,4.727,625,4.727,626,4.727,627,4.727,628,4.727,629,4.727,630,4.727]],["t/61",[3,2.092,4,2.373,30,1.405,61,3.036,96,3.036,102,2.651,103,4.004,104,3.205,126,3.663,254,3.205,311,3.036,321,2.651,409,4.004,455,3.663,574,3.958,575,5.483,588,4.004,594,5.483,608,4.004,631,3.663,632,4.522,633,4.522,634,4.522,635,4.522,636,3.205,637,4.522,638,4.522,639,4.522,640,3.663,641,4.522,642,4.522,643,4.522,644,4.522,645,4.522]],["t/63",[3,2.709,4,3.073,6,3.579,7,3.743,33,2.878,44,4.414,56,4.743,92,4.15,96,3.931,102,3.433,574,3.743,576,4.743,646,5.855,647,4.414,648,5.855,649,5.855]],["t/65",[0,0.389,8,0.671,14,1.296,20,1.19,23,1.279,24,1.928,31,1.279,33,1.761,58,4.331,61,1.06,62,1.398,63,2.701,64,2.203,65,3.772,67,3.173,68,3.173,77,1.662,82,2.86,101,2.05,111,2.328,114,0.801,133,1.19,136,2.235,140,3.621,141,1.595,146,0.858,150,1.06,172,1.34,175,0.752,176,2.004,191,1.595,193,1.928,197,2.408,198,1.119,199,1.009,209,1.009,217,1.119,228,3.721,234,1.119,240,0.709,242,0.89,249,1.398,252,2.54,257,2.903,266,2.406,294,1.279,307,0.73,334,1.279,343,1.19,380,1.279,389,1.119,463,1.119,468,1.009,498,1.119,551,1.398,631,1.279,636,1.119,650,1.579,651,1.398,652,2.408,653,1.398,654,1.279,655,3.211,656,1.579,657,1.398,658,1.279,659,1.19,660,1.279,661,1.398,662,1.579,663,1.06,664,1.119,665,1.398,666,1.279,667,1.579,668,1.579,669,1.579,670,2.72,671,2.408,672,1.739,673,2.72,674,0.73,675,1.579,676,2.203,677,1.398,678,1.579,679,1.579,680,1.579,681,1.579,682,1.398,683,1.398,684,1.579,685,1.398,686,1.579,687,1.579,688,1.579,689,1.579,690,2.408,691,2.05,692,1.398,693,1.579,694,1.398,695,1.449,696,1.398,697,1.398,698,0.965,699,1.279,700,1.579,701,1.579,702,1.579,703,1.579,704,1.579,705,1.398,706,2.72,707,1.579,708,1.579,709,1.579,710,1.579,711,1.279,712,1.579,713,1.579,714,1.579,715,1.579,716,2.72,717,1.398,718,1.579]],["t/67",[0,0.602,5,5.343,12,3.144,38,5.343,39,5.343,240,2.964,719,5.841,720,4.972]],["t/69",[0,0.475,18,1.651,79,4.211,95,2.825,256,2.741,267,5.368,321,3.048,357,4.603,407,2.639,523,4.211,561,4.603,562,3.49,721,3.685,722,5.198,723,3.49,724,5.198,725,5.198,726,4.603,727,4.603,728,5.198,729,2.728,730,5.198]],["t/71",[2,4.319,4,3.626,8,2.267,10,3.579,16,3.126,28,3.579,30,1.656,54,3.259,118,2.621,175,2.541,196,3.779,207,2.396,255,4.721,260,4.721,721,3.779,731,4.721,732,6.119,733,5.331,734,5.331,735,5.331,736,5.331]],["t/73",[8,2.105,28,3.324,95,2.691,207,2.958,209,3.166,266,3.324,275,3.027,276,4.024,317,3.732,485,3.732,660,4.011,721,3.51,737,4.952,738,7.881,739,6.583,740,4.385,741,4.952,742,3.732,743,4.952,744,4.952,745,4.385,746,4.952,747,4.011]],["t/75",[0,0.566,3,2.87,4,3.256,6,3.792,7,3.966,12,2.957,92,4.397,93,5.493,94,5.026,95,3.372,96,4.165,522,4.165]],["t/78",[0,0.62,16,2.464,18,1.87,37,2.979,99,3.168,112,3.405,136,3.089,172,1.572,175,3.237,176,2.098,189,2.206,240,1.889,307,1.944,404,3.168,468,2.687,640,3.405,663,3.952,672,2.687,748,4.203,749,4.203,750,6.517,751,5.886,752,4.203,753,3.168,754,4.203,755,3.168,756,4.203,757,4.203,758,3.405,759,3.722,760,4.203,761,4.203]],["t/80",[0,0.766,172,2.429,175,3.095,176,2.786,307,3.004,762,6.493]],["t/82",[0,0.683,25,4.784,55,4.741,82,4.49,172,1.897,176,2.947,196,3.595,307,2.346,763,4.491,764,5.923,765,5.072,766,4.491,767,4.491,768,4.491,769,5.072,770,4.491]],["t/84",[0,0.687,18,1.631,43,3.01,114,3.422,136,3.539,150,3.447,172,1.92,176,2.403,191,3.01,194,4.547,281,4.547,307,2.375,326,4.159,463,3.639,663,3.447,672,3.282,699,4.159,771,4.547,772,4.547,773,4.547,774,5.134]],["t/86",[0,0.683,25,4.784,82,4.49,172,1.897,176,2.947,196,3.595,307,2.346,763,4.491,764,5.923,766,4.491,767,4.491,768,4.491,770,4.491,775,6.688,776,5.072,777,5.072]],["t/88",[0,0.573,14,1.438,30,0.937,58,2.026,64,2.444,72,2.026,77,1.844,111,2.321,136,1.584,146,1.64,166,2.672,172,2.097,176,2.412,191,2.706,193,2.139,202,2.444,203,2.672,219,2.951,228,2.139,234,2.139,242,1.701,252,2.139,307,1.396,334,2.444,371,2.672,380,2.444,417,2.444,462,2.026,463,2.139,468,1.929,476,1.929,547,2.274,640,2.444,652,2.672,655,2.274,666,3.739,677,2.672,682,2.672,683,2.672,690,2.672,694,2.672,699,3.739,753,2.274,758,2.444,778,1.929,779,3.017,780,2.139,781,2.274,782,3.017,783,2.672,784,3.017,785,4.087,786,3.017,787,2.672,788,3.017,789,2.672,790,3.017,791,3.017,792,2.444,793,2.139,794,2.444,795,2.444,796,1.929,797,3.017,798,3.017,799,3.017,800,3.017]],["t/91",[0,0.601,3,1.834,4,2.08,8,1.685,10,2.661,21,2.988,54,2.423,111,1.641,129,1.385,130,0.74,141,2.324,172,1.482,176,2.701,191,2.324,217,2.809,241,3.51,307,1.834,388,3.211,465,3.211,468,2.534,476,2.534,530,3.51,533,3.51,691,2.988,781,2.988,787,3.51,794,3.211,795,3.211,796,2.534,801,3.963,802,3.51,803,3.51,804,2.809,805,3.51,806,3.51,807,3.963,808,3.963,809,3.963,810,3.51,811,3.963,812,3.963,813,3.963,814,3.963]],["t/93",[3,1.579,4,1.791,8,1.451,24,2.419,33,1.677,48,2.856,54,2.086,56,2.764,58,3.4,63,2.572,77,3.096,110,2.291,111,1.413,127,1.413,141,2.001,146,2.752,209,2.181,228,3.59,238,3.022,252,4.28,274,2.572,294,2.764,377,3.022,411,3.022,433,2.181,445,3.022,498,2.419,571,2.419,636,2.419,654,2.764,657,3.022,658,2.764,659,2.572,664,2.419,665,3.022,671,3.022,695,1.161,780,4.28,783,3.022,785,3.022,815,3.412,816,3.022,817,5.064,818,3.022,819,3.412,820,3.412,821,5.064,822,3.412,823,3.412,824,3.022,825,3.412,826,3.412,827,3.412,828,2.764,829,2.572,830,3.412]],["t/95",[11,4.235,30,1.746,84,3.592,87,4.975,102,3.294,146,3.054,574,3.592,658,4.552,659,4.235,666,4.552,732,4.975,831,5.619,832,5.619,833,5.619,834,5.619,835,4.975,836,5.619,837,5.619,838,5.619]],["t/97",[0,0.689,16,3.024,21,2.637,111,1.448,127,1.448,128,1.534,129,1.659,130,0.653,141,2.051,172,1.308,176,2.57,191,2.051,217,2.479,240,1.572,251,2.349,256,1.411,266,2.349,307,1.618,311,2.349,312,2.834,313,3.098,318,2.135,366,2.834,465,2.834,468,2.236,691,2.637,695,1.19,698,2.138,794,2.834,795,2.834,796,2.236,802,3.098,803,3.098,804,2.479,805,3.098,806,3.098,829,2.637,839,1.411,840,1.277,841,3.498,842,1.901,843,3.098,844,2.834,845,3.498,846,1.973,847,3.498,848,2.637,849,5.158]],["t/100",[0,0.601,14,2.36,18,2.091,127,2.05,130,0.925,250,3.324,318,3.061,326,4.011,544,3.732,846,3.712,850,4.385,851,4.952,852,4.952,853,4.385,854,2.691,855,4.952,856,4.952,857,4.952,858,4.952,859,4.952,860,4.952,861,4.952,862,4.952,863,4.952]],["t/102",[0,0.322,14,1.681,18,1.649,43,2.068,61,2.368,69,2.659,133,2.659,135,2.5,207,1.585,250,2.368,251,2.368,311,2.368,318,3.323,321,2.068,382,3.124,389,3.679,390,4.205,462,2.368,647,2.659,651,3.124,661,3.124,828,2.858,829,2.659,846,1.989,850,3.124,854,4.252,864,3.528,865,3.528,866,3.528,867,3.528,868,3.528,869,3.528,870,3.528,871,4.205,872,3.528,873,3.528,874,3.528,875,3.528,876,3.528,877,3.528,878,2.659,879,3.528,880,3.528,881,3.124,882,3.124,883,3.528]],["t/104",[0,0.681,14,2.864,37,2.399,130,0.94,172,1.883,176,2.372,208,2.997,220,2.742,237,2.742,306,4.457,307,2.329,311,4.035,312,4.868,318,2.944,366,4.078,389,2.399,395,2.997,462,2.272,544,2.551,664,2.399,721,3.568,771,2.997,846,4.204,854,1.84,884,3.385,885,2.997,886,2.997,887,3.385,888,3.385,889,3.385,890,3.385,891,2.551,892,3.385,893,3.385,894,3.385,895,3.385,896,3.385,897,3.385,898,3.385]],["t/106",[0,0.602,318,2.73,854,4.288,899,6.596,900,5.343,901,6.596,902,6.596]],["t/108",[0,0.565,16,3.63,25,2.891,83,4.004,240,2.032,250,3.036,318,2.923,412,2.891,602,3.663,631,3.663,663,4.157,717,4.004,755,3.409,846,4.282,854,3.365,871,5.016,903,4.522,904,5.016,905,4.004,906,4.522,907,4.004,908,5.483,909,4.522,910,4.522,911,4.004]],["t/110",[25,3.092,45,1.684,146,2.629,240,2.174,299,4.283,318,2.002,404,3.646,420,2.956,522,4.351,755,4.885,835,4.283,846,4.402,854,3.522,907,4.283,912,3.918,913,4.283,914,4.837,915,4.837,916,4.837,917,4.837,918,4.837,919,4.837,920,5.739,921,4.837]],["t/112",[0,0.422,12,2.996,30,1.436,189,2.426,198,3.276,199,2.955,225,3.484,232,4.093,250,3.103,318,1.913,476,2.955,663,3.103,672,4.018,846,4.52,881,5.566,882,4.093,904,3.745,905,4.093,912,3.745,922,4.622,923,4.622,924,4.622,925,6.285,926,4.622,927,4.622,928,4.622,929,4.093]],["t/114",[55,4.27,114,3.058,209,4.773,266,4.045,309,5.335,423,4.88,522,4.045,723,4.045,930,6.024,931,6.024,932,4.27,933,4.541,934,4.88]],["t/116",[0,0.566,129,1.522,130,1.159,423,5.026,564,4.676,695,2.11,723,4.165,758,5.026,840,2.265,934,5.026,935,5.493,936,5.493]],["t/118",[0,0.658,128,2.143,129,1.397,130,1.064,438,3.212,458,3.212,473,3.824,695,1.937,840,2.079,937,1.693,938,2.635,939,4.293,940,5.043,941,5.043,942,5.043,943,5.043]],["t/120",[0,0.516,14,0.863,26,1.284,51,1.366,58,1.216,109,1.284,111,1.931,112,1.468,129,0.75,136,2.735,140,1.366,141,1.062,150,1.216,154,2.665,169,2.992,172,1.949,175,1.892,176,2.777,182,1.366,185,1.284,190,2.168,193,1.284,199,1.158,207,1.375,242,1.022,253,1.284,256,1.234,287,1.158,292,1.216,307,0.838,318,0.75,327,1.604,412,1.158,447,1.366,538,3.515,564,2.306,571,1.284,655,1.366,672,1.158,676,1.468,723,2.665,729,0.951,750,3.515,755,1.366,773,1.604,804,1.284,843,1.604,846,1.022,848,3.516,920,1.604,934,2.478,935,2.709,936,2.709,940,1.604,941,1.604,942,1.604,943,1.604,944,1.812,945,3.059,946,1.812,947,1.812,948,1.812,949,1.812,950,3.059,951,1.604,952,1.812,953,1.812,954,1.812,955,3.059,956,1.468,957,1.468,958,5.211,959,4.664,960,1.812,961,1.812,962,1.812,963,1.812,964,3.97,965,1.812,966,1.812,967,1.812,968,1.158,969,1.468,970,3.059,971,1.812,972,1.812,973,1.812,974,1.604,975,1.812,976,3.059,977,1.812,978,1.812,979,1.812,980,1.604,981,1.812,982,1.812,983,1.812,984,1.604,985,1.812,986,1.812,987,1.812,988,3.059,989,1.604,990,1.812,991,1.812]],["t/122",[0,0.658,17,4.037,37,4.037,99,4.293,128,1.693,130,1.346,209,3.641,266,3.824,992,5.695,993,4.293,994,4.406,995,7.208,996,4.614,997,5.043]],["t/124",[0,0.422,11,3.484,12,2.203,30,1.436,42,2.607,70,2.71,99,3.484,109,3.276,118,2.272,130,0.863,269,3.484,270,2.955,271,2.955,275,2.825,276,2.825,388,3.745,711,3.745,742,3.484,778,2.955,912,3.745,993,3.484,994,2.825,996,3.745,998,4.622,999,6.285,1000,4.622,1001,4.455,1002,4.093,1003,4.093,1004,4.093,1005,3.276,1006,4.622,1007,2.512]],["t/127",[39,3.093,48,2.153,55,2.706,78,3.381,102,2.239,130,0.713,141,3.224,175,1.82,176,2.925,191,2.239,219,3.515,292,2.564,335,3.093,360,3.381,544,2.878,654,4.454,655,2.878,691,2.878,781,2.878,792,3.093,932,3.897,933,2.878,968,3.515,969,4.454,980,3.381,1008,2.878,1009,3.818,1010,3.381,1011,3.381,1012,3.818,1013,5.498,1014,5.498,1015,3.818,1016,3.818,1017,3.818,1018,3.818,1019,3.818,1020,3.818,1021,3.818]],["t/130",[20,4.895,95,3.529,111,2.688,219,4.151,298,5.75,968,4.151,1008,4.895,1010,5.75,1022,6.493]],["t/132",[0,0.427,33,3.113,101,3.523,110,3.138,114,2.372,133,3.523,146,2.54,189,2.453,257,3.787,392,3.313,550,4.139,636,3.313,659,3.523,685,4.139,692,4.139,772,4.139,780,3.313,816,4.139,933,4.774,968,4.049,1023,4.674,1024,4.674,1025,4.674,1026,4.674,1027,4.674,1028,4.674,1029,4.139,1030,4.674,1031,4.674,1032,4.674,1033,4.674]],["t/134",[136,3.99,176,2.211,219,3.966,392,4.397,547,4.676,1034,6.203,1035,6.203,1036,6.203,1037,6.203,1038,5.493,1039,6.203]],["t/136",[158,3.851,240,2.707,329,6.049,828,4.88,968,3.851,969,4.88,1011,5.335,1040,5.335,1041,6.024,1042,6.024,1043,6.024,1044,6.024,1045,6.024]],["t/138",[176,2.211,219,3.966,398,4.397,419,5.493,467,5.026,891,4.676,968,3.966,1008,4.676,1046,5.493,1047,6.203,1048,6.203,1049,6.203]],["t/140",[89,5.493,296,5.493,839,2.502,968,3.966,1008,4.676,1040,5.493,1050,6.203,1051,6.203,1052,6.203,1053,6.203,1054,6.203,1055,6.203]],["t/142",[0,0.694,128,1.844,129,1.522,130,1.42,407,3.149,695,2.11,698,3.792,840,2.265,994,3.792,1001,4.397]],["t/144",[8,2.677,45,2.192,129,1.882,438,3.551,695,2.142,840,2.299,937,1.872,938,2.913,1056,4.228,1057,4.026]],["t/146",[0,0.558,8,2.599,45,2.128,128,1.817,129,1.5,130,1.142,695,2.079,840,2.231,937,1.817,1058,4.333,1059,4.333,1060,4.104,1061,3.322]],["t/148",[0,0.72,8,2.105,18,2.091,30,2.045,45,1.724,127,2.05,128,2.198,130,1.229,158,3.166,256,1.997,674,2.291,729,2.599,842,3.578,937,1.472,938,3.045,1007,2.691,1062,3.324,1063,4.011,1064,2.434]],["t/150",[0,0.67,18,1.86,43,3.433,45,2.038,129,1.8,130,1.093,172,2.19,189,3.073,839,2.361,937,1.741,1065,4.743,1066,3.931,1067,4.743,1068,4.743]],["t/152",[0,0.693,18,1.967,30,1.405,45,1.574,127,1.872,128,1.841,129,1.109,130,1.156,189,2.373,674,2.092,729,2.373,839,2.848,842,3.365,937,1.344,938,2.864,1061,3.838,1064,2.223,1066,3.036,1069,4.157,1070,3.036,1071,3.663,1072,3.409,1073,3.663,1074,3.036]],["t/154",[8,2.21,43,3.048,127,2.152,129,1.858,240,2.336,256,2.096,414,3.49,674,2.405,695,1.768,796,3.323,839,3.054,840,1.898,878,3.918,932,3.685,937,1.545,1061,2.825,1062,3.49,1075,4.211,1076,4.211,1077,4.211,1078,3.685]],["t/156",[18,1.284,95,3.111,128,1.977,129,1.774,225,3.045,240,1.816,279,2.583,476,2.583,571,4.058,711,3.273,839,2.916,1001,2.864,1056,2.713,1069,2.713,1070,2.713,1074,2.713,1079,4.04,1080,4.04,1081,5.069,1082,4.04,1083,6.404,1084,5.069,1085,5.011,1086,3.578,1087,4.04,1088,4.04,1089,4.04,1090,4.04,1091,4.04,1092,3.273,1093,3.273]],["t/158",[0,0.381,18,0.843,30,0.824,38,2.149,57,3.148,128,2.245,129,1.438,176,2.525,183,2.804,196,2.961,225,3.894,234,1.88,237,2.149,253,1.88,256,1.684,433,1.696,483,2.349,515,2.349,647,2,696,2.349,839,1.07,842,2.808,937,0.789,951,2.349,1029,2.349,1064,1.304,1078,1.88,1081,4.575,1083,5.644,1084,3.699,1085,3.148,1086,3.699,1094,2.653,1095,1.781,1096,2.653,1097,2.653,1098,2.653,1099,2.653,1100,2.349,1101,2.653,1102,2.653,1103,2.653,1104,2.653,1105,2.653,1106,2.653,1107,2.653,1108,5.86,1109,2.653,1110,4.177,1111,4.177,1112,2.653,1113,2.653,1114,5.166,1115,2.653,1116,5.166,1117,4.177,1118,2.653]],["t/160",[0,0.513,12,2.678,30,2.22,33,2.762,42,3.168,46,3.983,124,3.772,130,1.335,134,3.772,318,2.326,420,3.434,674,2.599,778,3.592,854,3.054,1007,3.054,1064,2.762,1119,3.983]],["t/163",[0,0.255,3,0.753,17,1.154,18,1.165,31,1.319,44,1.227,95,0.885,107,3.247,114,0.826,118,1.373,127,0.674,128,0.484,140,2.105,142,1.154,146,0.885,163,1.227,175,1.331,207,2.199,212,1.441,259,1.319,279,1.041,282,5.101,292,1.093,317,1.227,321,0.954,392,1.154,398,1.979,407,0.826,412,1.785,420,1.707,425,1.441,446,1.441,467,1.319,498,1.154,522,1.093,567,1.319,602,2.262,604,1.441,615,1.441,619,2.473,621,1.441,636,1.979,660,1.319,695,0.554,719,1.441,726,1.441,740,1.441,747,1.319,792,1.319,818,1.441,871,4.627,885,1.441,1004,1.441,1095,1.093,1120,3.667,1121,3.667,1122,2.793,1123,3.85,1124,5.337,1125,4.348,1126,1.628,1127,3.247,1128,1.628,1129,1.628,1130,1.628,1131,1.628,1132,5.058,1133,1.628,1134,1.441,1135,1.441,1136,1.441,1137,1.441,1138,1.441,1139,1.441,1140,2.262,1141,1.628,1142,2.793,1143,2.793,1144,2.793,1145,1.628,1146,2.793,1147,1.628,1148,1.628,1149,2.793,1150,1.628,1151,1.628,1152,1.628,1153,1.628,1154,1.628,1155,1.628,1156,1.628,1157,1.628,1158,1.628,1159,1.628,1160,2.793,1161,1.628,1162,1.628,1163,3.667,1164,1.628,1165,1.628,1166,1.628,1167,1.628,1168,2.793,1169,1.628,1170,2.793,1171,1.628,1172,1.628,1173,1.628,1174,2.793,1175,2.793,1176,1.628,1177,1.628,1178,1.628,1179,1.628,1180,1.628,1181,1.628,1182,2.793,1183,1.628,1184,1.628,1185,1.628,1186,1.319,1187,1.628,1188,1.628,1189,1.628,1190,1.227,1191,1.628,1192,1.628,1193,1.227,1194,1.628]],["t/165",[0,0.527,118,2.838,129,1.417,130,1.078,250,3.877,251,3.877,261,4.093,412,3.691,482,4.678,562,3.877,695,1.964,840,2.108,1140,4.678,1186,4.678,1190,4.352,1193,4.352,1195,5.774]],["t/167",[0,0.658,128,2.143,129,1.769,130,1.064,438,3.212,458,4.065,473,3.824,526,3.824,695,1.937,840,2.079,937,1.693,938,2.635,939,4.293,1196,4.293]],["t/169",[0,0.355,18,0.648,24,0.807,26,0.807,30,0.862,58,0.765,70,0.668,105,0.807,111,2.081,118,0.56,119,0.858,127,0.471,129,0.501,136,0.598,141,0.668,146,0.619,154,0.765,163,0.858,169,0.858,172,1.988,173,0.858,175,0.543,176,3.02,180,0.858,185,0.807,188,1.538,190,0.807,199,0.728,207,1.519,211,2.738,227,0.923,242,1.151,256,0.459,261,0.807,282,1.653,290,0.858,292,1.862,307,0.527,311,0.765,318,0.845,331,0.807,333,0.807,335,0.923,340,0.923,343,0.858,344,1.653,352,0.923,412,2.765,414,1.37,447,1.538,458,0.642,468,0.728,482,0.923,526,0.765,535,0.858,653,1.008,676,0.923,747,0.923,780,0.807,789,1.008,810,1.807,824,1.008,846,0.642,848,1.538,956,2.247,957,0.923,984,1.008,1095,0.765,1123,1.807,1124,2.992,1127,1.008,1132,1.807,1135,1.008,1136,1.008,1137,1.807,1138,1.008,1139,1.008,1140,2.247,1193,0.858,1196,0.858,1197,1.139,1198,2.041,1199,1.139,1200,1.139,1201,2.041,1202,1.139,1203,1.139,1204,2.456,1205,2.456,1206,1.008,1207,1.807,1208,1.008,1209,1.008,1210,1.008,1211,1.008,1212,1.139,1213,1.139,1214,2.773,1215,1.139,1216,2.773,1217,1.139,1218,1.139,1219,1.139,1220,1.139,1221,1.139,1222,1.139,1223,1.139,1224,1.139,1225,1.139,1226,1.139,1227,1.139,1228,2.041,1229,1.139,1230,1.139,1231,1.139,1232,1.139,1233,2.041,1234,1.139,1235,1.139,1236,2.773,1237,1.139,1238,1.139,1239,2.041,1240,3.379,1241,2.041,1242,1.139,1243,1.139,1244,1.139,1245,1.139,1246,1.139,1247,1.139,1248,3.379,1249,2.773,1250,1.139,1251,2.041,1252,1.139,1253,2.041,1254,3.379,1255,2.773,1256,1.008,1257,1.008,1258,1.008,1259,1.008,1260,1.139,1261,1.139,1262,1.139,1263,1.139,1264,1.139,1265,1.139,1266,1.139,1267,1.139,1268,1.139,1269,2.041,1270,1.139,1271,1.139,1272,1.139,1273,1.139,1274,1.139,1275,1.139,1276,2.041,1277,1.139,1278,1.139,1279,1.139,1280,1.139,1281,1.139,1282,1.139,1283,1.139,1284,1.008,1285,0.923,1286,1.139,1287,1.139,1288,1.139,1289,1.139,1290,2.041]],["t/171",[0,0.535,3,2.709,14,2.791,55,4.15,86,4.743,101,4.414,104,4.15,162,4.743,844,4.743,1001,4.15,1100,5.185,1196,4.414,1291,5.855,1292,4.743,1293,5.855,1294,5.855]],["t/173",[0,0.542,3,2.747,118,2.919,142,4.209,318,2.458,562,3.987,564,4.476,723,3.987,727,5.259,793,4.209,1001,4.209,1190,4.476,1295,5.939,1296,5.939,1297,5.939]],["t/175",[3,1.553,16,1.968,25,2.146,45,2.082,70,2.934,111,2.071,128,0.998,185,2.38,209,2.146,240,2.249,254,2.38,256,1.354,267,4.239,269,3.772,295,2.973,563,2.973,663,2.254,729,1.762,742,3.772,796,2.146,804,2.38,853,2.973,908,2.973,937,1.488,989,4.431,993,2.531,996,2.72,1298,3.357,1299,3.357,1300,3.357,1301,4.431,1302,3.357,1303,5.003,1304,3.357,1305,5.003,1306,3.357,1307,3.357,1308,5.003,1309,3.357,1310,3.357,1311,3.357,1312,3.357,1313,3.357,1314,3.357,1315,3.357,1316,3.357,1317,3.357,1318,3.357,1319,3.357,1320,2.973,1321,3.357,1322,3.357,1323,3.357,1324,3.357]],["t/177",[0,0.682,128,1.791,129,1.478,130,1.394,254,4.27,270,3.851,271,3.851,407,3.058,695,2.049,698,3.682,840,2.199,994,3.682]],["t/179",[45,2.16,129,1.865,270,3.966,271,3.966,438,3.498,695,2.11,840,2.265,937,1.844,938,2.87,1056,4.165,1057,3.966]],["t/181",[0,0.55,45,2.097,128,1.791,129,1.478,130,1.125,270,3.851,271,3.851,695,2.049,840,2.199,937,1.791,1058,4.27,1059,4.27,1060,4.045,1061,3.274]],["t/183",[0,0.7,18,1.694,30,1.656,45,1.856,128,2.054,130,1.29,256,2.15,664,3.779,729,2.798,839,2.15,842,2.898,937,2.054,938,2.466,1007,2.898,1062,3.579,1064,2.621,1325,4.019,1326,4.721]],["t/185",[207,2.631,256,2.958,267,5.678,270,3.743,271,3.743,274,4.414,839,2.361,937,1.741,1325,4.414,1327,5.185,1328,5.185,1329,5.185,1330,5.185]],["t/187",[114,3.245,240,2.873,270,4.088,271,4.088,279,4.088,720,4.819,1095,5.199,1331,5.18,1332,5.662]],["t/189",[0,0.527,12,2.752,30,2.259,33,2.838,42,3.256,124,3.877,130,1.358,318,2.39,420,3.529,674,2.671,778,3.691,854,3.138,1007,3.138,1064,2.838,1119,4.093]],["t/191",[0,0.422,18,1.468,114,2.346,135,3.276,207,2.825,404,3.484,616,3.745,829,3.484,929,4.093,994,2.825,1285,3.745,1292,3.745,1331,3.745,1333,4.622,1334,4.622,1335,4.622,1336,6.208,1337,5.785,1338,4.622,1339,3.745,1340,3.745,1341,3.745,1342,4.622,1343,4.622,1344,4.622,1345,4.622,1346,4.622,1347,4.622,1348,4.622]],["t/193",[0,0.487,118,2.621,129,1.308,130,0.996,261,3.779,414,3.579,562,3.579,695,1.813,804,3.779,840,1.946,886,4.721,1095,4.639,1186,4.319,1190,4.019,1336,4.319,1337,4.319,1339,4.319,1340,4.319,1341,4.319,1349,5.331,1350,5.331,1351,5.331]],["t/195",[0,0.664,128,2.162,129,1.784,130,1.078,438,3.256,458,4.1,473,3.877,695,1.964,840,2.108,937,1.717,938,2.671,939,4.352,1352,5.113]],["t/197",[0,0.484,24,1.324,26,1.324,30,1.261,105,1.324,111,2.653,118,0.918,119,1.408,129,0.77,136,0.981,141,1.841,146,1.016,154,1.254,169,1.408,172,2.284,173,1.408,174,1.655,175,1.496,176,2.764,180,1.408,185,1.324,188,2.366,190,1.324,198,1.324,199,1.194,207,2.138,211,3.854,219,1.194,227,1.514,242,1.77,256,0.754,290,1.408,292,2.108,307,0.864,318,1.3,331,1.324,333,1.324,340,1.514,343,1.408,344,2.543,352,1.514,412,1.194,447,2.366,458,1.054,498,2.878,526,1.254,535,1.408,616,1.514,723,1.254,780,1.324,846,1.054,848,2.366,911,1.655,956,2.543,957,1.514,974,1.655,1072,1.408,1134,1.655,1196,1.408,1204,2.78,1205,3.595,1206,1.655,1207,2.78,1208,1.655,1209,1.655,1210,1.655,1211,1.655,1256,1.655,1257,1.655,1258,1.655,1259,1.655,1284,1.655,1285,2.543,1336,1.514,1337,3.289,1339,2.543,1340,2.543,1341,2.543,1352,1.655,1353,1.868,1354,1.868,1355,1.868,1356,1.868,1357,1.868,1358,1.868,1359,1.868,1360,1.868,1361,1.868,1362,1.868,1363,1.868,1364,1.868,1365,3.139,1366,1.868,1367,1.868,1368,1.868,1369,1.868,1370,1.868,1371,1.868,1372,1.868,1373,1.868,1374,1.868,1375,1.868,1376,3.139]],["t/199",[0,0.694,128,1.844,129,1.522,130,1.42,407,3.149,695,2.11,698,3.792,840,2.265,994,3.792,1002,5.493]],["t/201",[8,2.677,45,2.192,129,1.882,438,3.551,695,2.142,840,2.299,937,1.872,938,2.913,1056,4.228,1057,4.026]],["t/203",[0,0.558,8,2.599,45,2.128,128,1.817,129,1.5,130,1.142,695,2.079,840,2.231,937,1.817,1058,4.333,1059,4.333,1060,4.104,1061,3.322]],["t/205",[0,0.72,8,2.105,18,2.091,30,2.045,45,1.724,127,2.05,128,2.198,130,1.229,158,3.166,256,1.997,674,2.291,729,2.599,842,3.578,937,1.472,938,3.045,1007,2.691,1062,3.324,1063,4.011,1064,2.434]],["t/207",[0,0.67,18,1.86,43,3.433,45,2.038,129,1.8,130,1.093,172,2.19,189,3.073,839,2.361,937,1.741,1065,4.743,1066,3.931,1067,4.743,1068,4.743]],["t/209",[0,0.693,18,1.967,30,1.405,45,1.574,127,1.872,128,1.841,129,1.109,130,1.156,189,2.373,674,2.092,729,2.373,839,2.848,842,3.365,937,1.344,938,2.864,1061,3.838,1064,2.223,1066,3.036,1069,4.157,1070,3.036,1071,3.663,1072,3.409,1073,3.663,1074,3.036]],["t/211",[8,2.21,43,3.048,127,2.152,129,1.858,240,2.336,256,2.096,414,3.49,674,2.405,695,1.768,796,3.323,839,3.054,840,1.898,878,3.918,932,3.685,937,1.545,1061,2.825,1062,3.49,1075,4.211,1076,4.211,1077,4.211,1078,3.685]],["t/213",[18,1.631,128,2.004,129,2.091,253,3.639,256,2.071,279,3.282,839,3.036,900,4.159,1057,3.282,1069,3.447,1070,3.447,1074,3.447,1085,3.87,1092,4.159,1093,4.159,1377,4.547,1378,5.134,1379,5.134]],["t/215",[0,0.513,12,2.678,30,2.22,33,2.762,42,3.168,46,3.983,124,3.772,130,1.335,134,3.772,318,2.326,420,3.434,674,2.599,778,3.592,854,3.054,1007,3.054,1064,2.762,1119,3.983]],["t/218",[0,0.557,18,2.391,26,4.325,84,2.83,130,1.304,254,3.137,256,1.785,321,2.595,323,3.336,333,3.137,398,3.137,433,2.83,458,2.496,459,3.137,526,4.096,548,3.919,560,3.919,674,2.048,753,3.336,937,1.316,1380,4.426,1381,4.426,1382,6.101,1383,3.586,1384,4.426,1385,4.426,1386,4.426,1387,4.426,1388,4.426,1389,4.426]],["t/220",[0,0.652,10,3.103,48,2.607,54,2.825,106,3.745,128,1.869,129,1.134,130,1.174,183,3.103,242,4.321,287,2.955,433,2.955,473,4.22,474,4.093,485,3.484,547,3.484,572,4.093,753,3.484,839,1.864,842,2.512,937,1.374,939,3.484,1383,3.745,1390,4.622,1391,4.093,1392,4.622,1393,4.622]],["t/222",[0,0.369,48,3.228,91,3.578,127,2.37,128,1.702,130,1.069,162,3.273,242,3.749,287,2.583,318,1.672,433,2.583,487,4.637,524,3.578,535,3.045,546,3.578,672,2.583,698,2.47,745,3.578,759,3.578,793,2.864,891,4.315,997,3.578,1394,4.04,1395,5.724,1396,5.724,1397,4.04,1398,4.04,1399,4.04,1400,6.648,1401,4.04,1402,4.04,1403,4.04,1404,4.04,1405,4.04,1406,4.04,1407,4.04]],["t/224",[18,1.86,128,1.741,183,3.931,462,3.931,522,3.931,526,4.925,672,3.743,937,1.741,993,4.414,1383,4.743,1391,5.185,1408,5.855,1409,5.855,1410,5.855,1411,5.855]],["t/226",[0,0.694,128,1.844,129,1.522,130,1.42,407,3.149,695,2.11,698,3.792,840,2.265,994,3.792,1003,5.493]],["t/228",[8,2.677,45,2.192,129,1.882,438,3.551,695,2.142,840,2.299,937,1.872,938,2.913,1056,4.228,1057,4.026]],["t/230",[0,0.558,8,2.599,45,2.128,128,1.817,129,1.5,130,1.142,695,2.079,840,2.231,937,1.817,1058,4.333,1059,4.333,1060,4.104,1061,3.322]],["t/232",[0,0.716,8,2.081,18,2.075,30,2.029,45,1.704,127,2.026,128,2.186,130,1.22,158,3.128,256,1.973,674,2.264,729,3.428,842,3.55,937,1.455,938,3.021,1007,2.66,1063,3.964,1064,2.405,1412,3.964]],["t/234",[0,0.67,18,1.86,43,3.433,45,2.038,129,1.8,130,1.093,172,2.19,189,3.073,839,2.361,937,1.741,1065,4.743,1066,3.931,1067,4.743,1068,4.743]],["t/236",[0,0.693,18,1.967,30,1.405,45,1.574,127,1.872,128,1.841,129,1.109,130,1.156,189,2.373,674,2.092,729,2.373,839,2.848,842,3.365,937,1.344,938,2.864,1061,3.838,1064,2.223,1066,3.036,1069,4.157,1070,3.036,1071,3.663,1072,3.409,1073,3.663,1074,3.036]],["t/238",[8,2.183,43,3.01,127,2.125,129,1.847,240,2.307,256,2.071,414,3.447,674,2.375,695,1.746,729,2.695,796,3.282,839,3.036,840,1.874,878,3.87,932,3.639,937,1.526,1061,2.791,1075,4.159,1076,4.159,1077,4.159,1078,3.639,1412,4.159]],["t/240",[129,2.029,253,3.983,256,2.266,279,3.592,839,3.169,900,4.552,1057,3.592,1069,3.772,1070,3.772,1074,3.772,1085,4.235,1092,4.552,1093,4.552,1377,4.975]],["t/242",[0,0.513,12,2.678,30,2.22,33,2.762,42,3.168,46,3.983,124,3.772,130,1.335,134,3.772,318,2.326,420,3.434,674,2.599,778,3.592,854,3.054,1007,3.054,1064,2.762,1119,3.983]],["t/244",[0,0.575,14,3.001,37,4.464,118,3.095,175,3.001,1005,4.464,1413,6.297,1414,5.101,1415,6.297,1416,5.576,1417,5.576]],["t/246",[0,0.352,3,1.783,30,1.197,79,3.122,86,4.484,118,3.183,147,3.412,175,3.087,202,3.122,240,1.732,251,2.587,269,2.905,333,2.731,398,2.731,562,2.587,705,3.412,781,2.905,839,1.554,844,3.122,891,2.905,904,3.122,913,3.412,1005,4.59,1060,2.587,1078,2.731,1292,3.122,1320,4.901,1412,3.122,1414,3.122,1416,5.735,1417,3.412,1418,3.854,1419,3.854,1420,3.854,1421,3.854,1422,3.854,1423,3.854,1424,3.854,1425,5.535,1426,3.854,1427,3.854,1428,3.412]],["t/248",[45,2.192,116,5.576,175,3.001,742,4.747,1193,4.747,1414,5.101,1428,5.576,1429,6.297,1430,6.297,1431,6.297,1432,6.297]],["t/250",[42,2.47,45,1.525,100,3.878,118,2.977,135,5.31,179,3.548,287,2.8,379,2.94,697,3.878,793,3.104,1005,5.31,1046,3.878,1433,4.38,1434,6.057,1435,4.38,1436,4.38,1437,4.38,1438,4.38,1439,4.38,1440,6.057,1441,6.057,1442,6.057,1443,7.492,1444,4.38,1445,4.38,1446,4.38]],["t/252",[0,0.463,14,2.417,44,3.823,95,2.757,127,2.1,142,3.595,403,4.491,601,4.491,647,3.823,720,5.042,721,3.595,731,4.491,793,3.595,933,3.823,1005,3.595,1038,4.491,1301,4.491,1447,5.072,1448,6.688,1449,5.072,1450,5.072,1451,5.072,1452,5.072,1453,5.072,1454,5.072]],["t/254",[0,0.688,128,1.817,129,1.5,130,1.407,275,3.736,276,3.736,407,3.103,695,2.079,698,3.736,840,2.231,994,3.736]],["t/256",[45,2.16,129,1.865,275,3.792,276,3.792,438,3.498,695,2.11,840,2.265,937,1.844,938,2.87,1056,4.165,1057,3.966]],["t/258",[0,0.55,45,2.097,128,1.791,129,1.478,130,1.125,275,3.682,276,3.682,695,2.049,840,2.199,937,1.791,1058,4.27,1059,4.27,1060,4.045,1061,3.274]],["t/260",[0,0.7,18,1.694,30,1.656,45,1.856,128,2.054,130,1.29,256,2.15,664,3.779,729,2.798,839,2.15,842,2.898,937,2.054,938,2.466,1007,2.898,1062,3.579,1064,2.621,1325,4.019,1326,4.721]],["t/262",[207,2.631,256,2.958,267,5.678,274,4.414,275,3.579,276,3.579,839,2.361,937,1.741,1325,4.414,1327,5.185,1328,5.185,1329,5.185,1330,5.185]],["t/264",[114,3.245,240,2.873,275,3.908,276,3.908,279,4.088,720,4.819,1095,5.199,1331,5.18,1332,5.662]],["t/266",[0,0.513,12,2.678,30,2.22,33,2.762,42,3.168,46,3.983,124,3.772,130,1.335,134,3.772,318,2.326,420,3.434,674,2.599,778,3.592,854,3.054,1007,3.054,1064,2.762,1119,3.983]]],"invertedIndex":[["",{"_index":176,"t":{"11":{"position":[[987,1],[1066,1],[1088,1],[1154,1],[1167,1],[1215,1],[1262,1],[1320,1],[1404,1],[1474,1]]},"13":{"position":[[574,1],[664,1],[741,1],[781,1],[832,1],[853,1],[922,2],[937,1],[1002,2],[1016,1],[1081,2],[1100,1],[1147,1],[1217,1]]},"15":{"position":[[535,1],[616,1],[668,1],[715,1],[758,1],[779,1],[848,1],[888,1],[951,1],[972,1],[1062,1],[1112,1],[1166,1]]},"21":{"position":[[172,1]]},"25":{"position":[[207,1],[230,1],[314,1],[389,1],[445,1],[535,1],[615,1],[643,1],[699,1],[768,1],[844,1],[898,1],[968,1]]},"43":{"position":[[154,1],[174,1],[257,1]]},"45":{"position":[[330,1],[352,1],[406,1],[419,1],[478,1],[524,1]]},"47":{"position":[[348,1],[422,1]]},"49":{"position":[[724,1],[788,1],[801,2],[804,2]]},"65":{"position":[[972,1],[998,1],[1101,1],[1158,1],[1259,1],[1355,1],[2107,1]]},"78":{"position":[[349,1],[374,1]]},"80":{"position":[[39,1],[64,1]]},"82":{"position":[[39,1],[55,1],[99,1],[121,1],[176,1]]},"84":{"position":[[248,1],[276,1]]},"86":{"position":[[39,1],[55,1],[103,1],[129,1],[188,1]]},"88":{"position":[[654,1],[672,1],[835,1],[902,1],[984,1]]},"91":{"position":[[109,1],[129,1],[207,1],[241,1],[294,1]]},"97":{"position":[[384,1],[404,1],[482,1],[516,1],[569,1]]},"104":{"position":[[417,1],[488,1],[716,1],[754,1]]},"120":{"position":[[95,1],[480,1],[507,1],[526,1],[552,1],[570,1],[577,3],[973,3],[980,1],[1005,1],[1106,1],[1176,2],[1306,1],[1355,1],[1447,2],[1482,1],[1539,2]]},"127":{"position":[[72,1],[211,1],[328,1],[342,1],[403,1],[560,2],[572,3],[584,1]]},"134":{"position":[[87,1]]},"138":{"position":[[30,1]]},"158":{"position":[[312,1],[367,1],[447,1],[579,1],[651,1],[700,1],[806,1]]},"169":{"position":[[469,1],[502,1],[537,1],[818,1],[848,1],[867,1],[893,1],[946,1],[1047,1],[1186,1],[1190,1],[1217,1],[1222,1],[1278,1],[1325,2],[1341,1],[1395,1],[1420,1],[1525,1],[1630,1],[1639,1],[1641,2],[1654,1],[1656,2],[1677,1],[1737,1],[1838,1],[1938,1],[2104,1],[2159,2],[2199,2],[2236,1],[2256,1],[2268,1],[2287,1],[2371,1],[2403,1],[2418,1],[2534,1],[2536,2],[2552,1],[2590,2],[2627,2],[2630,3],[2648,1],[2705,2],[2889,1],[2891,2]]},"197":{"position":[[356,1],[389,1],[424,1],[611,1],[621,1],[652,1],[679,1],[809,1],[868,1],[977,1],[1002,1],[1063,1],[1099,1],[1171,1],[1199,2],[1383,1]]}}}],["0",{"_index":182,"t":{"11":{"position":[[1108,2]]},"45":{"position":[[372,2]]},"47":{"position":[[172,1]]},"120":{"position":[[1179,2]]}}}],["0.0",{"_index":494,"t":{"47":{"position":[[183,3]]}}}],["0.75",{"_index":961,"t":{"120":{"position":[[554,5]]}}}],["0.95",{"_index":673,"t":{"65":{"position":[[811,5],[1338,4]]}}}],["1",{"_index":538,"t":{"49":{"position":[[807,2]]},"120":{"position":[[92,2],[105,3],[118,1]]}}}],["1.0",{"_index":495,"t":{"47":{"position":[[187,3]]}}}],["10",{"_index":196,"t":{"11":{"position":[[1416,2]]},"71":{"position":[[180,4]]},"82":{"position":[[69,2]]},"86":{"position":[[69,2]]},"158":{"position":[[576,2],[803,2]]}}}],["100",{"_index":1265,"t":{"169":{"position":[[2270,3]]}}}],["1024",{"_index":1356,"t":{"197":{"position":[[613,4]]}}}],["17",{"_index":1237,"t":{"169":{"position":[[1219,2]]}}}],["18.04",{"_index":1086,"t":{"156":{"position":[[167,5]]},"158":{"position":[[7,5],[218,5]]}}}],["1st",{"_index":767,"t":{"82":{"position":[[135,3]]},"86":{"position":[[143,3]]}}}],["255",{"_index":493,"t":{"47":{"position":[[174,3]]}}}],["3",{"_index":1101,"t":{"158":{"position":[[197,1]]}}}],["3)).astype(np.uint8",{"_index":511,"t":{"47":{"position":[[401,20]]}}}],["3.10",{"_index":1097,"t":{"158":{"position":[[105,5]]}}}],["3.6",{"_index":1094,"t":{"158":{"position":[[31,3]]}}}],["3.7",{"_index":840,"t":{"97":{"position":[[53,3]]},"116":{"position":[[28,3]]},"118":{"position":[[23,3]]},"142":{"position":[[99,3]]},"144":{"position":[[68,3]]},"146":{"position":[[25,3]]},"154":{"position":[[124,5]]},"165":{"position":[[28,3]]},"167":{"position":[[23,3]]},"177":{"position":[[115,3]]},"179":{"position":[[75,3]]},"181":{"position":[[25,3]]},"193":{"position":[[28,3]]},"195":{"position":[[23,3]]},"199":{"position":[[99,3]]},"201":{"position":[[68,3]]},"203":{"position":[[25,3]]},"211":{"position":[[124,5]]},"226":{"position":[[101,3]]},"228":{"position":[[68,3]]},"230":{"position":[[25,3]]},"238":{"position":[[130,5]]},"254":{"position":[[106,3]]},"256":{"position":[[74,3]]},"258":{"position":[[25,3]]}}}],["3.7.5",{"_index":1076,"t":{"154":{"position":[[147,7]]},"211":{"position":[[147,7]]},"238":{"position":[[153,7]]}}}],["3.8",{"_index":1102,"t":{"158":{"position":[[234,4]]}}}],["3.9.0",{"_index":1077,"t":{"154":{"position":[[158,9]]},"211":{"position":[[158,9]]},"238":{"position":[[164,9]]}}}],["3000:3000",{"_index":1306,"t":{"175":{"position":[[277,11]]}}}],["3pm",{"_index":1271,"t":{"169":{"position":[[2410,3]]}}}],["400",{"_index":359,"t":{"25":{"position":[[645,3]]}}}],["401",{"_index":364,"t":{"25":{"position":[[701,3]]}}}],["403",{"_index":368,"t":{"25":{"position":[[770,3]]}}}],["404",{"_index":374,"t":{"25":{"position":[[846,3]]}}}],["429",{"_index":378,"t":{"25":{"position":[[900,3]]}}}],["5",{"_index":768,"t":{"82":{"position":[[147,1]]},"86":{"position":[[155,1]]}}}],["500",{"_index":384,"t":{"25":{"position":[[970,3]]}}}],["587",{"_index":1224,"t":{"169":{"position":[[981,4]]}}}],["5pm",{"_index":1238,"t":{"169":{"position":[[1229,3]]}}}],["60",{"_index":676,"t":{"65":{"position":[[855,2],[1289,2]]},"120":{"position":[[572,4]]},"169":{"position":[[1632,2]]}}}],["80",{"_index":1026,"t":{"132":{"position":[[117,3]]}}}],["800",{"_index":510,"t":{"47":{"position":[[396,4]]}}}],["8000:8000",{"_index":1310,"t":{"175":{"position":[[404,11]]}}}],["800x600",{"_index":503,"t":{"47":{"position":[[291,7]]}}}],["9",{"_index":1234,"t":{"169":{"position":[[1188,1]]}}}],["9am",{"_index":1235,"t":{"169":{"position":[[1197,3]]}}}],["_",{"_index":186,"t":{"11":{"position":[[1145,2]]},"45":{"position":[[397,2]]}}}],["__main__",{"_index":986,"t":{"120":{"position":[[1542,11]]}}}],["__name__",{"_index":985,"t":{"120":{"position":[[1530,8]]}}}],["above",{"_index":773,"t":{"84":{"position":[[176,5]]},"120":{"position":[[1653,5]]}}}],["accept",{"_index":461,"t":{"43":{"position":[[24,6]]},"47":{"position":[[24,6]]}}}],["acceptable",{"_index":155,"t":{"11":{"position":[[517,10]]}}}],["accepts",{"_index":454,"t":{"41":{"position":[[18,7]]}}}],["access",{"_index":251,"t":{"17":{"position":[[20,6]]},"25":{"position":[[90,6],[288,6]]},"97":{"position":[[244,6]]},"102":{"position":[[511,6]]},"165":{"position":[[113,6]]},"246":{"position":[[382,6]]}}}],["accessible",{"_index":599,"t":{"55":{"position":[[309,10]]}}}],["accessing",{"_index":928,"t":{"112":{"position":[[239,9]]}}}],["accidentally",{"_index":889,"t":{"104":{"position":[[216,12]]}}}],["according",{"_index":1035,"t":{"134":{"position":[[51,9]]}}}],["account",{"_index":250,"t":{"17":{"position":[[8,7]]},"100":{"position":[[177,8]]},"102":{"position":[[249,8]]},"108":{"position":[[27,7]]},"112":{"position":[[266,8]]},"165":{"position":[[95,7]]}}}],["account/api",{"_index":902,"t":{"106":{"position":[[98,11]]}}}],["accuracy",{"_index":65,"t":{"7":{"position":[[419,8]]},"65":{"position":[[79,9],[159,8],[1497,8],[1557,9]]}}}],["action",{"_index":123,"t":{"9":{"position":[[415,6]]},"13":{"position":[[252,6],[860,6]]}}}],["add",{"_index":788,"t":{"88":{"position":[[401,3]]}}}],["adding",{"_index":1103,"t":{"158":{"position":[[281,6]]}}}],["addition",{"_index":436,"t":{"37":{"position":[[3,8]]}}}],["additionally",{"_index":639,"t":{"61":{"position":[[208,13]]}}}],["address",{"_index":1324,"t":{"175":{"position":[[783,7]]}}}],["addressing",{"_index":1177,"t":{"163":{"position":[[1501,10]]}}}],["affordable",{"_index":736,"t":{"71":{"position":[[215,10]]}}}],["again",{"_index":911,"t":{"108":{"position":[[290,6]]},"197":{"position":[[1420,5]]}}}],["against",{"_index":64,"t":{"7":{"position":[[411,7]]},"65":{"position":[[71,7],[1506,7]]},"88":{"position":[[58,7]]}}}],["aggregating",{"_index":1245,"t":{"169":{"position":[[1586,11]]}}}],["ago",{"_index":520,"t":{"49":{"position":[[181,3]]}}}],["ahead",{"_index":1099,"t":{"158":{"position":[[156,6]]}}}],["ai",{"_index":732,"t":{"71":{"position":[[106,2],[226,2]]},"95":{"position":[[69,2]]}}}],["alert",{"_index":970,"t":{"120":{"position":[[946,5],[1471,10]]}}}],["algorithm",{"_index":1406,"t":{"222":{"position":[[315,11]]}}}],["allocation",{"_index":1143,"t":{"163":{"position":[[534,10],[651,10]]}}}],["allow",{"_index":1424,"t":{"246":{"position":[[363,5]]}}}],["allowed",{"_index":370,"t":{"25":{"position":[[804,7]]}}}],["allowing",{"_index":642,"t":{"61":{"position":[[327,8]]}}}],["allows",{"_index":255,"t":{"17":{"position":[[104,6]]},"71":{"position":[[76,6]]}}}],["along",{"_index":835,"t":{"95":{"position":[[94,5]]},"110":{"position":[[67,5]]}}}],["already",{"_index":753,"t":{"78":{"position":[[114,7]]},"88":{"position":[[451,7]]},"218":{"position":[[175,7]]},"220":{"position":[[342,7]]}}}],["alternatively",{"_index":894,"t":{"104":{"position":[[526,14]]}}}],["alternatives",{"_index":1111,"t":{"158":{"position":[[509,12],[745,12]]}}}],["always",{"_index":244,"t":{"15":{"position":[[791,6]]}}}],["ambiguous",{"_index":1011,"t":{"127":{"position":[[144,9]]},"136":{"position":[[26,10]]}}}],["analysis",{"_index":24,"t":{"3":{"position":[[274,9]]},"65":{"position":[[299,8],[1961,9]]},"93":{"position":[[275,8]]},"169":{"position":[[3024,9]]},"197":{"position":[[1553,9]]}}}],["analytics",{"_index":1121,"t":{"163":{"position":[[69,9],[471,9],[1706,9]]}}}],["analyzed",{"_index":815,"t":{"93":{"position":[[22,8]]}}}],["analyzing",{"_index":726,"t":{"69":{"position":[[122,9]]},"163":{"position":[[564,9]]}}}],["another",{"_index":202,"t":{"13":{"position":[[147,7]]},"88":{"position":[[561,7]]},"246":{"position":[[522,7]]}}}],["answer",{"_index":141,"t":{"11":{"position":[[295,6]]},"65":{"position":[[120,6],[1425,6]]},"91":{"position":[[355,6]]},"93":{"position":[[166,7]]},"97":{"position":[[630,6]]},"120":{"position":[[959,6]]},"127":{"position":[[84,6],[464,6]]},"169":{"position":[[2097,6]]},"197":{"position":[[1164,6],[1192,6]]}}}],["answered",{"_index":298,"t":{"19":{"position":[[623,8],[712,8]]},"130":{"position":[[35,8]]}}}],["answers",{"_index":291,"t":{"19":{"position":[[532,7]]}}}],["anybody",{"_index":868,"t":{"102":{"position":[[168,7]]}}}],["api",{"_index":318,"t":{"23":{"position":[[92,3]]},"25":{"position":[[36,3],[946,3]]},"97":{"position":[[162,3],[255,4]]},"100":{"position":[[30,4],[78,4],[186,3]]},"102":{"position":[[17,3],[145,3],[186,3],[300,3],[318,3],[414,3],[521,3],[540,3]]},"104":{"position":[[49,3],[137,3],[315,3],[429,3],[558,3]]},"106":{"position":[[20,3]]},"108":{"position":[[55,3],[94,3],[339,3]]},"110":{"position":[[7,3]]},"112":{"position":[[155,3]]},"120":{"position":[[287,3]]},"160":{"position":[[122,3]]},"169":{"position":[[56,3],[3016,3]]},"173":{"position":[[87,3]]},"189":{"position":[[122,3]]},"197":{"position":[[56,3],[1545,3]]},"215":{"position":[[122,3]]},"222":{"position":[[335,3]]},"242":{"position":[[122,3]]},"266":{"position":[[122,3]]}}}],["api_2gdxmflhj",{"_index":855,"t":{"100":{"position":[[207,16]]}}}],["apiexception",{"_index":328,"t":{"25":{"position":[[68,13],[178,13],[370,12]]},"29":{"position":[[73,13]]}}}],["app",{"_index":845,"t":{"97":{"position":[[145,3]]}}}],["appear",{"_index":304,"t":{"19":{"position":[[810,6]]}}}],["application",{"_index":207,"t":{"13":{"position":[[292,11],[355,11],[972,11],[1051,11],[1135,11]]},"19":{"position":[[428,11]]},"31":{"position":[[52,11],[185,12]]},"33":{"position":[[194,12]]},"35":{"position":[[155,11]]},"37":{"position":[[78,11]]},"39":{"position":[[124,11]]},"71":{"position":[[64,11]]},"73":{"position":[[78,11],[160,11]]},"102":{"position":[[462,12]]},"120":{"position":[[264,11],[342,12]]},"163":{"position":[[30,11],[172,11],[481,11],[804,11],[1915,12]]},"169":{"position":[[33,11],[111,12],[1374,11],[2917,11]]},"185":{"position":[[150,11]]},"191":{"position":[[163,12],[217,11]]},"197":{"position":[[33,11],[111,12],[956,11],[1446,11]]},"262":{"position":[[149,11]]}}}],["applications",{"_index":12,"t":{"3":{"position":[[118,12],[191,12],[333,12]]},"5":{"position":[[7,13],[56,12]]},"7":{"position":[[56,12],[331,13],[919,13],[1035,13],[1089,13],[1158,12]]},"23":{"position":[[14,12]]},"39":{"position":[[251,12]]},"53":{"position":[[91,12]]},"67":{"position":[[73,13]]},"75":{"position":[[111,13]]},"112":{"position":[[212,12],[298,12]]},"124":{"position":[[308,12]]},"160":{"position":[[146,12]]},"189":{"position":[[147,12]]},"215":{"position":[[146,12]]},"242":{"position":[[146,12]]},"266":{"position":[[146,12]]}}}],["apply",{"_index":93,"t":{"7":{"position":[[946,5]]},"75":{"position":[[27,5]]}}}],["appropriate",{"_index":413,"t":{"33":{"position":[[20,11]]}}}],["apt",{"_index":1084,"t":{"156":{"position":[[119,3],[135,3]]},"158":{"position":[[352,3],[393,3]]}}}],["arch",{"_index":1089,"t":{"156":{"position":[[245,4]]}}}],["arduino",{"_index":1448,"t":{"252":{"position":[[33,7],[223,8]]}}}],["area",{"_index":1189,"t":{"163":{"position":[[1830,5]]}}}],["areas",{"_index":1174,"t":{"163":{"position":[[1395,5],[1539,6]]}}}],["argument",{"_index":893,"t":{"104":{"position":[[516,9]]}}}],["arm",{"_index":1325,"t":{"183":{"position":[[114,3]]},"185":{"position":[[121,3]]},"260":{"position":[[114,3]]},"262":{"position":[[120,3]]}}}],["arms",{"_index":633,"t":{"61":{"position":[[93,5]]}}}],["array",{"_index":534,"t":{"49":{"position":[[642,6]]}}}],["arrays",{"_index":460,"t":{"41":{"position":[[91,7]]},"45":{"position":[[125,7]]},"47":{"position":[[47,7]]},"49":{"position":[[95,6],[388,6]]}}}],["ask",{"_index":969,"t":{"120":{"position":[[919,3]]},"127":{"position":[[38,3],[137,3]]},"136":{"position":[[126,3]]}}}],["ask.py",{"_index":849,"t":{"97":{"position":[[338,6],[678,6]]}}}],["ask_async",{"_index":131,"t":{"11":{"position":[[139,9],[195,9],[443,9]]}}}],["asked",{"_index":245,"t":{"15":{"position":[[815,5]]}}}],["asking",{"_index":931,"t":{"114":{"position":[[56,6]]}}}],["aspects",{"_index":41,"t":{"7":{"position":[[36,7]]}}}],["assembly",{"_index":611,"t":{"57":{"position":[[251,9]]}}}],["assigned",{"_index":914,"t":{"110":{"position":[[142,8]]}}}],["assist",{"_index":581,"t":{"55":{"position":[[45,6]]}}}],["assistance",{"_index":1450,"t":{"252":{"position":[[159,10]]}}}],["assume",{"_index":168,"t":{"11":{"position":[[808,6]]},"13":{"position":[[343,6]]}}}],["assuming",{"_index":1058,"t":{"146":{"position":[[0,8]]},"181":{"position":[[0,8]]},"203":{"position":[[0,8]]},"230":{"position":[[0,8]]},"258":{"position":[[0,8]]}}}],["async",{"_index":233,"t":{"15":{"position":[[160,5],[724,5]]}}}],["asynchronous",{"_index":76,"t":{"7":{"position":[[610,12],[668,12]]},"9":{"position":[[55,12]]}}}],["asynchronously",{"_index":80,"t":{"7":{"position":[[718,14]]},"11":{"position":[[114,14]]},"15":{"position":[[31,15],[821,14]]}}}],["attempting",{"_index":231,"t":{"15":{"position":[[94,10]]}}}],["attention",{"_index":1348,"t":{"191":{"position":[[387,9]]}}}],["audit",{"_index":790,"t":{"88":{"position":[[511,5]]}}}],["authenticate",{"_index":851,"t":{"100":{"position":[[97,12]]}}}],["authorize",{"_index":852,"t":{"100":{"position":[[133,9]]}}}],["automatically",{"_index":664,"t":{"65":{"position":[[460,13]]},"93":{"position":[[73,13]]},"104":{"position":[[288,13]]},"183":{"position":[[142,13]]},"260":{"position":[[142,13]]}}}],["automating",{"_index":582,"t":{"55":{"position":[[55,10]]}}}],["automation",{"_index":570,"t":{"53":{"position":[[148,10]]},"57":{"position":[[60,10]]}}}],["available",{"_index":142,"t":{"11":{"position":[[308,9]]},"15":{"position":[[431,9]]},"163":{"position":[[713,9]]},"173":{"position":[[95,10]]},"252":{"position":[[84,9]]}}}],["avoid",{"_index":395,"t":{"29":{"position":[[87,5]]},"104":{"position":[[210,5]]}}}],["away",{"_index":824,"t":{"93":{"position":[[392,4]]},"169":{"position":[[1538,4]]}}}],["back",{"_index":445,"t":{"37":{"position":[[192,4]]},"93":{"position":[[617,4]]}}}],["backend",{"_index":1308,"t":{"175":{"position":[[303,7],[311,8]]}}}],["backend:latest",{"_index":1309,"t":{"175":{"position":[[380,14]]}}}],["backoff",{"_index":428,"t":{"35":{"position":[[65,7]]}}}],["bad",{"_index":360,"t":{"25":{"position":[[649,3]]},"127":{"position":[[580,3]]}}}],["balance",{"_index":551,"t":{"49":{"position":[[1031,7]]},"65":{"position":[[1489,7]]}}}],["bandwidth",{"_index":262,"t":{"17":{"position":[[190,10]]}}}],["based",{"_index":95,"t":{"7":{"position":[[976,5]]},"9":{"position":[[422,5]]},"13":{"position":[[259,5],[867,5],[958,5],[1037,5],[1121,5]]},"53":{"position":[[24,5]]},"69":{"position":[[159,5]]},"73":{"position":[[132,5]]},"75":{"position":[[57,5]]},"130":{"position":[[86,5]]},"156":{"position":[[99,5],[201,5]]},"163":{"position":[[1909,5]]},"252":{"position":[[41,5]]}}}],["basics",{"_index":1107,"t":{"158":{"position":[[381,6]]}}}],["become",{"_index":598,"t":{"55":{"position":[[297,6]]}}}],["before",{"_index":198,"t":{"11":{"position":[[1427,6]]},"49":{"position":[[476,6],[684,6]]},"65":{"position":[[708,6]]},"112":{"position":[[328,6]]},"197":{"position":[[1404,6]]}}}],["behavior",{"_index":446,"t":{"37":{"position":[[210,9]]},"163":{"position":[[853,9]]}}}],["being",{"_index":1130,"t":{"163":{"position":[[240,5]]}}}],["below",{"_index":711,"t":{"65":{"position":[[1890,5]]},"124":{"position":[[35,5]]},"156":{"position":[[182,7]]}}}],["belt",{"_index":1013,"t":{"127":{"position":[[255,4],[321,6]]}}}],["beneficial",{"_index":1141,"t":{"163":{"position":[[500,10]]}}}],["best",{"_index":389,"t":{"27":{"position":[[52,4]]},"39":{"position":[[199,4]]},"65":{"position":[[231,4]]},"102":{"position":[[111,4],[272,4]]},"104":{"position":[[101,4]]}}}],["beta",{"_index":808,"t":{"91":{"position":[[418,6]]}}}],["better",{"_index":652,"t":{"65":{"position":[[152,6],[529,6]]},"88":{"position":[[285,6]]}}}],["between",{"_index":409,"t":{"31":{"position":[[113,7]]},"61":{"position":[[181,7]]}}}],["bgr",{"_index":477,"t":{"45":{"position":[[158,3]]},"47":{"position":[[100,3],[463,3]]},"49":{"position":[[30,3],[133,3],[212,3],[770,3]]}}}],["bgr_img",{"_index":536,"t":{"49":{"position":[[780,7]]}}}],["bin/bash",{"_index":946,"t":{"120":{"position":[[57,11]]}}}],["binary",{"_index":1008,"t":{"127":{"position":[[42,6]]},"130":{"position":[[17,6]]},"138":{"position":[[14,6]]},"140":{"position":[[23,7]]}}}],["black",{"_index":1025,"t":{"132":{"position":[[91,5]]}}}],["blocked",{"_index":339,"t":{"25":{"position":[[300,10]]}}}],["blue",{"_index":542,"t":{"49":{"position":[[865,4]]}}}],["board",{"_index":1416,"t":{"244":{"position":[[84,6]]},"246":{"position":[[108,6],[229,5],[341,6]]}}}],["boards",{"_index":1434,"t":{"250":{"position":[[26,7],[51,6]]}}}],["body",{"_index":1215,"t":{"169":{"position":[[807,6]]}}}],["body=daily_summary",{"_index":1283,"t":{"169":{"position":[[2859,19]]}}}],["bottlenecks",{"_index":603,"t":{"57":{"position":[[97,12]]}}}],["boxes",{"_index":1014,"t":{"127":{"position":[[260,7],[299,5]]}}}],["breaking",{"_index":813,"t":{"91":{"position":[[521,8]]}}}],["brew",{"_index":1379,"t":{"213":{"position":[[117,4]]}}}],["broad",{"_index":397,"t":{"29":{"position":[[102,5]]}}}],["browser",{"_index":1320,"t":{"175":{"position":[[711,8]]},"246":{"position":[[374,7],[530,7]]}}}],["build",{"_index":10,"t":{"3":{"position":[[105,5]]},"23":{"position":[[150,5]]},"27":{"position":[[92,5]]},"71":{"position":[[90,5]]},"91":{"position":[[0,5]]},"220":{"position":[[223,5]]}}}],["building",{"_index":42,"t":{"7":{"position":[[47,8],[1133,8]]},"13":{"position":[[312,9]]},"23":{"position":[[5,8]]},"124":{"position":[[292,8]]},"160":{"position":[[137,8]]},"189":{"position":[[137,9]]},"215":{"position":[[137,8]]},"242":{"position":[[137,8]]},"250":{"position":[[95,8]]},"266":{"position":[[137,8]]}}}],["built",{"_index":29,"t":{"3":{"position":[[346,5]]},"5":{"position":[[69,5]]}}}],["bunch",{"_index":1390,"t":{"220":{"position":[[25,5]]}}}],["busier",{"_index":1150,"t":{"163":{"position":[[871,6]]}}}],["business",{"_index":746,"t":{"73":{"position":[[272,8]]}}}],["business's",{"_index":1232,"t":{"169":{"position":[[1136,10]]}}}],["button",{"_index":905,"t":{"108":{"position":[[105,7]]},"112":{"position":[[68,6]]}}}],["c",{"_index":1067,"t":{"150":{"position":[[125,1]]},"207":{"position":[[125,1]]},"234":{"position":[[125,1]]}}}],["cable",{"_index":1421,"t":{"246":{"position":[[265,6]]}}}],["call",{"_index":326,"t":{"25":{"position":[[40,5]]},"84":{"position":[[203,5]]},"100":{"position":[[70,4]]}}}],["called",{"_index":1299,"t":{"175":{"position":[[91,6]]}}}],["calls",{"_index":319,"t":{"23":{"position":[[96,6]]}}}],["cam",{"_index":179,"t":{"11":{"position":[[1062,3]]},"45":{"position":[[326,3]]},"250":{"position":[[272,3]]}}}],["cam.read",{"_index":187,"t":{"11":{"position":[[1156,10]]},"45":{"position":[[408,10]]}}}],["cam.release",{"_index":200,"t":{"11":{"position":[[1460,13]]},"45":{"position":[[510,13]]}}}],["camera",{"_index":118,"t":{"9":{"position":[[306,6]]},"11":{"position":[[1101,6],[1196,6],[1488,6]]},"45":{"position":[[365,6],[538,6]]},"71":{"position":[[151,7]]},"124":{"position":[[192,6]]},"163":{"position":[[1768,6],[1840,6]]},"165":{"position":[[79,6]]},"169":{"position":[[423,6]]},"173":{"position":[[52,6]]},"193":{"position":[[79,6]]},"197":{"position":[[310,6]]},"244":{"position":[[77,6]]},"246":{"position":[[101,6],[222,6],[334,6]]},"250":{"position":[[192,6],[241,6]]}}}],["cameras",{"_index":523,"t":{"49":{"position":[[242,7]]},"51":{"position":[[185,7],[314,7],[325,7]]},"69":{"position":[[165,8]]}}}],["campaigns",{"_index":1157,"t":{"163":{"position":[[1001,9]]}}}],["cap",{"_index":1206,"t":{"169":{"position":[[465,3]]},"197":{"position":[[352,3]]}}}],["cap.read",{"_index":1208,"t":{"169":{"position":[[504,10]]},"197":{"position":[[391,10]]}}}],["cap.release",{"_index":1209,"t":{"169":{"position":[[515,13]]},"197":{"position":[[402,13]]}}}],["capabilities",{"_index":103,"t":{"7":{"position":[[1228,13]]},"61":{"position":[[142,12]]}}}],["capture",{"_index":188,"t":{"11":{"position":[[1169,7]]},"45":{"position":[[421,7]]},"169":{"position":[[397,7],[1887,7]]},"197":{"position":[[284,7],[1367,7]]}}}],["capture_image",{"_index":1205,"t":{"169":{"position":[[448,16],[1840,15],[2957,13]]},"197":{"position":[[335,16],[1065,15],[1486,13]]}}}],["captures",{"_index":1284,"t":{"169":{"position":[[2929,8]]},"197":{"position":[[1458,8]]}}}],["cardboard",{"_index":1016,"t":{"127":{"position":[[289,9]]}}}],["case",{"_index":156,"t":{"11":{"position":[[541,4]]}}}],["cases",{"_index":19,"t":{"3":{"position":[[220,6]]}}}],["catch",{"_index":391,"t":{"29":{"position":[[0,5]]},"39":{"position":[[84,5]]}}}],["catching",{"_index":396,"t":{"29":{"position":[[93,8]]}}}],["cause",{"_index":1409,"t":{"224":{"position":[[123,5]]}}}],["cautious",{"_index":895,"t":{"104":{"position":[[621,8]]}}}],["centers",{"_index":590,"t":{"55":{"position":[[154,8]]}}}],["change",{"_index":530,"t":{"49":{"position":[[528,6]]},"91":{"position":[[458,6]]}}}],["changes",{"_index":814,"t":{"91":{"position":[[530,8]]}}}],["changing",{"_index":1436,"t":{"250":{"position":[[133,8]]}}}],["channel",{"_index":512,"t":{"47":{"position":[[430,7]]},"49":{"position":[[462,7],[670,7],[753,7]]}}}],["channels=wf.getnchannels",{"_index":1362,"t":{"197":{"position":[[739,27]]}}}],["check",{"_index":43,"t":{"7":{"position":[[87,5]]},"84":{"position":[[29,5]]},"102":{"position":[[50,5]]},"150":{"position":[[3,5]]},"154":{"position":[[3,5]]},"207":{"position":[[3,5]]},"211":{"position":[[3,5]]},"234":{"position":[[3,5]]},"238":{"position":[[3,5]]}}}],["checker",{"_index":337,"t":{"25":{"position":[[265,9]]}}}],["checking",{"_index":1072,"t":{"152":{"position":[[259,9]]},"197":{"position":[[1411,8]]},"209":{"position":[[259,9]]},"236":{"position":[[259,9]]}}}],["checks",{"_index":1133,"t":{"163":{"position":[[273,6]]}}}],["choose",{"_index":998,"t":{"124":{"position":[[0,6]]}}}],["chrome",{"_index":1427,"t":{"246":{"position":[[512,6]]}}}],["chunk",{"_index":1355,"t":{"197":{"position":[[605,5]]}}}],["classes",{"_index":406,"t":{"31":{"position":[[35,7]]}}}],["cleanliness",{"_index":1050,"t":{"140":{"position":[[31,13]]}}}],["clear",{"_index":467,"t":{"43":{"position":[[213,7],[240,8]]},"138":{"position":[[96,5]]},"163":{"position":[[1812,5]]}}}],["click",{"_index":904,"t":{"108":{"position":[[72,5],[189,5]]},"112":{"position":[[49,5]]},"246":{"position":[[272,5]]}}}],["clicks",{"_index":1419,"t":{"246":{"position":[[158,7]]}}}],["cloud",{"_index":281,"t":{"19":{"position":[[284,5],[408,5],[728,6],[824,5]]},"84":{"position":[[88,5]]}}}],["clouds",{"_index":1044,"t":{"136":{"position":[[147,6]]}}}],["clutter",{"_index":1053,"t":{"140":{"position":[[136,7]]}}}],["cnc",{"_index":588,"t":{"55":{"position":[[132,3]]},"61":{"position":[[269,3]]}}}],["cobot",{"_index":632,"t":{"61":{"position":[[79,5]]}}}],["code",{"_index":14,"t":{"3":{"position":[[144,5]]},"15":{"position":[[276,4]]},"23":{"position":[[163,4]]},"25":{"position":[[571,4],[596,5]]},"27":{"position":[[105,5]]},"47":{"position":[[273,4]]},"65":{"position":[[378,4],[2056,4]]},"88":{"position":[[245,4]]},"100":{"position":[[148,4]]},"102":{"position":[[80,4]]},"104":{"position":[[258,4],[368,4],[649,4]]},"120":{"position":[[1277,4]]},"171":{"position":[[145,4]]},"244":{"position":[[35,4]]},"252":{"position":[[11,4]]}}}],["codes",{"_index":358,"t":{"25":{"position":[[636,6]]}}}],["collaboration",{"_index":637,"t":{"61":{"position":[[167,13]]}}}],["color",{"_index":488,"t":{"47":{"position":[[104,5]]},"49":{"position":[[216,5],[1025,5]]}}}],["combines",{"_index":831,"t":{"95":{"position":[[36,8]]}}}],["come",{"_index":830,"t":{"93":{"position":[[612,4]]}}}],["comes",{"_index":1393,"t":{"220":{"position":[[293,5]]}}}],["command",{"_index":729,"t":{"69":{"position":[[210,8]]},"120":{"position":[[10,7]]},"148":{"position":[[60,7]]},"152":{"position":[[88,8]]},"175":{"position":[[601,7]]},"183":{"position":[[60,7]]},"205":{"position":[[60,7]]},"209":{"position":[[88,8]]},"232":{"position":[[60,7],[76,7]]},"236":{"position":[[88,8]]},"238":{"position":[[47,7]]},"260":{"position":[[60,7]]}}}],["commands",{"_index":613,"t":{"57":{"position":[[301,8]]}}}],["commit",{"_index":896,"t":{"104":{"position":[[637,6]]}}}],["committing",{"_index":890,"t":{"104":{"position":[[229,10]]}}}],["common",{"_index":357,"t":{"25":{"position":[[617,6]]},"69":{"position":[[148,6]]}}}],["commonly",{"_index":1408,"t":{"224":{"position":[[6,8]]}}}],["communicate",{"_index":160,"t":{"11":{"position":[[651,11]]}}}],["communicating",{"_index":280,"t":{"19":{"position":[[249,13]]}}}],["communication",{"_index":644,"t":{"61":{"position":[[349,13]]}}}],["compatibility",{"_index":521,"t":{"49":{"position":[[189,13]]}}}],["compatible",{"_index":1326,"t":{"183":{"position":[[118,10]]},"260":{"position":[[118,10]]}}}],["complete",{"_index":1331,"t":{"187":{"position":[[6,8]]},"191":{"position":[[154,8]]},"264":{"position":[[6,8]]}}}],["completing",{"_index":1006,"t":{"124":{"position":[[212,10]]}}}],["complex",{"_index":23,"t":{"3":{"position":[[259,7]]},"55":{"position":[[267,7]]},"65":{"position":[[318,7]]}}}],["compose",{"_index":1318,"t":{"175":{"position":[[643,7]]}}}],["compose.yml",{"_index":1300,"t":{"175":{"position":[[105,11]]}}}],["compress/2174925f24362c479b2.jpg",{"_index":798,"t":{"88":{"position":[[795,33]]}}}],["compression",{"_index":1404,"t":{"222":{"position":[[279,11]]}}}],["computer",{"_index":3,"t":{"3":{"position":[[32,9]]},"7":{"position":[[982,8],[1191,8]]},"53":{"position":[[30,8],[200,8]]},"55":{"position":[[14,8]]},"57":{"position":[[26,8]]},"59":{"position":[[14,8],[196,8]]},"61":{"position":[[14,8]]},"63":{"position":[[55,8]]},"75":{"position":[[63,8]]},"91":{"position":[[16,8]]},"93":{"position":[[343,8]]},"163":{"position":[[1876,8]]},"171":{"position":[[72,9]]},"173":{"position":[[25,8]]},"175":{"position":[[23,9]]},"246":{"position":[[245,8]]}}}],["computer's",{"_index":1342,"t":{"191":{"position":[[269,10]]}}}],["computing",{"_index":87,"t":{"7":{"position":[[839,9]]},"95":{"position":[[123,10]]}}}],["confidence",{"_index":58,"t":{"7":{"position":[[345,10],[455,10]]},"65":{"position":[[564,10],[662,10],[791,10],[1319,10],[1469,10],[1530,10],[1617,10],[1908,10],[2235,10],[2294,10]]},"88":{"position":[[497,10]]},"93":{"position":[[142,11],[641,11]]},"120":{"position":[[534,11]]},"169":{"position":[[1563,10]]}}}],["confidence_threshold=0.8",{"_index":1246,"t":{"169":{"position":[[1598,25]]}}}],["confidence_threshold=0.95",{"_index":686,"t":{"65":{"position":[[1232,26]]}}}],["confidence_threshold=confidence",{"_index":973,"t":{"120":{"position":[[1059,32]]}}}],["confident",{"_index":249,"t":{"15":{"position":[[1125,9]]},"65":{"position":[[875,9]]}}}],["configuration",{"_index":1291,"t":{"171":{"position":[[86,13]]}}}],["configure",{"_index":57,"t":{"7":{"position":[[274,10]]},"19":{"position":[[332,9]]},"21":{"position":[[3,9]]},"158":{"position":[[449,9],[702,9]]}}}],["configuring",{"_index":66,"t":{"7":{"position":[[431,11]]}}}],["confirm",{"_index":924,"t":{"112":{"position":[[94,7]]}}}],["conflicts",{"_index":1410,"t":{"224":{"position":[[129,9]]}}}],["connected",{"_index":1190,"t":{"163":{"position":[[1861,9]]},"165":{"position":[[69,9]]},"173":{"position":[[9,9]]},"193":{"position":[[69,9]]}}}],["consider",{"_index":403,"t":{"31":{"position":[[0,8]]},"252":{"position":[[239,8]]}}}],["considered",{"_index":1039,"t":{"134":{"position":[[114,10]]}}}],["consist",{"_index":856,"t":{"100":{"position":[[228,7]]}}}],["constrained",{"_index":1396,"t":{"222":{"position":[[27,12],[394,11]]}}}],["constructor",{"_index":306,"t":{"21":{"position":[[115,11]]},"104":{"position":[[504,11],[596,12]]}}}],["container",{"_index":725,"t":{"69":{"position":[[108,9]]}}}],["containers",{"_index":268,"t":{"19":{"position":[[42,10]]}}}],["contains",{"_index":349,"t":{"25":{"position":[[456,8],[546,8]]}}}],["content",{"_index":1022,"t":{"130":{"position":[[105,8]]}}}],["content/uploads/2010/11/over_flowing_garbage_can.jpg",{"_index":681,"t":{"65":{"position":[[1041,53]]}}}],["context",{"_index":419,"t":{"33":{"position":[[93,7]]},"138":{"position":[[72,8]]}}}],["continue",{"_index":1255,"t":{"169":{"position":[[1823,8],[1921,8],[2088,8]]}}}],["control",{"_index":61,"t":{"7":{"position":[[378,7]]},"53":{"position":[[344,8]]},"59":{"position":[[252,8]]},"61":{"position":[[367,7]]},"65":{"position":[[38,7]]},"102":{"position":[[219,7]]}}}],["conversion",{"_index":1407,"t":{"222":{"position":[[432,10]]}}}],["convert",{"_index":535,"t":{"49":{"position":[[726,7]]},"169":{"position":[[539,7]]},"197":{"position":[[426,7]]},"222":{"position":[[190,7]]}}}],["convey",{"_index":1033,"t":{"132":{"position":[[372,8]]}}}],["conveyor",{"_index":1017,"t":{"127":{"position":[[312,8]]}}}],["copy",{"_index":908,"t":{"108":{"position":[[211,4],[326,4]]},"175":{"position":[[144,4]]}}}],["corresponding",{"_index":1000,"t":{"124":{"position":[[76,13]]}}}],["cost",{"_index":260,"t":{"17":{"position":[[176,5]]},"71":{"position":[[166,4]]}}}],["costs",{"_index":702,"t":{"65":{"position":[[1677,6]]}}}],["couch",{"_index":1337,"t":{"191":{"position":[[99,6],[206,6],[325,6]]},"193":{"position":[[140,5]]},"197":{"position":[[1028,5],[1236,8],[1593,6]]}}}],["counter",{"_index":1124,"t":{"163":{"position":[[127,7],[392,7],[608,8],[1151,7],[1370,7],[1477,7],[1792,8],[1989,7]]},"169":{"position":[[1514,10],[2481,7],[2839,7],[3067,8]]}}}],["counter's",{"_index":1288,"t":{"169":{"position":[[3134,9]]}}}],["couple",{"_index":884,"t":{"104":{"position":[[12,6]]}}}],["covers",{"_index":320,"t":{"23":{"position":[[113,6]]}}}],["create",{"_index":16,"t":{"3":{"position":[[184,6]]},"7":{"position":[[266,7]]},"39":{"position":[[223,6]]},"47":{"position":[[281,6]]},"71":{"position":[[193,6]]},"78":{"position":[[153,6]]},"97":{"position":[[152,6],[314,6]]},"108":{"position":[[82,7],[195,7]]},"175":{"position":[[73,6]]}}}],["create_detector(name",{"_index":760,"t":{"78":{"position":[[264,21]]}}}],["created",{"_index":754,"t":{"78":{"position":[[122,7]]}}}],["creates",{"_index":1128,"t":{"163":{"position":[[184,7]]}}}],["creating",{"_index":404,"t":{"31":{"position":[[9,8]]},"78":{"position":[[219,8]]},"110":{"position":[[156,8]]},"191":{"position":[[143,8]]}}}],["creation",{"_index":525,"t":{"49":{"position":[[299,10]]}}}],["crowded",{"_index":1179,"t":{"163":{"position":[[1531,7]]}}}],["curl",{"_index":1110,"t":{"158":{"position":[[442,4],[609,4]]}}}],["current",{"_index":913,"t":{"110":{"position":[[51,7]]},"246":{"position":[[493,7]]}}}],["current_hour",{"_index":1240,"t":{"169":{"position":[[1265,12],[1328,12],[2539,12],[2577,12]]}}}],["current_time",{"_index":1266,"t":{"169":{"position":[[2274,12]]}}}],["current_time.strftime(\"%i%p",{"_index":1270,"t":{"169":{"position":[[2373,29]]}}}],["currently",{"_index":807,"t":{"91":{"position":[[405,9]]}}}],["custom",{"_index":405,"t":{"31":{"position":[[18,6]]}}}],["customer",{"_index":1132,"t":{"163":{"position":[[260,9],[844,8],[1047,8],[1415,8],[1568,8],[1614,8],[2103,8]]},"169":{"position":[[1490,8],[3039,8]]}}}],["customers",{"_index":1125,"t":{"163":{"position":[[138,9],[769,10],[1125,9],[1339,9]]}}}],["customize",{"_index":1212,"t":{"169":{"position":[[709,9]]}}}],["cutting",{"_index":573,"t":{"53":{"position":[[187,7]]}}}],["cv2",{"_index":173,"t":{"11":{"position":[[951,3]]},"45":{"position":[[322,3]]},"169":{"position":[[174,3]]},"197":{"position":[[174,3]]}}}],["cv2.color_bgr2rgb",{"_index":1211,"t":{"169":{"position":[[603,19]]},"197":{"position":[[490,19]]}}}],["cv2.videocapture(0",{"_index":180,"t":{"11":{"position":[[1068,19]]},"45":{"position":[[332,19]]},"169":{"position":[[471,19]]},"197":{"position":[[358,19]]}}}],["d",{"_index":334,"t":{"25":{"position":[[228,1]]},"65":{"position":[[1156,1]]},"88":{"position":[[670,1]]}}}],["daily",{"_index":1140,"t":{"163":{"position":[[448,5],[2009,5]]},"165":{"position":[[132,5]]},"169":{"position":[[671,5],[2650,6],[3203,5]]}}}],["daily_log",{"_index":1248,"t":{"169":{"position":[[1644,9],[2617,9],[2680,10],[2879,9]]}}}],["daily_log.append(msg",{"_index":1275,"t":{"169":{"position":[[2508,21]]}}}],["daily_summary",{"_index":1276,"t":{"169":{"position":[[2634,13],[2691,13]]}}}],["dashboard",{"_index":305,"t":{"19":{"position":[[830,10]]}}}],["data",{"_index":498,"t":{"47":{"position":[[212,4]]},"65":{"position":[[2016,4]]},"93":{"position":[[103,5]]},"163":{"position":[[1269,4]]},"197":{"position":[[804,4],[838,5],[863,4]]}}}],["database",{"_index":164,"t":{"11":{"position":[[735,9],[831,8],[1351,8]]},"13":{"position":[[415,8]]}}}],["dataset",{"_index":783,"t":{"88":{"position":[[160,8]]},"93":{"position":[[446,8]]}}}],["date",{"_index":921,"t":{"110":{"position":[[250,4]]}}}],["datetime",{"_index":1198,"t":{"169":{"position":[[256,8],[272,9]]}}}],["datetime.now",{"_index":1261,"t":{"169":{"position":[[2144,14]]}}}],["datetime.now().hour",{"_index":1241,"t":{"169":{"position":[[1280,19],[2554,19]]}}}],["datetime.now().replace(hour=start_of_business",{"_index":1267,"t":{"169":{"position":[[2289,46]]}}}],["datetime.now().replace(minute=0",{"_index":1250,"t":{"169":{"position":[[1679,32]]}}}],["day",{"_index":1127,"t":{"163":{"position":[[163,4],[429,4],[891,3]]},"169":{"position":[[3184,4]]}}}],["days",{"_index":1151,"t":{"163":{"position":[[907,4]]}}}],["db.get_next_image_query_id",{"_index":210,"t":{"13":{"position":[[428,28],[666,28],[1219,28]]}}}],["db.save(image_query.id",{"_index":171,"t":{"11":{"position":[[883,24],[1296,23]]}}}],["debian",{"_index":1082,"t":{"156":{"position":[[92,6]]}}}],["debug",{"_index":421,"t":{"33":{"position":[[133,5]]}}}],["debugging",{"_index":346,"t":{"25":{"position":[[413,9]]},"29":{"position":[[150,9]]}}}],["decades",{"_index":519,"t":{"49":{"position":[[173,7]]}}}],["decisions",{"_index":1170,"t":{"163":{"position":[[1281,9],[2061,9]]}}}],["def",{"_index":956,"t":{"120":{"position":[[454,3]]},"169":{"position":[[444,3],[765,3],[1233,3]]},"197":{"position":[[331,3],[578,3]]}}}],["default",{"_index":183,"t":{"11":{"position":[[1118,7]]},"37":{"position":[[202,7]]},"45":{"position":[[382,7]]},"158":{"position":[[38,8],[489,7]]},"220":{"position":[[199,7]]},"224":{"position":[[51,8]]}}}],["defaults",{"_index":763,"t":{"82":{"position":[[57,8]]},"86":{"position":[[57,8]]}}}],["defects",{"_index":622,"t":{"59":{"position":[[153,7]]}}}],["define",{"_index":1204,"t":{"169":{"position":[[376,6],[641,6],[1119,6]]},"197":{"position":[[263,6],[528,6]]}}}],["definitions",{"_index":1439,"t":{"250":{"position":[[153,12]]}}}],["degrade",{"_index":1387,"t":{"218":{"position":[[336,8]]}}}],["delay",{"_index":1247,"t":{"169":{"position":[[1624,5]]}}}],["delayed",{"_index":662,"t":{"65":{"position":[[408,7]]}}}],["delete",{"_index":923,"t":{"112":{"position":[[59,8]]}}}],["demonstrates",{"_index":740,"t":{"73":{"position":[[90,12]]},"163":{"position":[[13,12]]}}}],["dependent",{"_index":1411,"t":{"224":{"position":[[150,9]]}}}],["depends_on",{"_index":1307,"t":{"175":{"position":[[289,11]]}}}],["deploy",{"_index":86,"t":{"7":{"position":[[812,6]]},"171":{"position":[[27,6]]},"246":{"position":[[56,6],[123,6]]}}}],["deployed",{"_index":116,"t":{"9":{"position":[[288,8]]},"248":{"position":[[62,8]]}}}],["deployment",{"_index":1415,"t":{"244":{"position":[[40,10]]}}}],["depth",{"_index":40,"t":{"7":{"position":[[12,5]]}}}],["described",{"_index":1092,"t":{"156":{"position":[[375,9]]},"213":{"position":[[233,9]]},"240":{"position":[[178,9]]}}}],["description",{"_index":351,"t":{"25":{"position":[[475,11]]}}}],["descriptive",{"_index":907,"t":{"108":{"position":[[134,11]]},"110":{"position":[[121,11]]}}}],["designed",{"_index":1418,"t":{"246":{"position":[[13,8]]}}}],["desired",{"_index":67,"t":{"7":{"position":[[447,7]]},"65":{"position":[[556,7],[783,7],[1900,7]]}}}],["desk",{"_index":1129,"t":{"163":{"position":[[232,4]]}}}],["despite",{"_index":441,"t":{"37":{"position":[[109,7]]}}}],["det",{"_index":465,"t":{"43":{"position":[[170,3]]},"91":{"position":[[125,3]]},"97":{"position":[[400,3]]}}}],["detailed",{"_index":34,"t":{"3":{"position":[[396,8]]}}}],["detect",{"_index":554,"t":{"49":{"position":[[1119,6]]}}}],["detected",{"_index":1285,"t":{"169":{"position":[[3051,8]]},"191":{"position":[[190,8]]},"197":{"position":[[1220,8],[1577,8]]}}}],["detection",{"_index":22,"t":{"3":{"position":[[246,9]]}}}],["detector",{"_index":175,"t":{"11":{"position":[[978,8]]},"13":{"position":[[565,8]]},"15":{"position":[[526,8]]},"65":{"position":[[624,9]]},"71":{"position":[[116,8]]},"78":{"position":[[98,8],[234,8],[365,8]]},"80":{"position":[[55,8]]},"120":{"position":[[697,8],[875,8],[996,8]]},"127":{"position":[[202,8]]},"163":{"position":[[194,8],[284,8]]},"169":{"position":[[1411,8]]},"197":{"position":[[993,8],[1034,10]]},"244":{"position":[[56,8]]},"246":{"position":[[80,8],[135,8],[311,8]]},"248":{"position":[[71,9]]}}}],["detector=detector",{"_index":1258,"t":{"169":{"position":[[1975,18]]},"197":{"position":[[1136,18]]}}}],["detector_name",{"_index":959,"t":{"120":{"position":[[488,14],[834,14],[1710,13],[1724,15]]}}}],["detectors",{"_index":55,"t":{"7":{"position":[[242,10],[293,9],[481,10]]},"82":{"position":[[89,9],[166,9]]},"114":{"position":[[42,9]]},"127":{"position":[[19,10]]},"171":{"position":[[51,9]]}}}],["detects",{"_index":1384,"t":{"218":{"position":[[224,7]]}}}],["determines",{"_index":668,"t":{"65":{"position":[[639,10]]}}}],["dev/bus/usb:/dev/bus/usb",{"_index":1317,"t":{"175":{"position":[[557,25]]}}}],["dev/video0:/dev/video0",{"_index":1311,"t":{"175":{"position":[[427,23]]}}}],["dev/video1:/dev/video1",{"_index":1312,"t":{"175":{"position":[[453,23]]}}}],["dev/video2:/dev/video2",{"_index":1313,"t":{"175":{"position":[[479,23]]}}}],["dev/video3:/dev/video3",{"_index":1314,"t":{"175":{"position":[[505,23]]}}}],["developed",{"_index":518,"t":{"49":{"position":[[163,9]]}}}],["development",{"_index":1294,"t":{"171":{"position":[[150,11]]}}}],["device",{"_index":269,"t":{"19":{"position":[[65,8],[84,6],[115,7]]},"124":{"position":[[199,6]]},"175":{"position":[[745,7],[799,7]]},"246":{"position":[[436,7]]}}}],["devices",{"_index":254,"t":{"17":{"position":[[90,8]]},"61":{"position":[[291,7]]},"175":{"position":[[416,8]]},"177":{"position":[[70,8]]},"218":{"position":[[54,8]]}}}],["difference",{"_index":297,"t":{"19":{"position":[[590,10]]},"49":{"position":[[814,10],[1080,10]]}}}],["different",{"_index":329,"t":{"25":{"position":[[97,9]]},"51":{"position":[[32,9],[265,9]]},"136":{"position":[[37,9],[63,9]]}}}],["differentiate",{"_index":408,"t":{"31":{"position":[[99,13]]}}}],["difficult",{"_index":399,"t":{"29":{"position":[[160,9]]}}}],["directly",{"_index":462,"t":{"43":{"position":[[42,8]]},"45":{"position":[[272,8]]},"88":{"position":[[415,9]]},"102":{"position":[[61,8]]},"104":{"position":[[568,8]]},"224":{"position":[[209,9]]}}}],["directory",{"_index":989,"t":{"120":{"position":[[1620,9]]},"175":{"position":[[133,10],[625,10]]}}}],["discover",{"_index":85,"t":{"7":{"position":[[796,8]]}}}],["display",{"_index":1065,"t":{"150":{"position":[[52,7]]},"207":{"position":[[52,7]]},"234":{"position":[[52,7]]}}}],["displaying",{"_index":442,"t":{"37":{"position":[[144,10]]}}}],["distribution's",{"_index":1079,"t":{"156":{"position":[[9,14]]}}}],["distutils",{"_index":1109,"t":{"158":{"position":[[432,9]]}}}],["dlp",{"_index":942,"t":{"118":{"position":[[146,3]]},"120":{"position":[[85,3]]}}}],["dnf",{"_index":1088,"t":{"156":{"position":[[221,3]]}}}],["docker",{"_index":267,"t":{"19":{"position":[[35,6]]},"69":{"position":[[101,6],[203,6],[228,6]]},"175":{"position":[[8,6],[98,6],[636,6]]},"185":{"position":[[12,6],[74,6],[165,6]]},"262":{"position":[[12,6],[73,6],[164,6]]}}}],["docker's",{"_index":1298,"t":{"175":{"position":[[37,8]]}}}],["docker.io/groundlight/monitoring",{"_index":1303,"t":{"175":{"position":[[199,32],[327,32]]}}}],["docs/static/img/doorway.jpg",{"_index":803,"t":{"91":{"position":[[209,31]]},"97":{"position":[[484,31]]}}}],["document",{"_index":1338,"t":{"191":{"position":[[111,8]]}}}],["documentation",{"_index":134,"t":{"11":{"position":[[174,13]]},"15":{"position":[[448,13]]},"160":{"position":[[159,13]]},"215":{"position":[[159,13]]},"242":{"position":[[159,13]]},"266":{"position":[[159,13]]}}}],["doesn't",{"_index":756,"t":{"78":{"position":[[176,7]]}}}],["dog",{"_index":1336,"t":{"191":{"position":[[87,3],[183,3],[306,3],[378,3]]},"193":{"position":[[152,3]]},"197":{"position":[[1570,3]]}}}],["dog_on_couch_detector.py",{"_index":1376,"t":{"197":{"position":[[1682,24],[1726,24]]}}}],["domain.com/wp",{"_index":680,"t":{"65":{"position":[[1027,13]]}}}],["don't",{"_index":891,"t":{"104":{"position":[[339,5]]},"138":{"position":[[47,5]]},"222":{"position":[[474,5],[520,5]]},"246":{"position":[[451,5]]}}}],["done",{"_index":162,"t":{"11":{"position":[[724,4]]},"171":{"position":[[103,4]]},"222":{"position":[[446,4]]}}}],["door",{"_index":738,"t":{"73":{"position":[[56,4],[138,4],[183,4],[220,4]]}}}],["doorway",{"_index":795,"t":{"88":{"position":[[730,7]]},"91":{"position":[[187,7]]},"97":{"position":[[462,7]]}}}],["download",{"_index":253,"t":{"17":{"position":[[51,8]]},"120":{"position":[[142,8]]},"158":{"position":[[581,8]]},"213":{"position":[[0,8]]},"240":{"position":[[0,8]]}}}],["downloading",{"_index":278,"t":{"19":{"position":[[205,11]]}}}],["driven",{"_index":1169,"t":{"163":{"position":[[1274,6]]}}}],["due",{"_index":371,"t":{"25":{"position":[[812,3]]},"88":{"position":[[483,3]]}}}],["during",{"_index":317,"t":{"23":{"position":[[85,6]]},"25":{"position":[[26,6]]},"73":{"position":[[252,6]]},"163":{"position":[[723,6]]}}}],["e",{"_index":344,"t":{"25":{"position":[[386,2]]},"169":{"position":[[2023,2],[2064,5]]},"197":{"position":[[1297,2],[1338,5]]}}}],["e.g",{"_index":414,"t":{"33":{"position":[[43,6]]},"154":{"position":[[140,6]]},"169":{"position":[[1192,4],[1224,4]]},"193":{"position":[[112,6]]},"211":{"position":[[140,6]]},"238":{"position":[[146,6]]}}}],["e.reason",{"_index":348,"t":{"25":{"position":[[447,8],[522,12]]}}}],["e.status",{"_index":354,"t":{"25":{"position":[[537,8],[602,12]]}}}],["each",{"_index":919,"t":{"110":{"position":[[224,4]]}}}],["earlier",{"_index":1093,"t":{"156":{"position":[[385,8]]},"213":{"position":[[243,8]]},"240":{"position":[[188,8]]}}}],["early",{"_index":451,"t":{"39":{"position":[[97,5]]},"51":{"position":[[115,5]]}}}],["easiest",{"_index":1100,"t":{"158":{"position":[[171,7]]},"171":{"position":[[12,7]]}}}],["easily",{"_index":631,"t":{"61":{"position":[[48,6]]},"65":{"position":[[387,6]]},"108":{"position":[[163,6]]}}}],["easy",{"_index":79,"t":{"7":{"position":[[653,4]]},"69":{"position":[[89,4]]},"246":{"position":[[36,4]]}}}],["edge",{"_index":84,"t":{"7":{"position":[[790,5],[834,4]]},"17":{"position":[[30,4],[85,4],[152,5]]},"19":{"position":[[4,4],[59,5],[79,4],[172,4],[310,4],[373,4],[502,4],[639,4],[764,6],[771,4]]},"21":{"position":[[44,4]]},"53":{"position":[[195,4]]},"95":{"position":[[118,4]]},"218":{"position":[[49,4]]}}}],["effectively",{"_index":422,"t":{"33":{"position":[[151,11]]}}}],["effectiveness",{"_index":1166,"t":{"163":{"position":[[1189,13]]}}}],["efficiency",{"_index":578,"t":{"53":{"position":[[306,11]]}}}],["efficient",{"_index":600,"t":{"55":{"position":[[324,10]]}}}],["elif",{"_index":223,"t":{"13":{"position":[[984,4],[1063,4]]}}}],["email",{"_index":1193,"t":{"163":{"position":[[2023,6]]},"165":{"position":[[89,5]]},"169":{"position":[[685,6]]},"248":{"position":[[81,5]]}}}],["email.mime.multipart",{"_index":1200,"t":{"169":{"position":[[297,20]]}}}],["email.mime.text",{"_index":1202,"t":{"169":{"position":[[344,15]]}}}],["emails",{"_index":1139,"t":{"163":{"position":[[437,6]]},"169":{"position":[[3192,6]]}}}],["employees",{"_index":1147,"t":{"163":{"position":[[699,9]]}}}],["enables",{"_index":9,"t":{"3":{"position":[[90,7]]}}}],["enabling",{"_index":567,"t":{"53":{"position":[[107,8]]},"55":{"position":[[198,8]]},"163":{"position":[[2030,8]]}}}],["encounter",{"_index":316,"t":{"23":{"position":[[61,9]]}}}],["encourage",{"_index":1172,"t":{"163":{"position":[[1329,9]]}}}],["encrypted",{"_index":874,"t":{"102":{"position":[[362,9]]}}}],["end",{"_index":1095,"t":{"158":{"position":[[56,3]]},"163":{"position":[[418,3]]},"169":{"position":[[3173,3]]},"187":{"position":[[15,3],[22,3]]},"193":{"position":[[183,3],[190,3]]},"264":{"position":[[15,3],[22,3]]}}}],["end_of_business",{"_index":1236,"t":{"169":{"position":[[1201,15],[1343,15],[2593,15]]}}}],["endpoint",{"_index":264,"t":{"19":{"position":[[9,8],[177,8],[315,9],[414,9],[507,9],[644,8]]},"21":{"position":[[49,9],[83,8]]}}}],["endpoint's",{"_index":284,"t":{"19":{"position":[[378,10]]}}}],["energy",{"_index":263,"t":{"17":{"position":[[205,7]]}}}],["engagement",{"_index":1161,"t":{"163":{"position":[[1056,11]]}}}],["enhance",{"_index":635,"t":{"61":{"position":[[128,7]]}}}],["enhancing",{"_index":577,"t":{"53":{"position":[[296,9]]}}}],["enough",{"_index":818,"t":{"93":{"position":[[135,6]]},"163":{"position":[[692,6]]}}}],["ensure",{"_index":438,"t":{"37":{"position":[[61,6]]},"39":{"position":[[15,6],[107,6]]},"118":{"position":[[0,6]]},"144":{"position":[[0,6]]},"167":{"position":[[0,6]]},"179":{"position":[[0,6]]},"195":{"position":[[0,6]]},"201":{"position":[[0,6]]},"228":{"position":[[0,6]]},"256":{"position":[[0,6]]}}}],["ensuring",{"_index":619,"t":{"59":{"position":[[66,8]]},"163":{"position":[[678,8],[1801,8]]}}}],["environment",{"_index":311,"t":{"21":{"position":[[259,11]]},"61":{"position":[[401,12]]},"97":{"position":[[220,11]]},"102":{"position":[[383,11]]},"104":{"position":[[60,11],[155,11],[442,11]]},"169":{"position":[[752,12]]}}}],["environments",{"_index":88,"t":{"7":{"position":[[849,12]]}}}],["equipment",{"_index":593,"t":{"55":{"position":[[184,10]]}}}],["error",{"_index":325,"t":{"25":{"position":[[20,5],[494,5],[990,6],[1000,5]]},"33":{"position":[[50,6]]},"37":{"position":[[158,5]]},"39":{"position":[[32,5]]}}}],["errors",{"_index":71,"t":{"7":{"position":[[508,7],[563,6]]},"23":{"position":[[78,6],[139,6]]},"31":{"position":[[73,7],[121,6]]},"35":{"position":[[87,7]]},"37":{"position":[[117,7]]},"39":{"position":[[147,6],[287,6]]}}}],["escalate",{"_index":656,"t":{"65":{"position":[[256,8]]}}}],["escalated",{"_index":671,"t":{"65":{"position":[[734,10],[1939,9]]},"93":{"position":[[238,9]]}}}],["escalation",{"_index":666,"t":{"65":{"position":[[595,10]]},"88":{"position":[[197,10],[466,10]]},"95":{"position":[[14,10]]}}}],["esp32",{"_index":1005,"t":{"124":{"position":[[186,5]]},"244":{"position":[[71,5]]},"246":{"position":[[95,5],[216,5],[328,5]]},"250":{"position":[[45,5],[174,5],[223,5],[266,5]]},"252":{"position":[[70,6]]}}}],["esp32s3",{"_index":1446,"t":{"250":{"position":[[304,7]]}}}],["etc",{"_index":416,"t":{"33":{"position":[[66,5]]}}}],["evaluations",{"_index":258,"t":{"17":{"position":[[133,11]]}}}],["even",{"_index":274,"t":{"19":{"position":[[147,4]]},"93":{"position":[[405,4]]},"185":{"position":[[60,4]]},"262":{"position":[[59,4]]}}}],["event",{"_index":1287,"t":{"169":{"position":[[3088,6]]}}}],["example",{"_index":114,"t":{"9":{"position":[[254,8]]},"11":{"position":[[796,8]]},"13":{"position":[[331,8]]},"43":{"position":[[84,8]]},"49":{"position":[[966,7]]},"65":{"position":[[749,8]]},"84":{"position":[[71,8],[126,8]]},"114":{"position":[[8,7]]},"132":{"position":[[74,8]]},"163":{"position":[[5,7]]},"187":{"position":[[26,7]]},"191":{"position":[[20,7]]},"264":{"position":[[26,7]]}}}],["examples",{"_index":39,"t":{"5":{"position":[[44,8]]},"67":{"position":[[41,8]]},"127":{"position":[[586,9]]}}}],["exceeded",{"_index":383,"t":{"25":{"position":[[959,8]]}}}],["except",{"_index":290,"t":{"19":{"position":[[517,6]]},"25":{"position":[[363,6]]},"169":{"position":[[2003,6]]},"197":{"position":[[1277,6]]}}}],["exception",{"_index":331,"t":{"25":{"position":[[126,10]]},"29":{"position":[[124,10]]},"31":{"position":[[25,9]]},"169":{"position":[[2010,9]]},"197":{"position":[[1284,9]]}}}],["exceptions",{"_index":324,"t":{"23":{"position":[[195,11]]},"27":{"position":[[77,10]]},"29":{"position":[[24,10],[108,10]]},"33":{"position":[[4,10]]},"35":{"position":[[14,11]]},"37":{"position":[[23,11]]},"39":{"position":[[304,10]]}}}],["execute",{"_index":703,"t":{"65":{"position":[[1702,7]]}}}],["executing",{"_index":710,"t":{"65":{"position":[[1855,10]]}}}],["existing",{"_index":640,"t":{"61":{"position":[[260,8]]},"78":{"position":[[89,8]]},"88":{"position":[[151,8]]}}}],["exists",{"_index":757,"t":{"78":{"position":[[184,7]]}}}],["exited",{"_index":978,"t":{"120":{"position":[[1258,6]]}}}],["expect",{"_index":393,"t":{"29":{"position":[[44,6]]}}}],["expected",{"_index":450,"t":{"39":{"position":[[56,9]]},"45":{"position":[[227,8]]},"49":{"position":[[613,9]]}}}],["expects",{"_index":514,"t":{"49":{"position":[[12,7]]}}}],["experience",{"_index":1182,"t":{"163":{"position":[[1623,10],[2112,11]]}}}],["explore",{"_index":719,"t":{"67":{"position":[[0,7]]},"163":{"position":[[1381,7]]}}}],["exploring",{"_index":97,"t":{"7":{"position":[[1052,9]]}}}],["exponential",{"_index":427,"t":{"35":{"position":[[53,11]]}}}],["export",{"_index":313,"t":{"21":{"position":[[286,6]]},"97":{"position":[[260,6]]}}}],["extra",{"_index":1104,"t":{"158":{"position":[[292,5]]}}}],["extremely",{"_index":1394,"t":{"222":{"position":[[11,9]]}}}],["f\"hourly",{"_index":1272,"t":{"169":{"position":[[2420,8]]}}}],["f\"{msg}\\n",{"_index":1278,"t":{"169":{"position":[[2708,10]]}}}],["factory",{"_index":1054,"t":{"140":{"position":[[151,7]]}}}],["falling",{"_index":444,"t":{"37":{"position":[[184,7]]}}}],["fast",{"_index":704,"t":{"65":{"position":[[1732,4]]}}}],["faster",{"_index":294,"t":{"19":{"position":[[557,6]]},"65":{"position":[[544,7]]},"93":{"position":[[622,6]]}}}],["features",{"_index":560,"t":{"51":{"position":[[159,8]]},"218":{"position":[[395,9]]}}}],["fedora",{"_index":1087,"t":{"156":{"position":[[194,6]]}}}],["few",{"_index":781,"t":{"88":{"position":[[105,3]]},"91":{"position":[[49,3]]},"127":{"position":[[551,3]]},"246":{"position":[[154,3]]}}}],["ffmpeg",{"_index":940,"t":{"118":{"position":[[136,6]]},"120":{"position":[[69,6]]}}}],["field",{"_index":153,"t":{"11":{"position":[[488,5]]}}}],["file",{"_index":804,"t":{"91":{"position":[[258,4]]},"97":{"position":[[533,4]]},"120":{"position":[[223,4]]},"175":{"position":[[86,4]]},"193":{"position":[[107,4]]}}}],["files",{"_index":565,"t":{"51":{"position":[[339,5],[351,5]]}}}],["find",{"_index":37,"t":{"5":{"position":[[21,4]]},"78":{"position":[[81,4]]},"104":{"position":[[39,4]]},"122":{"position":[[73,4]]},"244":{"position":[[99,4]]}}}],["finished",{"_index":709,"t":{"65":{"position":[[1846,8]]}}}],["firmware",{"_index":1435,"t":{"250":{"position":[[108,8]]}}}],["first",{"_index":780,"t":{"88":{"position":[[76,5]]},"93":{"position":[[16,5],[421,5],[458,5]]},"132":{"position":[[307,5]]},"169":{"position":[[0,6]]},"197":{"position":[[0,6]]}}}],["float",{"_index":960,"t":{"120":{"position":[[546,5]]}}}],["floats",{"_index":496,"t":{"47":{"position":[[194,8]]}}}],["floor",{"_index":1055,"t":{"140":{"position":[[159,7]]}}}],["follow",{"_index":388,"t":{"27":{"position":[[39,6]]},"91":{"position":[[493,6]]},"124":{"position":[[45,6]]}}}],["followed",{"_index":861,"t":{"100":{"position":[[273,8]]}}}],["following",{"_index":45,"t":{"7":{"position":[[101,9]]},"39":{"position":[[183,9]]},"110":{"position":[[82,9]]},"144":{"position":[[25,9]]},"146":{"position":[[90,9]]},"148":{"position":[[50,9]]},"150":{"position":[[89,9]]},"152":{"position":[[74,9]]},"175":{"position":[[153,9],[591,9],[826,9]]},"179":{"position":[[25,9]]},"181":{"position":[[97,9]]},"183":{"position":[[50,9]]},"201":{"position":[[25,9]]},"203":{"position":[[90,9]]},"205":{"position":[[50,9]]},"207":{"position":[[89,9]]},"209":{"position":[[74,9]]},"228":{"position":[[25,9]]},"230":{"position":[[90,9]]},"232":{"position":[[50,9]]},"234":{"position":[[89,9]]},"236":{"position":[[74,9]]},"248":{"position":[[22,9]]},"250":{"position":[[16,9]]},"256":{"position":[[25,9]]},"258":{"position":[[96,9]]},"260":{"position":[[50,9]]}}}],["follows",{"_index":483,"t":{"45":{"position":[[306,8]]},"158":{"position":[[265,7]]}}}],["forbidden",{"_index":369,"t":{"25":{"position":[[774,10]]}}}],["force",{"_index":759,"t":{"78":{"position":[[213,5]]},"222":{"position":[[488,5]]}}}],["form",{"_index":966,"t":{"120":{"position":[[778,4]]}}}],["format",{"_index":487,"t":{"47":{"position":[[90,6]]},"49":{"position":[[222,6]]},"222":{"position":[[220,6],[369,7]]}}}],["formats",{"_index":456,"t":{"41":{"position":[[49,8]]}}}],["formatted_time",{"_index":1269,"t":{"169":{"position":[[2356,14],[2441,17]]}}}],["forward",{"_index":115,"t":{"9":{"position":[[280,7]]}}}],["found",{"_index":375,"t":{"25":{"position":[[854,6],[892,5]]}}}],["frame",{"_index":190,"t":{"11":{"position":[[1181,5],[1275,5]]},"45":{"position":[[400,5],[433,5],[471,6],[489,5]]},"120":{"position":[[167,5],[621,5]]},"169":{"position":[[496,5]]},"197":{"position":[[383,5]]}}}],["framegrab",{"_index":558,"t":{"51":{"position":[[74,9],[93,9],[218,9]]}}}],["frontend",{"_index":1302,"t":{"175":{"position":[[182,9]]}}}],["frontend:latest",{"_index":1304,"t":{"175":{"position":[[252,15]]}}}],["full",{"_index":133,"t":{"11":{"position":[[169,4]]},"65":{"position":[[1224,7]]},"102":{"position":[[214,4]]},"132":{"position":[[121,6]]}}}],["function",{"_index":211,"t":{"13":{"position":[[471,8]]},"169":{"position":[[385,8],[650,8],[2971,9],[3234,9]]},"197":{"position":[[272,8],[537,8],[1500,9],[1653,9]]}}}],["functional",{"_index":440,"t":{"37":{"position":[[98,10]]}}}],["functionality",{"_index":1398,"t":{"222":{"position":[[144,14]]}}}],["further",{"_index":712,"t":{"65":{"position":[[1953,7]]}}}],["future",{"_index":787,"t":{"88":{"position":[[309,7]]},"91":{"position":[[468,6]]}}}],["g",{"_index":947,"t":{"120":{"position":[[90,1]]}}}],["gather",{"_index":826,"t":{"93":{"position":[[427,6]]}}}],["generally",{"_index":696,"t":{"65":{"position":[[1576,9]]},"158":{"position":[[72,9]]}}}],["generated",{"_index":717,"t":{"65":{"position":[[2191,9]]},"108":{"position":[[220,9]]}}}],["generative",{"_index":833,"t":{"95":{"position":[[58,10]]}}}],["get_image",{"_index":342,"t":{"25":{"position":[[341,12]]}}}],["get_image_query",{"_index":203,"t":{"13":{"position":[[169,16]]},"88":{"position":[[375,17]]}}}],["get_latest_frame.sh",{"_index":945,"t":{"120":{"position":[[36,20],[1633,19]]}}}],["get_off_couch.mp3",{"_index":1349,"t":{"193":{"position":[[119,18]]}}}],["get_or_create_detector(name",{"_index":749,"t":{"78":{"position":[[25,28]]}}}],["get_token_from_secure_location",{"_index":897,"t":{"104":{"position":[[718,32]]}}}],["gets",{"_index":869,"t":{"102":{"position":[[176,4]]}}}],["github",{"_index":720,"t":{"67":{"position":[[14,6]]},"187":{"position":[[75,6]]},"252":{"position":[[97,6],[272,6]]},"264":{"position":[[73,6]]}}}],["give",{"_index":906,"t":{"108":{"position":[[113,4]]}}}],["gives",{"_index":650,"t":{"65":{"position":[[12,5]]}}}],["gl",{"_index":307,"t":{"21":{"position":[[169,2]]},"25":{"position":[[204,2]]},"43":{"position":[[151,2]]},"65":{"position":[[969,2]]},"78":{"position":[[346,2]]},"80":{"position":[[36,2]]},"82":{"position":[[36,2]]},"84":{"position":[[245,2]]},"86":{"position":[[36,2]]},"88":{"position":[[651,2]]},"91":{"position":[[106,2]]},"97":{"position":[[381,2]]},"104":{"position":[[485,2],[751,2]]},"120":{"position":[[977,2]]},"169":{"position":[[1392,2]]},"197":{"position":[[974,2]]}}}],["gl.add_label(image_query",{"_index":799,"t":{"88":{"position":[[951,25]]}}}],["gl.ask_async(detector=detector",{"_index":192,"t":{"11":{"position":[[1217,31]]},"15":{"position":[[670,31]]}}}],["gl.create_detector(name=\"your_detector_name",{"_index":761,"t":{"78":{"position":[[376,45]]}}}],["gl.create_detector(name=detector_name",{"_index":971,"t":{"120":{"position":[[1007,38]]}}}],["gl.get_detector(\"dog",{"_index":1370,"t":{"197":{"position":[[1004,20]]}}}],["gl.get_detector(id=\"your_detector_id",{"_index":762,"t":{"80":{"position":[[66,38]]}}}],["gl.get_image_query(id=\"iq_your_image_query_id",{"_index":774,"t":{"84":{"position":[[278,47]]}}}],["gl.get_image_query(id=image_query.id",{"_index":246,"t":{"15":{"position":[[850,37]]}}}],["gl.get_image_query(id=image_query_id",{"_index":216,"t":{"13":{"position":[[743,37]]}}}],["gl.get_or_create_detector",{"_index":335,"t":{"25":{"position":[[232,26]]},"127":{"position":[[213,26]]},"169":{"position":[[1422,26]]}}}],["gl.get_or_create_detector(name=\"doorway",{"_index":794,"t":{"88":{"position":[[674,41]]},"91":{"position":[[131,41]]},"97":{"position":[[406,41]]}}}],["gl.get_or_create_detector(name=\"path",{"_index":466,"t":{"43":{"position":[[176,36]]}}}],["gl.get_or_create_detector(name=\"trash",{"_index":684,"t":{"65":{"position":[[1160,39]]}}}],["gl.get_or_create_detector(name=\"your_detector_name",{"_index":177,"t":{"11":{"position":[[989,52]]},"13":{"position":[[576,52]]},"15":{"position":[[537,52]]}}}],["gl.list_detectors",{"_index":765,"t":{"82":{"position":[[101,19]]}}}],["gl.list_detectors(page=1",{"_index":769,"t":{"82":{"position":[[178,25]]}}}],["gl.list_image_queries",{"_index":776,"t":{"86":{"position":[[105,23]]}}}],["gl.list_image_queries(page=1",{"_index":777,"t":{"86":{"position":[[190,29]]}}}],["gl.submit_image_query(d",{"_index":341,"t":{"25":{"position":[[316,24]]}}}],["gl.submit_image_query(det",{"_index":472,"t":{"43":{"position":[[303,26]]}}}],["gl.submit_image_query(detector",{"_index":484,"t":{"45":{"position":[[439,31]]},"47":{"position":[[475,31]]}}}],["gl.submit_image_query(detector=d",{"_index":690,"t":{"65":{"position":[[1357,33],[2109,33]]},"88":{"position":[[904,33]]}}}],["gl.submit_image_query(detector=det",{"_index":805,"t":{"91":{"position":[[296,35]]},"97":{"position":[[571,35]]}}}],["gl.submit_image_query(detector=detector",{"_index":980,"t":{"120":{"position":[[1357,40]]},"127":{"position":[[344,40]]}}}],["gl.submit_image_query(image=image",{"_index":1257,"t":{"169":{"position":[[1940,34]]},"197":{"position":[[1101,34]]}}}],["gl.wait_for_confident_result(id=image_query.id",{"_index":247,"t":{"15":{"position":[[1064,47]]}}}],["go",{"_index":1078,"t":{"154":{"position":[[183,3]]},"158":{"position":[[153,2]]},"211":{"position":[[183,3]]},"238":{"position":[[189,3]]},"246":{"position":[[166,2]]}}}],["good",{"_index":932,"t":{"114":{"position":[[63,4]]},"127":{"position":[[520,4],[555,4]]},"154":{"position":[[175,4]]},"211":{"position":[[175,4]]},"238":{"position":[[181,4]]}}}],["grabbing",{"_index":47,"t":{"7":{"position":[[118,8]]}}}],["gracefully",{"_index":323,"t":{"23":{"position":[[177,10]]},"37":{"position":[[47,10]]},"39":{"position":[[154,10]]},"218":{"position":[[325,10]]}}}],["groundlight",{"_index":0,"t":{"3":{"position":[[0,11],[155,12],[358,11]]},"5":{"position":[[80,11]]},"7":{"position":[[74,12],[216,12],[311,11],[597,12],[632,11],[771,11],[819,11]]},"9":{"position":[[0,11],[343,12]]},"11":{"position":[[56,11],[395,12],[913,11],[932,11],[1284,11]]},"13":{"position":[[55,11],[534,11],[553,11],[813,11]]},"15":{"position":[[215,11],[473,11],[492,11],[739,11],[932,11],[1007,11],[1147,11]]},"19":{"position":[[272,11],[346,11],[490,11]]},"21":{"position":[[17,11],[103,11],[138,11],[157,11]]},"23":{"position":[[36,11]]},"25":{"position":[[159,11],[192,11],[209,13]]},"27":{"position":[[22,11]]},"31":{"position":[[149,11]]},"39":{"position":[[330,11]]},"43":{"position":[[4,11],[98,11],[117,11],[156,13]]},"45":{"position":[[194,11],[498,11]]},"47":{"position":[[4,11]]},"49":{"position":[[0,11],[505,12],[559,11],[705,12]]},"53":{"position":[[168,11]]},"65":{"position":[[0,11],[900,11],[919,11],[974,13]]},"67":{"position":[[53,11]]},"69":{"position":[[54,11]]},"75":{"position":[[0,11]]},"78":{"position":[[315,11],[334,11],[351,13]]},"80":{"position":[[5,11],[24,11],[41,13]]},"82":{"position":[[5,11],[24,11],[41,13]]},"84":{"position":[[214,11],[233,11],[250,13]]},"86":{"position":[[5,11],[24,11],[41,13]]},"88":{"position":[[0,11],[582,11],[601,11],[656,13]]},"91":{"position":[[75,11],[94,11],[111,13]]},"97":{"position":[[12,11],[100,11],[129,11],[350,11],[369,11],[386,13]]},"100":{"position":[[11,11],[117,11]]},"102":{"position":[[237,11]]},"104":{"position":[[386,11],[405,11],[490,13],[584,11],[679,11],[698,11]]},"106":{"position":[[40,11]]},"108":{"position":[[15,11],[297,11]]},"112":{"position":[[254,11]]},"116":{"position":[[0,11]]},"118":{"position":[[69,11],[117,11]]},"120":{"position":[[252,11],[401,11],[420,11],[685,11],[863,11],[982,13]]},"122":{"position":[[15,11],[137,11]]},"124":{"position":[[331,11]]},"132":{"position":[[137,12]]},"142":{"position":[[37,11],[67,11]]},"146":{"position":[[132,11]]},"148":{"position":[[15,11],[98,11],[204,11],[220,11]]},"150":{"position":[[16,11],[135,12]]},"152":{"position":[[27,11],[119,11],[180,11],[269,11]]},"158":{"position":[[827,12],[853,11]]},"160":{"position":[[36,11]]},"163":{"position":[[45,11],[1897,11]]},"165":{"position":[[0,11]]},"167":{"position":[[69,11],[144,11]]},"169":{"position":[[21,11],[198,11],[217,11],[1397,13],[3004,11]]},"171":{"position":[[39,11]]},"173":{"position":[[75,11]]},"177":{"position":[[37,11],[83,11]]},"181":{"position":[[139,11]]},"183":{"position":[[15,11],[99,11],[175,11]]},"189":{"position":[[36,11]]},"191":{"position":[[49,11]]},"193":{"position":[[0,11]]},"195":{"position":[[69,11],[117,11]]},"197":{"position":[[21,11],[183,11],[202,11],[979,13],[1533,11]]},"199":{"position":[[37,11],[67,11]]},"203":{"position":[[132,11]]},"205":{"position":[[15,11],[98,11],[204,11],[220,11]]},"207":{"position":[[16,11],[135,12]]},"209":{"position":[[27,11],[119,11],[180,11],[269,11]]},"215":{"position":[[36,11]]},"218":{"position":[[4,11],[88,11]]},"220":{"position":[[92,11],[236,11],[278,11]]},"222":{"position":[[60,11]]},"226":{"position":[[37,11],[69,11]]},"230":{"position":[[132,11]]},"232":{"position":[[15,11],[104,11],[210,11],[226,11]]},"234":{"position":[[16,11],[135,12]]},"236":{"position":[[27,11],[119,11],[180,11],[269,11]]},"242":{"position":[[36,11]]},"244":{"position":[[0,11]]},"246":{"position":[[68,11]]},"252":{"position":[[206,11]]},"254":{"position":[[37,11],[74,11]]},"258":{"position":[[138,11]]},"260":{"position":[[15,11],[99,11],[175,11]]},"266":{"position":[[36,11]]}}}],["groundlight's",{"_index":102,"t":{"7":{"position":[[1177,13]]},"41":{"position":[[0,13]]},"55":{"position":[[0,13]]},"57":{"position":[[12,13]]},"59":{"position":[[0,13]]},"61":{"position":[[0,13]]},"63":{"position":[[24,13]]},"95":{"position":[[0,13]]},"127":{"position":[[5,13]]}}}],["groundlight(api_token=token",{"_index":898,"t":{"104":{"position":[[756,28]]}}}],["groundlight(endpoint=\"http://localhost:6717",{"_index":308,"t":{"21":{"position":[[174,45]]}}}],["groundlight.ai",{"_index":1297,"t":{"173":{"position":[[111,15]]}}}],["groundlight/stream",{"_index":1327,"t":{"185":{"position":[[85,18]]},"262":{"position":[[84,18]]}}}],["groundlight_api_token",{"_index":366,"t":{"25":{"position":[[724,21]]},"97":{"position":[[198,21]]},"104":{"position":[[176,22],[463,21]]}}}],["groundlight_api_token=api_2gdxmflhji6l_example",{"_index":847,"t":{"97":{"position":[[267,46]]}}}],["groundlight_endpoint",{"_index":310,"t":{"21":{"position":[[238,20]]}}}],["groundlight_endpoint=http://localhost:6717",{"_index":314,"t":{"21":{"position":[[293,42]]}}}],["guide",{"_index":994,"t":{"122":{"position":[[44,6],[59,6]]},"124":{"position":[[90,6]]},"142":{"position":[[5,5]]},"177":{"position":[[5,5]]},"191":{"position":[[125,5]]},"199":{"position":[[5,5]]},"226":{"position":[[5,5]]},"254":{"position":[[5,5]]}}}],["guides",{"_index":35,"t":{"3":{"position":[[405,6]]},"7":{"position":[[18,6]]}}}],["hand",{"_index":607,"t":{"57":{"position":[[186,4],[194,4]]}}}],["handle",{"_index":72,"t":{"7":{"position":[[534,6]]},"23":{"position":[[127,6],[188,6]]},"27":{"position":[[70,6]]},"37":{"position":[[35,6]]},"39":{"position":[[140,6],[273,6]]},"88":{"position":[[186,6]]}}}],["handling",{"_index":69,"t":{"7":{"position":[[492,8]]},"35":{"position":[[5,8]]},"39":{"position":[[38,8]]},"102":{"position":[[291,8]]}}}],["happen",{"_index":715,"t":{"65":{"position":[[2087,7]]}}}],["hardcoding",{"_index":877,"t":{"102":{"position":[[438,10]]}}}],["hardware",{"_index":524,"t":{"49":{"position":[[271,8]]},"222":{"position":[[454,9]]}}}],["hasn't",{"_index":708,"t":{"65":{"position":[[1839,6]]}}}],["head",{"_index":843,"t":{"97":{"position":[[112,4]]},"120":{"position":[[97,4]]}}}],["health",{"_index":424,"t":{"33":{"position":[[179,6]]}}}],["help",{"_index":407,"t":{"31":{"position":[[90,4]]},"33":{"position":[[124,4]]},"35":{"position":[[145,4]]},"39":{"position":[[75,4]]},"57":{"position":[[83,4]]},"59":{"position":[[223,4]]},"69":{"position":[[254,4]]},"142":{"position":[[16,4]]},"163":{"position":[[820,4]]},"177":{"position":[[16,4]]},"199":{"position":[[16,4]]},"226":{"position":[[16,4]]},"254":{"position":[[16,4]]}}}],["helps",{"_index":888,"t":{"104":{"position":[[204,5]]}}}],["here",{"_index":135,"t":{"11":{"position":[[188,6]]},"15":{"position":[[462,5]]},"102":{"position":[[258,4]]},"191":{"position":[[0,4]]},"250":{"position":[[209,5],[260,5],[286,5],[328,5]]}}}],["here's",{"_index":464,"t":{"43":{"position":[[74,6]]},"47":{"position":[[259,6]]},"49":{"position":[[956,6]]}}}],["high",{"_index":817,"t":{"93":{"position":[[130,4],[485,4]]}}}],["high=255",{"_index":508,"t":{"47":{"position":[[375,9]]}}}],["higher",{"_index":695,"t":{"65":{"position":[[1523,6],[1550,6],[1594,6],[1610,6]]},"93":{"position":[[634,6]]},"97":{"position":[[60,7]]},"116":{"position":[[35,6]]},"118":{"position":[[30,6]]},"142":{"position":[[106,7]]},"144":{"position":[[75,6]]},"146":{"position":[[32,6]]},"154":{"position":[[133,6]]},"163":{"position":[[929,6]]},"165":{"position":[[35,6]]},"167":{"position":[[30,6]]},"177":{"position":[[122,7]]},"179":{"position":[[82,6]]},"181":{"position":[[32,6]]},"193":{"position":[[35,6]]},"195":{"position":[[30,6]]},"199":{"position":[[106,7]]},"201":{"position":[[75,6]]},"203":{"position":[[32,6]]},"211":{"position":[[133,6]]},"226":{"position":[[108,7]]},"228":{"position":[[75,6]]},"230":{"position":[[32,6]]},"238":{"position":[[139,6]]},"254":{"position":[[113,7]]},"256":{"position":[[81,6]]},"258":{"position":[[32,6]]}}}],["highest",{"_index":620,"t":{"59":{"position":[[79,7]]}}}],["home",{"_index":1334,"t":{"191":{"position":[[69,4]]}}}],["homebrew",{"_index":1378,"t":{"213":{"position":[[89,8]]}}}],["hour",{"_index":1135,"t":{"163":{"position":[[319,5]]},"169":{"position":[[3101,5]]}}}],["hourly",{"_index":1191,"t":{"163":{"position":[[1957,6]]}}}],["hours",{"_index":747,"t":{"73":{"position":[[281,6]]},"163":{"position":[[735,5]]},"169":{"position":[[1157,5]]}}}],["http",{"_index":74,"t":{"7":{"position":[[558,4]]},"25":{"position":[[15,4],[559,4],[624,4]]}}}],["http://localhost:3000",{"_index":1319,"t":{"175":{"position":[[681,21]]}}}],["https://app.groundlight.ai/reef/my",{"_index":901,"t":{"106":{"position":[[63,34]]}}}],["https://bootstrap.pypa.io/get",{"_index":1115,"t":{"158":{"position":[[614,29]]}}}],["https://github.com/groundlight/esp32cam",{"_index":731,"t":{"71":{"position":[[12,39]]},"252":{"position":[[107,39]]}}}],["https://github.com/groundlight/raspberry",{"_index":737,"t":{"73":{"position":[[12,40]]}}}],["https://github.com/groundlight/stream",{"_index":722,"t":{"69":{"position":[[12,37]]}}}],["https://images.selfstorage.com/large",{"_index":797,"t":{"88":{"position":[[757,37]]}}}],["https://iot.groundlight.ai/espcam",{"_index":1417,"t":{"244":{"position":[[110,34]]},"246":{"position":[[172,33]]}}}],["https://www.photos",{"_index":678,"t":{"65":{"position":[[1000,19]]}}}],["https://www.youtube.com/watch?v= Search the documentation - - + + - - + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index a39b4324..8bfe1464 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://www.groundlight.ai/python-sdk/markdown-pageweekly0.5https://www.groundlight.ai/python-sdk/searchweekly0.5https://www.groundlight.ai/python-sdk/docs/api-referenceweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applicationsweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/async-queriesweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/edgeweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/grabbing-imagesweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/handling-errorsweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/industrialweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/managing-confidenceweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/working-with-detectorsweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-startedweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/api-tokensweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/dog-on-couchweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/retail-analyticsweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/writing-queriesweekly0.5https://www.groundlight.ai/python-sdk/docs/installationweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/linuxweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/macosweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/monitoring-notification-serverweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/nvidia-jetsonweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/optional-librariesweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/raspberry-piweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/windowsweekly0.5https://www.groundlight.ai/python-sdk/docs/iotweekly0.5https://www.groundlight.ai/python-sdk/weekly0.5 \ No newline at end of file +https://www.groundlight.ai/python-sdk/markdown-pageweekly0.5https://www.groundlight.ai/python-sdk/searchweekly0.5https://www.groundlight.ai/python-sdk/docs/api-referenceweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applicationsweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/async-queriesweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/edgeweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/grabbing-imagesweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/handling-errorsweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/industrialweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/managing-confidenceweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/sample-applicationsweekly0.5https://www.groundlight.ai/python-sdk/docs/building-applications/working-with-detectorsweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-startedweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/api-tokensweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/dog-on-couchweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/retail-analyticsweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/streamingweekly0.5https://www.groundlight.ai/python-sdk/docs/getting-started/writing-queriesweekly0.5https://www.groundlight.ai/python-sdk/docs/installationweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/linuxweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/macosweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/monitoring-notification-serverweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/nvidia-jetsonweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/optional-librariesweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/raspberry-piweekly0.5https://www.groundlight.ai/python-sdk/docs/installation/windowsweekly0.5https://www.groundlight.ai/python-sdk/docs/iotweekly0.5https://www.groundlight.ai/python-sdk/weekly0.5 \ No newline at end of file