[syntax] CML syntax highlighting

* Syntax definition for cml blocks: include, program, children,
collections, environments, capabilities, use, expose, offer, facets,
config.
* Identify comments
* Blocks can be multi-line or a single line
* Snap tests to detect unexpected changes.
* Identify double comma as mistake (illegal marker)
* Identify invalid keys.
* Identify invalid values for a given key.
* Try its best not to propagate errors to other sections/blocks (divide
  blocks using '[]', '{}')
* Allow any valid type value for an invalid key to give a more pleasant
  user experience.
* Update snapshot testing documentation

Fixed: 105649
Change-Id: I9d616b3024711eea9fda89393f182609d168eb5b
Reviewed-on: https://fuchsia-review.googlesource.com/c/vscode-plugins/+/706990
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Clayton Wilkinson <wilkinsonclay@google.com>
Reviewed-by: Shai Barack <shayba@google.com>
Reviewed-by: Solly Ross <sollyross@google.com>
Reviewed-by: Yaneury Fermin <yaneury@google.com>
diff --git a/package.json b/package.json
index 9dd86e2..a8bb1b2 100644
--- a/package.json
+++ b/package.json
@@ -320,6 +320,11 @@
         "language": "fidl",
         "scopeName": "source.fidl",
         "path": "./dist/resources/fidl.tmLanguage.json"
+      },
+      {
+        "language": "cml",
+        "scopeName": "source.cml",
+        "path": "./dist/resources/cml.tmLanguage.json"
       }
     ],
     "languages": [
@@ -334,6 +339,17 @@
           ".fidl"
         ],
         "configuration": "./resources/language_configs/fidl.json"
+      },
+      {
+        "id": "cml",
+        "aliases": [
+          "CML",
+          "Cml",
+          "cml"
+        ],
+        "extensions": [
+          ".cml"
+        ]
       }
     ],
     "viewsContainers": {
@@ -360,7 +376,8 @@
     "build": "node build.mjs",
     "watch": "node build.mjs watch",
     "clean": "rm -rf dist && rm -rf test-dist",
-    "update-syntax-snapshot": "npx vscode-tmgrammar-snap --updateSnapshot 'src/test/suite/snap/**/*.test.fidl'",
+    "preupdate-syntax-snapshot": "npm run build",
+    "update-syntax-snapshot": "npx vscode-tmgrammar-snap --updateSnapshot 'src/test/suite/snap/**/*.test.*[!p]'",
     "pretest": "node build.mjs && git clean -Xdf ./testdata/",
     "test": "npm run typecheck && npm run lint && node ./test-dist/src/test/run_test.js",
     "lint": "npx eslint \"{src,webviews}/**/*.ts\"",
diff --git a/src/test/suite/snap.test.ts b/src/test/suite/snap.test.ts
index df8ea82..6c095df 100644
--- a/src/test/suite/snap.test.ts
+++ b/src/test/suite/snap.test.ts
@@ -176,7 +176,7 @@
 const setupTests = (async () => {
   const grammarDir = path.join(__dirname, '..', 'dist', 'resources');
   const rootSnapDir = path.join(__dirname, '..', 'src', 'test', 'suite', 'snap');
-  const kinds = ['fidl'];
+  const kinds = ['fidl', 'cml'];
 
   const snapFiles: Map<string, [string, string][]> = new Map();
 
diff --git a/src/test/suite/snap/SNAPSHOT_TESTING.md b/src/test/suite/snap/SNAPSHOT_TESTING.md
index e1471df..d5a2f1e 100644
--- a/src/test/suite/snap/SNAPSHOT_TESTING.md
+++ b/src/test/suite/snap/SNAPSHOT_TESTING.md
@@ -19,6 +19,5 @@
 ## Commands
 
 - Test everything: `npm run test`
-- Test syntax only: `npm run test-syntax`
 - Update snapshot: `npm run update-syntax-snapshot`
 
diff --git a/src/test/suite/snap/cml/capabilities.test.cml b/src/test/suite/snap/cml/capabilities.test.cml
new file mode 100644
index 0000000..e43d13e
--- /dev/null
+++ b/src/test/suite/snap/cml/capabilities.test.cml
@@ -0,0 +1,25 @@
+{
+    capabilities: [
+        {
+            service: "str",
+            service: [ "str"],
+            protocol: "str",
+            protocol: ["str"],
+            directory: "/tmp/",
+            storage: "str",
+            runner: "st",
+            resolver: "str",
+            event: "str",
+            event_stream: "str",
+            path: "str",
+            rights: "rx*",
+            from: "str",
+            backing_dir: "str",
+            subdir: "str",
+            subdir: true, //Invalid type
+            storage_id: "static_instance_id",
+            storage_id: "invalid_str", //Invalid string value
+            invalid_keyword: "str", //Invalid keyword
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/capabilities.test.cml.snap b/src/test/suite/snap/cml/capabilities.test.cml.snap
new file mode 100644
index 0000000..3bd033e
--- /dev/null
+++ b/src/test/suite/snap/cml/capabilities.test.cml.snap
@@ -0,0 +1,163 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    capabilities: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            service: [ "str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            directory: "/tmp/",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                       ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+>            storage: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+>            runner: "st",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                    ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>            resolver: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+>            event: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+>            event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            path: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+#                  ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml string.quoted.double
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml punctuation.separator
+>            rights: "rx*",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+>            from: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            backing_dir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml keyword.control
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml
+#                         ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml punctuation.separator
+>            subdir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+>            subdir: true, //Invalid type
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                    ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml invalid.illegal
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                          ^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>            storage_id: "static_instance_id",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+#                        ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml string.quoted.double
+#                                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml punctuation.separator
+>            storage_id: "invalid_str", //Invalid string value
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+#                        ^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml invalid.illegal
+#                                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml punctuation.separator
+#                                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                                       ^^^^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>            invalid_keyword: "str", //Invalid keyword
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml invalid.illegal
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml
+#                             ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml string.quoted.double
+#                                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml punctuation.separator
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                                    ^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>        }
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>    ]
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/children.test.cml b/src/test/suite/snap/cml/children.test.cml
new file mode 100644
index 0000000..d7c83cf
--- /dev/null
+++ b/src/test/suite/snap/cml/children.test.cml
@@ -0,0 +1,19 @@
+{
+    children: [
+        {
+            name: "valid",
+            name: "Invalid",
+            name: "invalid$",
+            url: "pkg://t#test.cm",
+        },
+        {
+            startup: "eager",
+            startup: "lazy",
+            startup: "invalid",
+            on_terminate: "none",
+            on_terminate: "reboot",
+            on_terminate: "invalid",
+            environment: "str"
+        }
+    ]
+}
diff --git a/src/test/suite/snap/cml/children.test.cml.snap b/src/test/suite/snap/cml/children.test.cml.snap
new file mode 100644
index 0000000..b83cb0b
--- /dev/null
+++ b/src/test/suite/snap/cml/children.test.cml.snap
@@ -0,0 +1,103 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    children: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml keyword.control
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            name: "valid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                  ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+>            name: "Invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                  ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml invalid.illegal
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+>            name: "invalid$",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                  ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml invalid.illegal
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+>            url: "pkg://t#test.cm",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml
+#                 ^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml string.quoted.double
+#                                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml punctuation.separator
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml punctuation.separator
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            startup: "eager",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+#                     ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml punctuation.separator
+>            startup: "lazy",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+#                     ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml punctuation.separator
+>            startup: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+#                     ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml invalid.illegal
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml punctuation.separator
+>            on_terminate: "none",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+#                          ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml punctuation.separator
+>            on_terminate: "reboot",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+#                          ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml string.quoted.double
+#                                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml punctuation.separator
+>            on_terminate: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+#                          ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml invalid.illegal
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml punctuation.separator
+>            environment: "str"
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml keyword.control
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+#                         ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml string.quoted.double
+>        }
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>    ]
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/collections.test.cml b/src/test/suite/snap/cml/collections.test.cml
new file mode 100644
index 0000000..98728fa
--- /dev/null
+++ b/src/test/suite/snap/cml/collections.test.cml
@@ -0,0 +1,16 @@
+{
+    collections: [
+        {
+            name: "test",
+            durability: "transient",
+            durability: "single_run",
+            durability: "invalid",
+            environment: "str",
+            allowed_offers: "static_only",
+            allowed_offers: "static_and_dynamic",
+            allowed_offers: "invalid",
+            allow_long_names: true,
+            persistent_storage: false,
+        },
+    ],
+}
diff --git a/src/test/suite/snap/cml/collections.test.cml.snap b/src/test/suite/snap/cml/collections.test.cml.snap
new file mode 100644
index 0000000..b9f4313
--- /dev/null
+++ b/src/test/suite/snap/cml/collections.test.cml.snap
@@ -0,0 +1,92 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    collections: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            name: "test",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                  ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+>            durability: "transient",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+#                        ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml string.quoted.double
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml punctuation.separator
+>            durability: "single_run",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+#                        ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml punctuation.separator
+>            durability: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+#                        ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml invalid.illegal
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml punctuation.separator
+>            environment: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml keyword.control
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+#                         ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml punctuation.separator
+>            allowed_offers: "static_only",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml keyword.control
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+#                            ^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml string.quoted.double
+#                                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml punctuation.separator
+>            allowed_offers: "static_and_dynamic",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml keyword.control
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+#                            ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml string.quoted.double
+#                                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml punctuation.separator
+>            allowed_offers: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml keyword.control
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+#                            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml invalid.illegal
+#                                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml punctuation.separator
+>            allow_long_names: true,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml keyword.control
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml
+#                              ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml constant.language.true
+#                                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml punctuation.separator
+>            persistent_storage: false,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml keyword.control
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml
+#                                ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml constant.language.false
+#                                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml punctuation.separator
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml punctuation.separator
+>    ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#     ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/config.test.cml b/src/test/suite/snap/cml/config.test.cml
new file mode 100644
index 0000000..2b27486
--- /dev/null
+++ b/src/test/suite/snap/cml/config.test.cml
@@ -0,0 +1,23 @@
+{
+    config: {
+        tags: {
+            type: "vector",
+            max_count: 20,
+            element: {
+                type: "string",
+                max_size: 50,
+            }
+        },
+        //Accept any key-value pair
+        a: true,
+        b: "str",
+        c: [ "str" ],
+        d: [
+            {
+                a: "b",
+                b: invalidValue,
+                c: "str",
+            }
+        ]
+    }
+}
diff --git a/src/test/suite/snap/cml/config.test.cml.snap b/src/test/suite/snap/cml/config.test.cml.snap
new file mode 100644
index 0000000..aef8833
--- /dev/null
+++ b/src/test/suite/snap/cml/config.test.cml.snap
@@ -0,0 +1,125 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    config: {
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml keyword.control
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>        tags: {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+#        ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            type: "vector",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                  ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>            max_count: 20,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                       ^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml storage.type.int
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>            element: {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>                type: "string",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+#                ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                      ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>                max_size: 50,
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+#                ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                          ^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml storage.type.int
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>            }
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        //Accept any key-value pair
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+#        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>        a: true,
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml constant.language.true
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        b: "str",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        c: [ "str" ],
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#             ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        d: [
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>            {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>                a: "b",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                   ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>                b: invalidValue,
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                   ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml invalid.illegal
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>                c: "str",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>            }
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>        ]
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>    }
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/environments.test.cml b/src/test/suite/snap/cml/environments.test.cml
new file mode 100644
index 0000000..8db5b6d
--- /dev/null
+++ b/src/test/suite/snap/cml/environments.test.cml
@@ -0,0 +1,33 @@
+{
+    environments: [
+        {
+            name: "test-env.0",
+            extends: "realm",
+            extends: "none",
+            extends: "invalid",
+            runners: [
+                {
+                    runner: "runner",
+                    from: "#test",
+                    as: "str",
+                },
+            ],
+            resolvers: [
+                {
+                    resolver: "str",
+                    from: "str",
+                    scheme: "str",
+                },
+            ],
+            debug: [
+                {
+                    protocol: "str",
+                    protocol: ["str"],
+                    from: "str",
+                    as: "str",
+                },
+            ],
+            stop_timeout_ms: 500,
+        },
+    ],
+}
diff --git a/src/test/suite/snap/cml/environments.test.cml.snap b/src/test/suite/snap/cml/environments.test.cml.snap
new file mode 100644
index 0000000..38cc9fc
--- /dev/null
+++ b/src/test/suite/snap/cml/environments.test.cml.snap
@@ -0,0 +1,180 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    environments: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            name: "test-env.0",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+#                  ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+>            extends: "realm",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+#                     ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml punctuation.separator
+>            extends: "none",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+#                     ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml punctuation.separator
+>            extends: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+#                     ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml invalid.illegal
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml punctuation.separator
+>            runners: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>                {
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>                    runner: "runner",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>                    from: "#test",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                          ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>                    as: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                        ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+>                },
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml punctuation.separator
+>            ],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml punctuation.separator
+>            resolvers: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>                {
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>                    resolver: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                              ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+>                    from: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                          ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>                    scheme: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml keyword.control
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml
+#                            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml string.quoted.double
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml punctuation.separator
+>                },
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml punctuation.separator
+>            ],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml punctuation.separator
+>            debug: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>                {
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>                    protocol: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                              ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>                    protocol: ["str"],
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                               ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>                    from: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                          ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>                    as: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                    ^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                        ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+>                },
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml punctuation.separator
+>            ],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml punctuation.separator
+>            stop_timeout_ms: 500,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml keyword.control
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml
+#                             ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml storage.type.int
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml punctuation.separator
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml punctuation.separator
+>    ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#     ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/expose.test.cml b/src/test/suite/snap/cml/expose.test.cml
new file mode 100644
index 0000000..0e6a4d0
--- /dev/null
+++ b/src/test/suite/snap/cml/expose.test.cml
@@ -0,0 +1,30 @@
+{
+    expose: [
+        {
+            service: "str",
+            service: ["str"],
+            protocol: "str",
+            protocol: ["str"],
+            directory: "str",
+            directory: ["str"],
+            runner: "str",
+            runner: ["str"],
+            resolver: "str",
+            resolver: ["str"],
+            from: "self",
+            from: "framework",
+            from: "#test",
+            from: "invalid",
+            as: "str",
+            to: "parent",
+            to: "framework",
+            to: "invalid",
+            rights: "str",
+            subdir: "dir",
+            event_stream: "str",
+            event_stream: ["str"],
+            scope: "str",
+            scope: ["str"],
+        },
+    ],
+}
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/expose.test.cml.snap b/src/test/suite/snap/cml/expose.test.cml.snap
new file mode 100644
index 0000000..d20ca7d
--- /dev/null
+++ b/src/test/suite/snap/cml/expose.test.cml.snap
@@ -0,0 +1,203 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    expose: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml keyword.control
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            service: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            directory: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+>            directory: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                        ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+>            runner: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>            runner: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>            resolver: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+>            resolver: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+>            from: "self",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "#test",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml invalid.illegal
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            as: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+>            to: "parent",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#                ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+>            to: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#                ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+>            to: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#                ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml invalid.illegal
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+>            rights: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+>            subdir: "dir",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+>            event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            event_stream: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                           ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            scope: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+>            scope: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml punctuation.separator
+>    ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#     ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/facets.test.cml b/src/test/suite/snap/cml/facets.test.cml
new file mode 100644
index 0000000..6c8633e
--- /dev/null
+++ b/src/test/suite/snap/cml/facets.test.cml
@@ -0,0 +1,18 @@
+//Test of facets
+{
+    facets : {
+        //Key-value pairs
+        a: "a",
+        "b": "b",
+        c: [ "c" ],
+        d: [
+            {
+                f: "f",
+                a: [
+                    "a",
+                    "b"
+                ]
+            }
+        ]
+    }
+}
diff --git a/src/test/suite/snap/cml/facets.test.cml.snap b/src/test/suite/snap/cml/facets.test.cml.snap
new file mode 100644
index 0000000..22b264a
--- /dev/null
+++ b/src/test/suite/snap/cml/facets.test.cml.snap
@@ -0,0 +1,82 @@
+>//Test of facets
+#^^^^^^^^^^^^^^^^^ source.cml comment.line.double-slash.cml
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    facets : {
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml keyword.control
+#          ^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>        //Key-value pairs
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+#        ^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>        a: "a",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        "b": "b",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+#        ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#             ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        c: [ "c" ],
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#             ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>        d: [
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>            {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>                f: "f",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                   ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>                a: [
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>                    "a",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#                    ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.separator
+>                    "b"
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#                    ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+>                ]
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>            }
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>        ]
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>    }
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/include.test.cml b/src/test/suite/snap/cml/include.test.cml
new file mode 100644
index 0000000..acdf58f
--- /dev/null
+++ b/src/test/suite/snap/cml/include.test.cml
@@ -0,0 +1,3 @@
+{
+    include: [ "src/test.cml" ]
+}
diff --git a/src/test/suite/snap/cml/include.test.cml.snap b/src/test/suite/snap/cml/include.test.cml.snap
new file mode 100644
index 0000000..fa4ac37
--- /dev/null
+++ b/src/test/suite/snap/cml/include.test.cml.snap
@@ -0,0 +1,15 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    include: [ "src/test.cml" ]
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml keyword.control
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml
+#               ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/offer.test.cml b/src/test/suite/snap/cml/offer.test.cml
new file mode 100644
index 0000000..c18567a
--- /dev/null
+++ b/src/test/suite/snap/cml/offer.test.cml
@@ -0,0 +1,60 @@
+{
+    offer: [
+        {
+            service: "str",
+            service: ["str"],
+            protocol: "str",
+            protocol: ["str"],
+            directory: "str",
+            directory: ["str"],
+            runner: "str",
+            runner: ["str"],
+            resolver: "str",
+            resolver: ["str",],
+            storage: "str",
+            storage: ["str"],
+            event: "str",
+            event: ["str"],
+            from: "parent",
+            from: "self",
+            from: "framework",
+            from: "void",
+            from: "#test",
+            from: "invalid",
+            from: [
+                "parent",
+                "self",
+                "framework",
+                "void",
+                "#test",
+                "invalid"
+              ],
+            to: "#test_hello_world",
+            to: "invalid",
+            to: ["#test", "invalid", "#a-b"],
+            as: "str",
+            dependency: "strong",
+            dependency: "weak",
+            dependency: "weak_for_migration",
+            dependency: "invalid",
+            rights: "str",
+            subdir: "str",
+            //Any filter object
+            filter: {
+              a: "str",
+              b: true,
+              c: [],
+              d: {},
+            },
+            event_stream: "str",
+            event_stream: ["str"],
+            scope: "str",
+            scope: ["str"],
+            availability: "required",
+            availability: "optional",
+            availability: "same_as_target",
+            availability: "invalid",
+            source_availability: "str"
+        },
+    ],
+}
diff --git a/src/test/suite/snap/cml/offer.test.cml.snap b/src/test/suite/snap/cml/offer.test.cml.snap
new file mode 100644
index 0000000..9e1d69f
--- /dev/null
+++ b/src/test/suite/snap/cml/offer.test.cml.snap
@@ -0,0 +1,397 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    offer: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml keyword.control
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml
+#          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            service: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            directory: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+>            directory: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                        ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+>            runner: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>            runner: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>            resolver: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+>            resolver: ["str",],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.separator
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+>            storage: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+>            storage: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml meta.meta-array-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+>            event: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+>            event: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+>            from: "parent",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "self",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "void",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "#test",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml invalid.illegal
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>                "parent",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#                ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+>                "self",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#                ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+>                "framework",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#                ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+>                "void",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#                ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+>                "#test",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#                ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+>                "invalid"
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#                ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml invalid.illegal
+>              ],
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            to: "#test_hello_world",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#                ^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml string.quoted.double
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+>            to: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#                ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml invalid.illegal
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+>            to: ["#test", "invalid", "#a-b"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                 ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.separator
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml
+#                          ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml invalid.illegal
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.separator
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml
+#                                     ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml string.quoted.double
+#                                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+>            as: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+>            dependency: "strong",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            dependency: "weak",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            dependency: "weak_for_migration",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+#                                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            dependency: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml invalid.illegal
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            rights: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+>            subdir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+>            //Any filter object
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>            filter: {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>              a: "str",
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>              b: true,
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml constant.language.true
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>              c: [],
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>              d: {},
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>            },
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml punctuation.separator
+>            event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            event_stream: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                           ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            scope: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+>            scope: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+>            availability: "required",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>            availability: "optional",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>            availability: "same_as_target",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+#                                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>            availability: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml invalid.illegal
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>            source_availability: "str"
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml keyword.control
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml
+#                                 ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml string.quoted.double
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml punctuation.separator
+>    ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#     ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/program.test.cml b/src/test/suite/snap/cml/program.test.cml
new file mode 100644
index 0000000..6a17a9e
--- /dev/null
+++ b/src/test/suite/snap/cml/program.test.cml
@@ -0,0 +1,7 @@
+{
+    program: {
+        runner: "elf",
+        binary: "bin/test",
+        args: ["Hello", "World!" ],
+    }
+}
diff --git a/src/test/suite/snap/cml/program.test.cml.snap b/src/test/suite/snap/cml/program.test.cml.snap
new file mode 100644
index 0000000..c60efd0
--- /dev/null
+++ b/src/test/suite/snap/cml/program.test.cml.snap
@@ -0,0 +1,41 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    program: {
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml keyword.control
+#           ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>        runner: "elf",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+#        ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+#                ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+>        binary: "bin/test",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+#        ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml
+#                ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml punctuation.separator
+>        args: ["Hello", "World!" ],
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+#        ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml keyword.control
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#               ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml punctuation.separator
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml
+#                        ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml punctuation.separator
+>    }
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/use.test.cml b/src/test/suite/snap/cml/use.test.cml
new file mode 100644
index 0000000..946a32e
--- /dev/null
+++ b/src/test/suite/snap/cml/use.test.cml
@@ -0,0 +1,44 @@
+{
+    use: [
+        {
+            service: "str",
+            service: ["str"],
+            protocol: "str",
+            protocol: ["str"],
+            directory: "str",
+            storage: "str",
+            event: "str",
+            event: ["str"],
+            event_stream_deprecated: "str",
+            event_stream: "str",
+            event_stream: ["str"],
+            from: "parent",
+            from: "debug",
+            from: "framework",
+            from: "self",
+            from: "#test-name",
+            from: "invalid",
+            path: "str",
+            rights: "str",
+            subdir: "str",
+            as: "str",
+            scope: "str",
+            scope: ["str"],
+            //Any filter object
+            filter: {
+              a: "str",
+              b: true,
+              c: [],
+              d: {},
+            },
+            subscriptions: "str",
+            dependency: "strong",
+            dependency: "weak",
+            dependency: "weak_for_migration",
+            dependency: "invalid",
+            availability: "required",
+            availability: "optional",
+            availability: "invalid",
+        },
+    ],
+}
diff --git a/src/test/suite/snap/cml/use.test.cml.snap b/src/test/suite/snap/cml/use.test.cml.snap
new file mode 100644
index 0000000..6e6557e
--- /dev/null
+++ b/src/test/suite/snap/cml/use.test.cml.snap
@@ -0,0 +1,292 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>    use: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+#    ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml keyword.control
+#       ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+>        {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>            service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            service: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+>            protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+>            directory: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+#                       ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+#                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+>            storage: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+#                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+>            event: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+>            event: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+>            event_stream_deprecated: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml keyword.control
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml
+#                                     ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml string.quoted.double
+#                                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml punctuation.separator
+>            event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+#                               ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            event_stream: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                           ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+>            from: "parent",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "debug",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                             ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "self",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "#test-name",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            from: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+#                  ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml invalid.illegal
+#                           ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+>            path: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml keyword.control
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+#                  ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml string.quoted.double
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml punctuation.separator
+>            rights: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+>            subdir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+>            as: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+#                ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+>            scope: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                   ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml string.quoted.double
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+>            scope: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                    ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml string.quoted.double
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+>            //Any filter object
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+>            filter: {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml keyword.control
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+#                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+>              a: "str",
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>              b: true,
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml constant.language.true
+#                     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>              c: [],
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>              d: {},
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+#               ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+#                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+#                  ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+>            },
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+#            ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#             ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml punctuation.separator
+>            subscriptions: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml keyword.control
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml
+#                          ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml
+#                           ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml punctuation.separator
+>            dependency: "strong",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+#                                ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            dependency: "weak",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+#                              ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            dependency: "weak_for_migration",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+#                                            ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            dependency: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+#                      ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                       ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+#                        ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml invalid.illegal
+#                                 ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+>            availability: "required",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>            availability: "optional",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+#                                    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>            availability: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#            ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+#                        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+#                          ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml invalid.illegal
+#                                   ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+>        },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+#        ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+#         ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml punctuation.separator
+>    ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml
+#    ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+#     ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/syntax/cml.ts b/syntax/cml.ts
new file mode 100644
index 0000000..789727a
--- /dev/null
+++ b/syntax/cml.ts
@@ -0,0 +1,825 @@
+// Copyright 2022 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This generates a language definition file because writing it by hand is too hard.
+
+import { OnigRegExp } from 'oniguruma';
+
+// Format of language definition JSON
+const tmSchema =
+  'https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json';
+type TmCaptures = { [k: string]: { name: string } };
+type TmIncludePattern = { include: string };
+type TmMatchPattern = {
+  name?: string;
+  match: string;
+  captures?: TmCaptures;
+};
+type TmBlockPattern = {
+  name?: string;
+  begin: string;
+  beginCaptures?: TmCaptures;
+  end: string;
+  endCaptures?: TmCaptures;
+  patterns: TmPattern[];
+};
+type TmPattern = TmIncludePattern | TmMatchPattern | TmBlockPattern;
+type TmLanguage = {
+  $schema: string;
+  name: string;
+  scopeName: string;
+  patterns: TmPattern[];
+  repository: {
+    [key: string]: { patterns: TmPattern[] };
+  };
+};
+
+class NamedPattern {
+  readonly re: string;
+  readonly names: string[];
+  constructor(re: string, names?: string[]) {
+    this.re = re;
+    this.names = names || [];
+    // Hack to only validate if there are no unresolved recursive groups
+    const recursiveRE = /\\g<(.*?)>/g;
+    let match;
+    while ((match = recursiveRE.exec(re)) !== null) {
+      if (!re.includes(`(?<${match[1]}>`)) {
+        // Group definition not found, can't validate yet.
+        return;
+      }
+    }
+    this.validate();
+  }
+
+  validate() {
+    const groupCount = new OnigRegExp(this.re + '|').searchSync('')!.length - 1;
+    if (groupCount !== this.names.length) {
+      throw new Error(
+        `Found ${groupCount} but expected ${this.names.length} groups in ${this.re}`
+      );
+    }
+  }
+
+  toString() {
+    return this.re;
+  }
+
+  assert(s: string) {
+    const re = new OnigRegExp(this.re);
+    const m = re.searchSync(s);
+    if (!m) {
+      throw Error(
+        `${JSON.stringify(s)} did not match pattern ${JSON.stringify(this.re)}`
+      );
+    }
+    const c = m[0];
+    if (c.index !== 0 || c.start !== 0 || c.length !== s.length) {
+      throw Error(
+        `${JSON.stringify(s)} did not fully match pattern ${JSON.stringify(
+          this.re
+        )}, only matched ${JSON.stringify(m[0])}`
+      );
+    }
+  }
+}
+
+/**
+ * Create a dictionary of capture group names: <captureIdx, nameId>
+ * @param pattern input pattern
+ * @returns dictionary
+ */
+function getCaptures(pattern: Pattern): TmCaptures {
+  const captures: { [k: string]: { name: string } } = {};
+  const names = getPatternNames(pattern);
+  for (let i = 0; i < names.length; i++) {
+    captures[`${i + 1}`] = { name: names[i] };
+  }
+  return captures;
+}
+
+/**
+ * Create TmIncludePattern from name identifier
+ * @param name identifier
+ * @returns TmIncludePattern
+ */
+function include(name: string): TmIncludePattern {
+  return { include: `#${name}` };
+}
+
+/**
+ * Create a match pattern for the output json syntax.
+ * @param name
+ * @param pattern
+ * @returns pattern struct for the output json.
+ */
+function match(name: string, pattern: Pattern): TmMatchPattern {
+  return {
+    name: `${name}.cml`,
+    match: pattern.toString(),
+    captures: getCaptures(pattern),
+  };
+}
+
+/**
+ * Create a match pattern with no name for the output json syntax.
+ * @param pattern
+ * @returns pattern struct for the output json.
+ */
+function anonMatch(pattern: Pattern | TmPattern): TmPattern {
+  if (pattern instanceof String) {
+    return {
+      match: pattern.toString(),
+    };
+  }
+  if (pattern instanceof NamedPattern) {
+    return {
+      match: pattern.toString(),
+      captures: getCaptures(pattern),
+    };
+  }
+  return pattern;
+}
+
+/**
+ * Create block pattern for the output json syntax.
+ * @param args
+ * @returns pattern struct for the output json.
+ */
+function block(args: {
+  name: string;
+  begin: Pattern;
+  end: Pattern;
+  patterns: Array<Pattern | TmPattern>;
+}): TmBlockPattern {
+  const tmPatterns: TmPattern[] = args.patterns.map(anonMatch);
+  return {
+    name: `${args.name}.cml`,
+    begin: args.begin.toString(),
+    beginCaptures: getCaptures(args.begin),
+    end: args.end.toString(),
+    endCaptures: getCaptures(args.end),
+    patterns: tmPatterns,
+  };
+}
+
+/**
+ * Creates a key-value array dictionary, k: [{}]
+ * @param args
+ * @returns pattern struct for the output json.
+ */
+function kvArrayDictionary(args: {
+  name: string;
+  begin: Pattern;
+  inner: Array<Pattern | TmPattern>;
+}): TmBlockPattern {
+  return keyValue(
+    args.name,
+    [
+      ArrayBlock([DictionaryBlock(args.inner)])
+    ],
+  );
+}
+
+/**
+ * Creates a key-value dictionary, k: {}
+ * @param args
+ * @returns pattern struct for the output json.
+ */
+function kvDictionary(args: {
+  name: string;
+  begin: Pattern;
+  inner: Array<Pattern | TmPattern>;
+}): TmBlockPattern {
+  return keyValue(
+    args.name,
+    [DictionaryBlock(args.inner)],
+  );
+}
+
+/**
+ * Creates an array block
+ * @param pattern used for every array element
+ * @param valid is an array block a valid type?
+ * @returns pattern struct for the output json.
+ */
+function ArrayBlock(pattern?: Array<Pattern | TmPattern>, valid?: boolean): TmBlockPattern {
+  if (pattern === undefined) {
+    pattern = [patterns.anyString()];
+  }
+  valid = valid ?? true;
+  return block({
+    name: 'meta.meta-array-block',
+    begin: patterns.named('\\[', valid ? 'punctuation.definition.array.begin' : 'invalid.illegal'),
+    end: patterns.named('\\]', valid ? 'punctuation.definition.array.end' : 'invalid.illegal'),
+    patterns: [
+      ...pattern,
+      include('comments'),
+      //
+      patterns.named('(?<=,)[ ]*,', 'invalid.illegal'),
+      patterns.separator(','),
+      patterns.named('\\.', 'invalid.illegal'),
+      patterns.anyString('invalid.illegal'),
+      patterns.identifier('invalid.illegal'),
+      patterns.integer('invalid.illegal'),
+      patterns.boolValue('invalid.illegal'),
+      include('meta-invalid-array-block'),
+      include('meta-invalid-dictionary-block'),
+    ],
+  });
+}
+
+/**
+ * Creates a dictionary, {k:v,}
+ * @param pattern pattern for the key-value pair
+ * @param valid is the dictionary a valid value type?
+ * @returns
+ */
+function DictionaryBlock(pattern: Array<Pattern | TmPattern>, valid?: boolean): TmBlockPattern {
+  valid = valid ?? true;
+  return block({
+    name: 'meta.meta-dictionary-block',
+    begin: patterns.named('\\{', valid ? 'punctuation.definition.dictionary.begin' : 'invalid.illegal'),
+    end: patterns.named('\\}', valid ? 'punctuation.definition.dictionary.end' : 'invalid.illegal'),
+    patterns: [
+      ...pattern,
+      include('comments'),
+
+      include('meta-invalid-key-value-block'),
+      patterns.named(',', 'invalid.illegal'),
+      patterns.named('\\.', 'invalid.illegal'),
+      patterns.anyString('invalid.illegal'),
+      patterns.identifier('invalid.illegal'),
+      patterns.integer('invalid.illegal'),
+      patterns.boolValue('invalid.illegal'),
+      include('meta-invalid-array-block'),
+      include('meta-invalid-dictionary-block'),
+    ],
+  });
+}
+
+/**
+ * Creates a key-value block, k:v
+ * @param name block name
+ * @param pattern array pattern for values
+ * @param key pattern for key
+ * @returns pattern struct for the output json.
+ */
+function keyValue(name: string,
+  pattern?: Array<Pattern | TmPattern>,
+  key?: NamedPattern): TmBlockPattern {
+  if (pattern === undefined) {
+    pattern = [patterns.anyString()];
+  }
+  let keyPattern = key ?? patterns.oneFrom(
+    patterns.named(name, 'keyword.control'),
+    patterns.oneString(name, 'keyword.control')
+  );
+  return block({
+    name: `meta.meta-${name}-block`,
+    begin: patterns.seq(keyPattern, '\\:'),
+    end: patterns.oneFrom(patterns.separator(','), '(?=})'),
+    patterns: [
+      ...pattern,
+
+      patterns.named('\\.', 'invalid.illegal'),
+      patterns.anyString('invalid.illegal'),
+      patterns.identifier('invalid.illegal'),
+      patterns.integer('invalid.illegal'),
+      patterns.boolValue('invalid.illegal'),
+      include('meta-invalid-array-block'),
+      include('meta-invalid-dictionary-block'),
+    ],
+  });
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+type Pattern = NamedPattern | String;
+
+/** Return the names of the groups in the pattern. */
+function getPatternNames(pat: Pattern | Pattern[]): string[] {
+  if (pat instanceof Array) {
+    return pat.map(getPatternNames).reduce((prev, names) => [...(prev || []), ...names]);
+  }
+  if (pat instanceof NamedPattern) {
+    return pat.names;
+  } else {
+    return [];
+  }
+}
+
+/**
+ * Utility to create a NamedPattern by concatenating an input pattern array. Output =
+ * [prefix + (pat + separator?)* + suffix]
+ * @param pats input pattern array.
+ * @param prefix
+ * @param separator used to concatenate input patterns together.
+ * @param suffix
+ * @returns the resulting NamedPattern.
+ */
+function joinPattern(
+  pats: Pattern[],
+  prefix: string,
+  separator: string,
+  suffix: string
+): NamedPattern {
+  const re = pats.map((p) => p.toString()).join(separator);
+  return new NamedPattern(prefix + re + suffix, getPatternNames(pats));
+}
+
+// NamedPattern Factory.
+var patterns = {
+  /**
+   * Create a new pattern consisting of adjacent input patterns optionally separated by whitespaces.
+   * @param pats Patterns
+   */
+  seq: function (...pats: Pattern[]): NamedPattern {
+    return joinPattern(pats, '', '\\s*', '');
+  },
+
+  /**
+   * Create a word NamedPattern match by searching word boundaries.
+   * @param word input pattern
+   * @returns NamedPattern.
+   */
+  word: function (word: Pattern): NamedPattern {
+    return new NamedPattern(`\\b${word}\\b`, getPatternNames(word));
+  },
+
+  /**
+   * Create a double quoted string pattern matcher.
+   * @param word desired word pattern.
+   * @param type pattern name.
+   * @returns NamedPattern.
+   */
+  oneString: function (word: Pattern, type?: string): NamedPattern {
+    return patterns.named(`"${word}"`, type ?? 'string.quoted.double');
+  },
+
+  /**
+   * Create a non-capturing NamedPattern group that matches one item from the pattern input vector.
+   * @param pats pattern input vector
+   * @returns NamedPattern.
+   */
+  oneFrom: function (...pats: Pattern[]): NamedPattern {
+    return joinPattern(pats, '(?:', '|', ')');
+  },
+
+  /**
+   * Create a double quoted string pattern matcher from a word array.
+   * @param words that can match pattern.
+   * @returns NamedPattern.
+   */
+  oneStringFrom: function (...words: string[]) {
+    return patterns.oneString(patterns.oneFrom(...words));
+  },
+
+  /**
+   * Match true or false for boolean values
+   * @param type overrides the default type.
+   * @returns NamedPattern.
+   */
+  boolValue: function (type?: string) {
+    return patterns.oneFrom(
+      patterns.named('\\btrue\\b', type ?? 'constant.language.true'),
+      patterns.named('\\bfalse\\b', type ?? 'constant.language.false')
+    );
+  },
+
+  /**
+   * Match integer numbers
+   * @param type overrides the default type.
+   * @returns NamedPattern.
+   */
+  integer: function (type?: string) {
+    return patterns.named('\\b[0-9]+\\b', type ?? 'storage.type.int');
+  },
+
+  /**
+   * Match identifiers
+   * @param type overrides the default type.
+   * @returns NamedPattern.
+   */
+  identifier: function (type: string) {
+    return patterns.named('\\b[a-zA-Z_][0-9a-zA-Z_]*\\b', type);
+  },
+
+  /**
+   * Match any string
+   * @param type overrides the default type.
+   * @returns NamedPattern.
+   */
+  anyString: function (type?: string) {
+    type = type ?? 'string.quoted.double';
+    return patterns.named('"(?:[^\\"]|\\.)*"', type);
+  },
+
+  /**
+   * Match any component name
+   * @param type overrides the default type.
+   * @returns NamedPattern.
+   */
+  componentName: function (type?: string) {
+    type = type ?? 'string.quoted.double';
+    return patterns.named('"[0-9a-z_\\-\\.]*"', type);
+  },
+
+  /**
+   * Regular expression for references, e.g. #<child-name>, #<collection-name>
+   * @returns Pattern
+   */
+  nameReference: function () {
+    return patterns.named('"#[0-9a-z_\\-\\.]+"', 'string.quoted.double');
+  },
+
+  /**
+   * Create a NamedPattern.
+   * @param pattern
+   * @param name
+   * @returns NamedPattern
+   */
+  named: function (pattern: Pattern, name: string) {
+    return new NamedPattern(`(${pattern})`, [name, ...getPatternNames(pattern)]);
+  },
+
+  /**
+   * Create a NamedPattern for separators.
+   * @param separator
+   * @returns
+   */
+  separator: function (separator: string) {
+    return patterns.named(separator, 'punctuation.separator');
+  },
+
+  /**
+   * Create a word NamedPattern from a keyword string.
+   * @param keyword string
+   * @param name keyword identifier
+   * @returns NamedPattern
+   */
+  keyword: function (keyword: string, name: string = 'keyword.control') {
+    return patterns.word(patterns.named(keyword, name));
+  },
+};
+
+/**
+ * Value or Array block
+ * @param pattern for a single value or each element of an array, default pattern = anyString()
+ * @returns An array of patterns.
+ */
+function ValueOrArray(pattern: Array<Pattern | TmPattern> = [patterns.anyString()]): Array<Pattern | TmPattern> {
+  return [...pattern, ArrayBlock(pattern)];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// CML language description.
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+const tmLanguage: TmLanguage = {
+  $schema: tmSchema,
+  name: 'CML',
+  scopeName: 'source.cml',
+
+  patterns: [
+    include('comments'),
+
+    DictionaryBlock([
+      keyValue('include', [ArrayBlock()]),
+      include('meta-program-block'),
+      include('meta-children-block'),
+      include('meta-collections-block'),
+      include('meta-environments-block'),
+      include('meta-capabilities-block'),
+      include('meta-use-block'),
+      include('meta-expose-block'),
+      include('meta-offer-block'),
+      keyValue('facets', [
+        include('meta-valid-array-block'),
+        include('meta-valid-dictionary-block'),
+      ]),
+      keyValue('config', [
+        include('meta-valid-array-block'),
+        include('meta-valid-dictionary-block'),
+      ]),
+    ]),
+  ],
+
+  repository: {
+    'meta-program-block': {
+      patterns: [
+        kvDictionary({
+          name: 'program',
+          begin: patterns.keyword('program'),
+          inner: [
+            keyValue('runner'),
+            keyValue('binary'),
+            keyValue('args', [ArrayBlock()]),
+            // In case of using a runner other than elf.
+            include('meta-valid-key-value-block'),
+          ],
+        }),
+      ],
+    },
+
+    'meta-children-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'children',
+          begin: patterns.keyword('children'),
+          inner: [
+            keyValue('name', [patterns.componentName()]),
+            keyValue('url'),
+            keyValue('startup', [patterns.oneStringFrom('lazy', 'eager')]),
+            keyValue('on_terminate', [patterns.oneStringFrom('none', 'reboot')]),
+            keyValue('environment'),
+          ],
+        }),
+      ],
+    },
+
+    'meta-collections-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'collections',
+          begin: patterns.keyword('collections'),
+          inner: [
+            keyValue('name', [patterns.componentName()]),
+            keyValue('durability', [patterns.oneStringFrom('transient', 'single_run')]),
+            keyValue('environment'),
+            keyValue('allowed_offers', [patterns.oneStringFrom('static_only', 'static_and_dynamic')]),
+            keyValue('allow_long_names', [patterns.boolValue()]),
+            keyValue('persistent_storage', [patterns.boolValue()]),
+          ],
+        }),
+      ],
+    },
+
+    'meta-environments-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'environments',
+          begin: patterns.keyword('environments'),
+          inner: [
+            keyValue('name', [patterns.componentName()]),
+            keyValue('extends', [patterns.oneStringFrom('realm', 'none')]),
+            kvArrayDictionary({
+              name: 'runners',
+              begin: patterns.keyword('runners'),
+              inner: [
+                keyValue('runner'),
+                keyValue('from'),
+                keyValue('as'),
+              ],
+            }),
+            kvArrayDictionary({
+              name: 'resolvers',
+              begin: patterns.keyword('resolvers'),
+              inner: [
+                keyValue('resolver'),
+                keyValue('from'),
+                keyValue('scheme'),
+              ],
+            }),
+            kvArrayDictionary({
+              name: 'debug',
+              begin: patterns.keyword('debug'),
+              inner: [
+                keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+                keyValue('from'),
+                keyValue('as'),
+              ],
+            }),
+            keyValue('stop_timeout_ms', [patterns.integer()]),
+          ],
+        }),
+      ],
+    },
+
+    'meta-capabilities-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'capabilities',
+          begin: patterns.keyword('capabilities'),
+          inner: [
+            keyValue('service', [ArrayBlock(), patterns.anyString()]),
+            keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+            keyValue('directory'),
+            keyValue('storage'),
+            keyValue('runner'),
+            keyValue('resolver'),
+            keyValue('event'),
+            keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+            keyValue('path'),
+            keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+            keyValue('from'),
+            keyValue('backing_dir'),
+            keyValue('subdir'),
+            keyValue('storage_id', [patterns.oneStringFrom('static_instance_id', 'static_instance_id_or_moniker')]),
+          ],
+        }),
+      ],
+    },
+
+    'meta-use-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'use',
+          begin: patterns.keyword('use'),
+          inner: [
+            keyValue('service', [ArrayBlock(), patterns.anyString()]),
+            keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+            keyValue('directory'),
+            keyValue('storage'),
+            keyValue('event', [ArrayBlock(), patterns.anyString()]),
+            keyValue('event_stream_deprecated'),
+            keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+            keyValue('from', [
+              patterns.oneStringFrom('self', 'framework', 'parent', 'debug'),
+              patterns.nameReference(),
+            ]),
+            keyValue('path'),
+            keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+            keyValue('subdir'),
+            keyValue('as'),
+            keyValue('scope', [ArrayBlock(), patterns.anyString()]),
+            //TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
+            //provided in fxbug.dev/96705.
+            keyValue('filter', [
+              include('meta-valid-array-block'),
+              include('meta-valid-dictionary-block'),
+            ]),
+            keyValue('subscriptions'),
+            keyValue('dependency', [patterns.oneStringFrom('strong', 'weak_for_migration', 'weak')]),
+            keyValue('availability', [patterns.oneStringFrom('required', 'optional')]),
+          ],
+        }),
+      ],
+    },
+
+    'meta-expose-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'expose',
+          begin: patterns.keyword('expose'),
+          inner: [
+            keyValue('service', [ArrayBlock(), patterns.anyString()]),
+            keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+            keyValue('directory', [ArrayBlock(), patterns.anyString()]),
+            keyValue('runner', [ArrayBlock(), patterns.anyString()]),
+            keyValue('resolver', [ArrayBlock(), patterns.anyString()]),
+            keyValue('from', [
+              patterns.oneStringFrom('self', 'framework'),
+              patterns.nameReference(),
+            ]),
+            keyValue('as'),
+            keyValue('to', [
+              patterns.oneStringFrom('parent', 'framework'),
+            ]),
+            keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+            keyValue('subdir'),
+            keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+            keyValue('scope', [ArrayBlock(), patterns.anyString()]),
+          ],
+        }),
+      ],
+    },
+
+    'meta-offer-block': {
+      patterns: [
+        kvArrayDictionary({
+          name: 'offer',
+          begin: patterns.keyword('offer'),
+          inner: [
+            keyValue('service', [ArrayBlock(), patterns.anyString()]),
+            keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+            keyValue('directory', [ArrayBlock(), patterns.anyString()]),
+            keyValue('runner', [ArrayBlock(), patterns.anyString()]),
+            keyValue('resolver', [ArrayBlock(), patterns.anyString()]),
+            keyValue('storage', [ArrayBlock(), patterns.anyString()]),
+            keyValue('event', [ArrayBlock(), patterns.anyString()]),
+            keyValue('from', ValueOrArray([
+              patterns.oneStringFrom('parent', 'self', 'framework', 'void'),
+              patterns.nameReference(),
+            ])),
+            keyValue('to', ValueOrArray([
+              patterns.oneStringFrom('parent', 'framework'),
+              patterns.nameReference(),
+            ])),
+            keyValue('as'),
+            keyValue('dependency', [patterns.oneStringFrom('strong', 'weak_for_migration', 'weak')]),
+            keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+            keyValue('subdir'),
+            //TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
+            //provided in fxbug.dev/96705.
+            keyValue('filter', [
+              include('meta-valid-array-block'),
+              include('meta-valid-dictionary-block'),
+            ]),
+            keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+            keyValue('scope', [ArrayBlock(), patterns.anyString()]),
+            keyValue('availability', [patterns.oneStringFrom('required', 'optional', 'same_as_target')]),
+            keyValue('source_availability'),
+          ],
+        }),
+      ],
+    },
+
+    ///////////////////////////////////////////////////////////////////////////////////////////////
+    // General valid/invalid blocks
+    ///////////////////////////////////////////////////////////////////////////////////////////////
+    'meta-invalid-array-block': {
+      patterns: [
+        ArrayBlock([
+          patterns.anyString(),
+          patterns.integer(),
+          patterns.boolValue(),
+          include('meta-valid-array-block'),
+          include('meta-valid-dictionary-block'),
+        ], false)
+      ],
+    },
+
+    'meta-valid-array-block': {
+      patterns: [
+        ArrayBlock([
+          patterns.anyString(),
+          patterns.integer(),
+          patterns.boolValue(),
+          include('meta-valid-array-block'),
+          include('meta-valid-dictionary-block'),
+        ], true)
+      ],
+    },
+
+    'meta-invalid-key-value-block': {
+      patterns: [
+        keyValue(
+          'invalid-key-value',
+          [
+            patterns.anyString(),
+            patterns.integer(),
+            patterns.boolValue(),
+            include('meta-valid-array-block'),
+            include('meta-valid-dictionary-block'),
+          ],
+          patterns.oneFrom(
+            patterns.identifier('invalid.illegal'),
+            patterns.anyString('invalid.illegal'),
+          )
+        )
+      ],
+    },
+
+    'meta-valid-key-value-block': {
+      patterns: [
+        keyValue(
+          'any-key-value',
+          [
+            patterns.anyString(),
+            patterns.integer(),
+            patterns.boolValue(),
+            include('meta-valid-array-block'),
+            include('meta-valid-dictionary-block'),
+          ],
+          patterns.oneFrom(
+            patterns.identifier('keyword.control'),
+            patterns.anyString('keyword.control'),
+          )
+        )
+      ],
+    },
+
+    'meta-invalid-dictionary-block': {
+      patterns: [
+        DictionaryBlock([
+          include('meta-valid-key-value-block'),
+        ], false)
+      ],
+    },
+
+    'meta-valid-dictionary-block': {
+      patterns: [
+        DictionaryBlock([
+          include('meta-valid-key-value-block'),
+        ], true)
+      ],
+    },
+
+    ///////////////////////////////////////////////////////////////////////////////////////////////
+    // Comments
+    ///////////////////////////////////////////////////////////////////////////////////////////////
+    comments: {
+      patterns: [
+        match('invalid.illegal.stray-comment-end', '\\*/.*\\n'),
+        match('comment.line.documentation', '///.*\\n'),
+        match('comment.line.double-slash', '//.*\\n'),
+      ],
+    },
+
+  },
+};
+
+export default tmLanguage;