Add FIDL formatting to plugin

This feature allows users of VS Code to use the standard formatting
mechanism (from the Command Palette or via format-on-save) to format any
file marked as FIDL syntax. With this change, formatting of .fidl files
should start to Just Work.

Change-Id: I2695eac980aad1d2865ff7a89b42e37bbcc9489d
diff --git a/package-lock.json b/package-lock.json
index d14ac4b..7bdf9c0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
 	"name": "language-fidl",
-	"version": "0.1.0",
+	"version": "0.1.1",
 	"lockfileVersion": 1,
 	"requires": true,
 	"dependencies": {
@@ -22,13 +22,19 @@
 			"integrity": "sha512-1MxY/ooNO67EQv7Jlv9v/lG1Cll26Uqo4mY00dNPE6TZ62sTJ39WTlEOWbLwn7elRpmqT6hX3fUaBhFeFcQeuA==",
 			"dev": true
 		},
+		"@types/tmp": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.1.0.tgz",
+			"integrity": "sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==",
+			"dev": true
+		},
 		"agent-base": {
 			"version": "4.2.1",
 			"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
 			"integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
 			"dev": true,
 			"requires": {
-				"es6-promisify": "^5.0.0"
+				"es6-promisify": "5.0.0"
 			}
 		},
 		"ajv": {
@@ -37,10 +43,10 @@
 			"integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
 			"dev": true,
 			"requires": {
-				"fast-deep-equal": "^2.0.1",
-				"fast-json-stable-stringify": "^2.0.0",
-				"json-schema-traverse": "^0.4.1",
-				"uri-js": "^4.2.2"
+				"fast-deep-equal": "2.0.1",
+				"fast-json-stable-stringify": "2.0.0",
+				"json-schema-traverse": "0.4.1",
+				"uri-js": "4.2.2"
 			}
 		},
 		"ansi-colors": {
@@ -61,7 +67,7 @@
 			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 			"dev": true,
 			"requires": {
-				"color-convert": "^1.9.0"
+				"color-convert": "1.9.3"
 			}
 		},
 		"arg": {
@@ -76,7 +82,7 @@
 			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
 			"dev": true,
 			"requires": {
-				"sprintf-js": "~1.0.2"
+				"sprintf-js": "1.0.3"
 			}
 		},
 		"asn1": {
@@ -85,7 +91,7 @@
 			"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
 			"dev": true,
 			"requires": {
-				"safer-buffer": "~2.1.0"
+				"safer-buffer": "2.1.2"
 			}
 		},
 		"assert-plus": {
@@ -118,9 +124,9 @@
 			"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
 			"dev": true,
 			"requires": {
-				"chalk": "^1.1.3",
-				"esutils": "^2.0.2",
-				"js-tokens": "^3.0.2"
+				"chalk": "1.1.3",
+				"esutils": "2.0.2",
+				"js-tokens": "3.0.2"
 			},
 			"dependencies": {
 				"ansi-styles": {
@@ -135,11 +141,11 @@
 					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 					"dev": true,
 					"requires": {
-						"ansi-styles": "^2.2.1",
-						"escape-string-regexp": "^1.0.2",
-						"has-ansi": "^2.0.0",
-						"strip-ansi": "^3.0.0",
-						"supports-color": "^2.0.0"
+						"ansi-styles": "2.2.1",
+						"escape-string-regexp": "1.0.5",
+						"has-ansi": "2.0.0",
+						"strip-ansi": "3.0.1",
+						"supports-color": "2.0.0"
 					}
 				},
 				"supports-color": {
@@ -162,7 +168,7 @@
 			"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
 			"dev": true,
 			"requires": {
-				"tweetnacl": "^0.14.3"
+				"tweetnacl": "0.14.5"
 			}
 		},
 		"brace-expansion": {
@@ -171,7 +177,7 @@
 			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
 			"dev": true,
 			"requires": {
-				"balanced-match": "^1.0.0",
+				"balanced-match": "1.0.0",
 				"concat-map": "0.0.1"
 			}
 		},
@@ -211,9 +217,9 @@
 			"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
 			"dev": true,
 			"requires": {
-				"ansi-styles": "^3.2.1",
-				"escape-string-regexp": "^1.0.5",
-				"supports-color": "^5.3.0"
+				"ansi-styles": "3.2.1",
+				"escape-string-regexp": "1.0.5",
+				"supports-color": "5.4.0"
 			}
 		},
 		"cliui": {
@@ -222,9 +228,9 @@
 			"integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
 			"dev": true,
 			"requires": {
-				"string-width": "^2.1.1",
-				"strip-ansi": "^4.0.0",
-				"wrap-ansi": "^2.0.0"
+				"string-width": "2.1.1",
+				"strip-ansi": "4.0.0",
+				"wrap-ansi": "2.1.0"
 			},
 			"dependencies": {
 				"ansi-regex": {
@@ -239,7 +245,7 @@
 					"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^3.0.0"
+						"ansi-regex": "3.0.0"
 					}
 				}
 			}
@@ -271,7 +277,7 @@
 			"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
 			"dev": true,
 			"requires": {
-				"delayed-stream": "~1.0.0"
+				"delayed-stream": "1.0.0"
 			}
 		},
 		"commander": {
@@ -298,11 +304,11 @@
 			"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
 			"dev": true,
 			"requires": {
-				"nice-try": "^1.0.4",
-				"path-key": "^2.0.1",
-				"semver": "^5.5.0",
-				"shebang-command": "^1.2.0",
-				"which": "^1.2.9"
+				"nice-try": "1.0.5",
+				"path-key": "2.0.1",
+				"semver": "5.7.0",
+				"shebang-command": "1.2.0",
+				"which": "1.3.1"
 			}
 		},
 		"dashdash": {
@@ -311,7 +317,7 @@
 			"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
 			"dev": true,
 			"requires": {
-				"assert-plus": "^1.0.0"
+				"assert-plus": "1.0.0"
 			}
 		},
 		"debug": {
@@ -335,7 +341,7 @@
 			"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
 			"dev": true,
 			"requires": {
-				"object-keys": "^1.0.12"
+				"object-keys": "1.1.1"
 			}
 		},
 		"delayed-stream": {
@@ -356,8 +362,8 @@
 			"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
 			"dev": true,
 			"requires": {
-				"jsbn": "~0.1.0",
-				"safer-buffer": "^2.1.0"
+				"jsbn": "0.1.1",
+				"safer-buffer": "2.1.2"
 			}
 		},
 		"emoji-regex": {
@@ -372,7 +378,7 @@
 			"integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
 			"dev": true,
 			"requires": {
-				"once": "^1.4.0"
+				"once": "1.4.0"
 			}
 		},
 		"es-abstract": {
@@ -381,12 +387,12 @@
 			"integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
 			"dev": true,
 			"requires": {
-				"es-to-primitive": "^1.2.0",
-				"function-bind": "^1.1.1",
-				"has": "^1.0.3",
-				"is-callable": "^1.1.4",
-				"is-regex": "^1.0.4",
-				"object-keys": "^1.0.12"
+				"es-to-primitive": "1.2.0",
+				"function-bind": "1.1.1",
+				"has": "1.0.3",
+				"is-callable": "1.1.4",
+				"is-regex": "1.0.4",
+				"object-keys": "1.1.1"
 			}
 		},
 		"es-to-primitive": {
@@ -395,9 +401,9 @@
 			"integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
 			"dev": true,
 			"requires": {
-				"is-callable": "^1.1.4",
-				"is-date-object": "^1.0.1",
-				"is-symbol": "^1.0.2"
+				"is-callable": "1.1.4",
+				"is-date-object": "1.0.1",
+				"is-symbol": "1.0.2"
 			}
 		},
 		"es6-promise": {
@@ -412,7 +418,7 @@
 			"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
 			"dev": true,
 			"requires": {
-				"es6-promise": "^4.0.3"
+				"es6-promise": "4.2.6"
 			}
 		},
 		"escape-string-regexp": {
@@ -439,13 +445,13 @@
 			"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
 			"dev": true,
 			"requires": {
-				"cross-spawn": "^6.0.0",
-				"get-stream": "^4.0.0",
-				"is-stream": "^1.1.0",
-				"npm-run-path": "^2.0.0",
-				"p-finally": "^1.0.0",
-				"signal-exit": "^3.0.0",
-				"strip-eof": "^1.0.0"
+				"cross-spawn": "6.0.5",
+				"get-stream": "4.1.0",
+				"is-stream": "1.1.0",
+				"npm-run-path": "2.0.2",
+				"p-finally": "1.0.0",
+				"signal-exit": "3.0.2",
+				"strip-eof": "1.0.0"
 			}
 		},
 		"extend": {
@@ -478,7 +484,7 @@
 			"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
 			"dev": true,
 			"requires": {
-				"locate-path": "^3.0.0"
+				"locate-path": "3.0.0"
 			}
 		},
 		"flat": {
@@ -487,7 +493,7 @@
 			"integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
 			"dev": true,
 			"requires": {
-				"is-buffer": "~2.0.3"
+				"is-buffer": "2.0.3"
 			}
 		},
 		"forever-agent": {
@@ -502,9 +508,9 @@
 			"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
 			"dev": true,
 			"requires": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.6",
-				"mime-types": "^2.1.12"
+				"asynckit": "0.4.0",
+				"combined-stream": "1.0.7",
+				"mime-types": "2.1.22"
 			}
 		},
 		"fs.realpath": {
@@ -531,7 +537,7 @@
 			"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
 			"dev": true,
 			"requires": {
-				"pump": "^3.0.0"
+				"pump": "3.0.0"
 			}
 		},
 		"getpass": {
@@ -540,7 +546,7 @@
 			"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
 			"dev": true,
 			"requires": {
-				"assert-plus": "^1.0.0"
+				"assert-plus": "1.0.0"
 			}
 		},
 		"glob": {
@@ -549,12 +555,12 @@
 			"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
 			"dev": true,
 			"requires": {
-				"fs.realpath": "^1.0.0",
-				"inflight": "^1.0.4",
-				"inherits": "2",
-				"minimatch": "^3.0.4",
-				"once": "^1.3.0",
-				"path-is-absolute": "^1.0.0"
+				"fs.realpath": "1.0.0",
+				"inflight": "1.0.6",
+				"inherits": "2.0.3",
+				"minimatch": "3.0.4",
+				"once": "1.4.0",
+				"path-is-absolute": "1.0.1"
 			}
 		},
 		"growl": {
@@ -575,8 +581,8 @@
 			"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
 			"dev": true,
 			"requires": {
-				"ajv": "^6.5.5",
-				"har-schema": "^2.0.0"
+				"ajv": "6.10.0",
+				"har-schema": "2.0.0"
 			}
 		},
 		"has": {
@@ -585,7 +591,7 @@
 			"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
 			"dev": true,
 			"requires": {
-				"function-bind": "^1.1.1"
+				"function-bind": "1.1.1"
 			}
 		},
 		"has-ansi": {
@@ -594,7 +600,7 @@
 			"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
 			"dev": true,
 			"requires": {
-				"ansi-regex": "^2.0.0"
+				"ansi-regex": "2.1.1"
 			}
 		},
 		"has-flag": {
@@ -621,7 +627,7 @@
 			"integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
 			"dev": true,
 			"requires": {
-				"agent-base": "4",
+				"agent-base": "4.2.1",
 				"debug": "3.1.0"
 			}
 		},
@@ -631,9 +637,9 @@
 			"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
 			"dev": true,
 			"requires": {
-				"assert-plus": "^1.0.0",
-				"jsprim": "^1.2.2",
-				"sshpk": "^1.7.0"
+				"assert-plus": "1.0.0",
+				"jsprim": "1.4.1",
+				"sshpk": "1.16.1"
 			}
 		},
 		"https-proxy-agent": {
@@ -642,8 +648,8 @@
 			"integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
 			"dev": true,
 			"requires": {
-				"agent-base": "^4.1.0",
-				"debug": "^3.1.0"
+				"agent-base": "4.2.1",
+				"debug": "3.1.0"
 			}
 		},
 		"inflight": {
@@ -652,8 +658,8 @@
 			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
 			"dev": true,
 			"requires": {
-				"once": "^1.3.0",
-				"wrappy": "1"
+				"once": "1.4.0",
+				"wrappy": "1.0.2"
 			}
 		},
 		"inherits": {
@@ -698,7 +704,7 @@
 			"integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
 			"dev": true,
 			"requires": {
-				"has": "^1.0.1"
+				"has": "1.0.3"
 			}
 		},
 		"is-stream": {
@@ -713,7 +719,7 @@
 			"integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
 			"dev": true,
 			"requires": {
-				"has-symbols": "^1.0.0"
+				"has-symbols": "1.0.0"
 			}
 		},
 		"is-typedarray": {
@@ -746,8 +752,8 @@
 			"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
 			"dev": true,
 			"requires": {
-				"argparse": "^1.0.7",
-				"esprima": "^4.0.0"
+				"argparse": "1.0.10",
+				"esprima": "4.0.1"
 			}
 		},
 		"jsbn": {
@@ -792,7 +798,7 @@
 			"integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
 			"dev": true,
 			"requires": {
-				"invert-kv": "^2.0.0"
+				"invert-kv": "2.0.0"
 			}
 		},
 		"locate-path": {
@@ -801,8 +807,8 @@
 			"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
 			"dev": true,
 			"requires": {
-				"p-locate": "^3.0.0",
-				"path-exists": "^3.0.0"
+				"p-locate": "3.0.0",
+				"path-exists": "3.0.0"
 			}
 		},
 		"lodash": {
@@ -817,7 +823,7 @@
 			"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
 			"dev": true,
 			"requires": {
-				"chalk": "^2.0.1"
+				"chalk": "2.4.1"
 			}
 		},
 		"make-error": {
@@ -832,7 +838,7 @@
 			"integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
 			"dev": true,
 			"requires": {
-				"p-defer": "^1.0.0"
+				"p-defer": "1.0.0"
 			}
 		},
 		"mem": {
@@ -841,9 +847,9 @@
 			"integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
 			"dev": true,
 			"requires": {
-				"map-age-cleaner": "^0.1.1",
-				"mimic-fn": "^2.0.0",
-				"p-is-promise": "^2.0.0"
+				"map-age-cleaner": "0.1.3",
+				"mimic-fn": "2.1.0",
+				"p-is-promise": "2.1.0"
 			}
 		},
 		"mime-db": {
@@ -858,7 +864,7 @@
 			"integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
 			"dev": true,
 			"requires": {
-				"mime-db": "~1.38.0"
+				"mime-db": "1.38.0"
 			}
 		},
 		"mimic-fn": {
@@ -873,7 +879,7 @@
 			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
 			"dev": true,
 			"requires": {
-				"brace-expansion": "^1.1.7"
+				"brace-expansion": "1.1.11"
 			}
 		},
 		"minimist": {
@@ -928,7 +934,7 @@
 					"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
 					"dev": true,
 					"requires": {
-						"ms": "^2.1.1"
+						"ms": "2.1.1"
 					}
 				},
 				"glob": {
@@ -937,12 +943,12 @@
 					"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
 					"dev": true,
 					"requires": {
-						"fs.realpath": "^1.0.0",
-						"inflight": "^1.0.4",
-						"inherits": "2",
-						"minimatch": "^3.0.4",
-						"once": "^1.3.0",
-						"path-is-absolute": "^1.0.0"
+						"fs.realpath": "1.0.0",
+						"inflight": "1.0.6",
+						"inherits": "2.0.3",
+						"minimatch": "3.0.4",
+						"once": "1.4.0",
+						"path-is-absolute": "1.0.1"
 					}
 				},
 				"he": {
@@ -957,8 +963,8 @@
 					"integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==",
 					"dev": true,
 					"requires": {
-						"argparse": "^1.0.7",
-						"esprima": "^4.0.0"
+						"argparse": "1.0.10",
+						"esprima": "4.0.1"
 					}
 				},
 				"ms": {
@@ -973,7 +979,7 @@
 					"integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
 					"dev": true,
 					"requires": {
-						"has-flag": "^3.0.0"
+						"has-flag": "3.0.0"
 					}
 				}
 			}
@@ -1002,7 +1008,7 @@
 			"integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==",
 			"dev": true,
 			"requires": {
-				"object.getownpropertydescriptors": "^2.0.3"
+				"object.getownpropertydescriptors": "2.0.3"
 			}
 		},
 		"npm-run-path": {
@@ -1011,7 +1017,7 @@
 			"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
 			"dev": true,
 			"requires": {
-				"path-key": "^2.0.0"
+				"path-key": "2.0.1"
 			}
 		},
 		"number-is-nan": {
@@ -1038,10 +1044,10 @@
 			"integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
 			"dev": true,
 			"requires": {
-				"define-properties": "^1.1.2",
-				"function-bind": "^1.1.1",
-				"has-symbols": "^1.0.0",
-				"object-keys": "^1.0.11"
+				"define-properties": "1.1.3",
+				"function-bind": "1.1.1",
+				"has-symbols": "1.0.0",
+				"object-keys": "1.1.1"
 			}
 		},
 		"object.getownpropertydescriptors": {
@@ -1050,8 +1056,8 @@
 			"integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
 			"dev": true,
 			"requires": {
-				"define-properties": "^1.1.2",
-				"es-abstract": "^1.5.1"
+				"define-properties": "1.1.3",
+				"es-abstract": "1.13.0"
 			}
 		},
 		"once": {
@@ -1060,7 +1066,7 @@
 			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
 			"dev": true,
 			"requires": {
-				"wrappy": "1"
+				"wrappy": "1.0.2"
 			}
 		},
 		"oniguruma": {
@@ -1069,7 +1075,7 @@
 			"integrity": "sha512-zCsdNxTrrB4yVPMxhcIODGv1p4NVBu9WvsWnIGhMpu5djO4MQWXrC7YKjtza+OyoRqqgy27CqYWa1h5e2DDbig==",
 			"dev": true,
 			"requires": {
-				"nan": "^2.10.0"
+				"nan": "2.13.2"
 			}
 		},
 		"os-locale": {
@@ -1078,9 +1084,9 @@
 			"integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
 			"dev": true,
 			"requires": {
-				"execa": "^1.0.0",
-				"lcid": "^2.0.0",
-				"mem": "^4.0.0"
+				"execa": "1.0.0",
+				"lcid": "2.0.0",
+				"mem": "4.3.0"
 			}
 		},
 		"p-defer": {
@@ -1107,7 +1113,7 @@
 			"integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
 			"dev": true,
 			"requires": {
-				"p-try": "^2.0.0"
+				"p-try": "2.2.0"
 			}
 		},
 		"p-locate": {
@@ -1116,7 +1122,7 @@
 			"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
 			"dev": true,
 			"requires": {
-				"p-limit": "^2.0.0"
+				"p-limit": "2.2.0"
 			}
 		},
 		"p-try": {
@@ -1173,8 +1179,8 @@
 			"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
 			"dev": true,
 			"requires": {
-				"end-of-stream": "^1.1.0",
-				"once": "^1.3.1"
+				"end-of-stream": "1.4.1",
+				"once": "1.4.0"
 			}
 		},
 		"punycode": {
@@ -1201,26 +1207,26 @@
 			"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
 			"dev": true,
 			"requires": {
-				"aws-sign2": "~0.7.0",
-				"aws4": "^1.8.0",
-				"caseless": "~0.12.0",
-				"combined-stream": "~1.0.6",
-				"extend": "~3.0.2",
-				"forever-agent": "~0.6.1",
-				"form-data": "~2.3.2",
-				"har-validator": "~5.1.0",
-				"http-signature": "~1.2.0",
-				"is-typedarray": "~1.0.0",
-				"isstream": "~0.1.2",
-				"json-stringify-safe": "~5.0.1",
-				"mime-types": "~2.1.19",
-				"oauth-sign": "~0.9.0",
-				"performance-now": "^2.1.0",
-				"qs": "~6.5.2",
-				"safe-buffer": "^5.1.2",
-				"tough-cookie": "~2.4.3",
-				"tunnel-agent": "^0.6.0",
-				"uuid": "^3.3.2"
+				"aws-sign2": "0.7.0",
+				"aws4": "1.8.0",
+				"caseless": "0.12.0",
+				"combined-stream": "1.0.7",
+				"extend": "3.0.2",
+				"forever-agent": "0.6.1",
+				"form-data": "2.3.3",
+				"har-validator": "5.1.3",
+				"http-signature": "1.2.0",
+				"is-typedarray": "1.0.0",
+				"isstream": "0.1.2",
+				"json-stringify-safe": "5.0.1",
+				"mime-types": "2.1.22",
+				"oauth-sign": "0.9.0",
+				"performance-now": "2.1.0",
+				"qs": "6.5.2",
+				"safe-buffer": "5.1.2",
+				"tough-cookie": "2.4.3",
+				"tunnel-agent": "0.6.0",
+				"uuid": "3.3.2"
 			}
 		},
 		"require-directory": {
@@ -1247,7 +1253,7 @@
 			"integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
 			"dev": true,
 			"requires": {
-				"path-parse": "^1.0.6"
+				"path-parse": "1.0.6"
 			}
 		},
 		"safe-buffer": {
@@ -1280,7 +1286,7 @@
 			"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
 			"dev": true,
 			"requires": {
-				"shebang-regex": "^1.0.0"
+				"shebang-regex": "1.0.0"
 			}
 		},
 		"shebang-regex": {
@@ -1307,8 +1313,8 @@
 			"integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
 			"dev": true,
 			"requires": {
-				"buffer-from": "^1.0.0",
-				"source-map": "^0.6.0"
+				"buffer-from": "1.1.1",
+				"source-map": "0.6.1"
 			}
 		},
 		"sprintf-js": {
@@ -1323,15 +1329,15 @@
 			"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
 			"dev": true,
 			"requires": {
-				"asn1": "~0.2.3",
-				"assert-plus": "^1.0.0",
-				"bcrypt-pbkdf": "^1.0.0",
-				"dashdash": "^1.12.0",
-				"ecc-jsbn": "~0.1.1",
-				"getpass": "^0.1.1",
-				"jsbn": "~0.1.0",
-				"safer-buffer": "^2.0.2",
-				"tweetnacl": "~0.14.0"
+				"asn1": "0.2.4",
+				"assert-plus": "1.0.0",
+				"bcrypt-pbkdf": "1.0.2",
+				"dashdash": "1.14.1",
+				"ecc-jsbn": "0.1.2",
+				"getpass": "0.1.7",
+				"jsbn": "0.1.1",
+				"safer-buffer": "2.1.2",
+				"tweetnacl": "0.14.5"
 			}
 		},
 		"string-width": {
@@ -1340,8 +1346,8 @@
 			"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
 			"dev": true,
 			"requires": {
-				"is-fullwidth-code-point": "^2.0.0",
-				"strip-ansi": "^4.0.0"
+				"is-fullwidth-code-point": "2.0.0",
+				"strip-ansi": "4.0.0"
 			},
 			"dependencies": {
 				"ansi-regex": {
@@ -1356,7 +1362,7 @@
 					"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^3.0.0"
+						"ansi-regex": "3.0.0"
 					}
 				}
 			}
@@ -1367,7 +1373,7 @@
 			"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
 			"dev": true,
 			"requires": {
-				"ansi-regex": "^2.0.0"
+				"ansi-regex": "2.1.1"
 			}
 		},
 		"strip-eof": {
@@ -1388,7 +1394,7 @@
 			"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
 			"dev": true,
 			"requires": {
-				"has-flag": "^3.0.0"
+				"has-flag": "3.0.0"
 			}
 		},
 		"tough-cookie": {
@@ -1397,8 +1403,8 @@
 			"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
 			"dev": true,
 			"requires": {
-				"psl": "^1.1.24",
-				"punycode": "^1.4.1"
+				"psl": "1.1.31",
+				"punycode": "1.4.1"
 			},
 			"dependencies": {
 				"punycode": {
@@ -1415,11 +1421,11 @@
 			"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
 			"dev": true,
 			"requires": {
-				"arg": "^4.1.0",
-				"diff": "^3.1.0",
-				"make-error": "^1.1.1",
-				"source-map-support": "^0.5.6",
-				"yn": "^3.0.0"
+				"arg": "4.1.0",
+				"diff": "3.5.0",
+				"make-error": "1.3.5",
+				"source-map-support": "0.5.9",
+				"yn": "3.1.0"
 			}
 		},
 		"tslib": {
@@ -1434,19 +1440,19 @@
 			"integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==",
 			"dev": true,
 			"requires": {
-				"babel-code-frame": "^6.22.0",
-				"builtin-modules": "^1.1.1",
-				"chalk": "^2.3.0",
-				"commander": "^2.12.1",
-				"diff": "^3.2.0",
-				"glob": "^7.1.1",
-				"js-yaml": "^3.13.0",
-				"minimatch": "^3.0.4",
-				"mkdirp": "^0.5.1",
-				"resolve": "^1.3.2",
-				"semver": "^5.3.0",
-				"tslib": "^1.8.0",
-				"tsutils": "^2.29.0"
+				"babel-code-frame": "6.26.0",
+				"builtin-modules": "1.1.1",
+				"chalk": "2.4.1",
+				"commander": "2.15.1",
+				"diff": "3.5.0",
+				"glob": "7.1.2",
+				"js-yaml": "3.13.1",
+				"minimatch": "3.0.4",
+				"mkdirp": "0.5.1",
+				"resolve": "1.10.0",
+				"semver": "5.7.0",
+				"tslib": "1.9.3",
+				"tsutils": "2.29.0"
 			}
 		},
 		"tsutils": {
@@ -1455,7 +1461,7 @@
 			"integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
 			"dev": true,
 			"requires": {
-				"tslib": "^1.8.1"
+				"tslib": "1.9.3"
 			}
 		},
 		"tunnel-agent": {
@@ -1464,7 +1470,7 @@
 			"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
 			"dev": true,
 			"requires": {
-				"safe-buffer": "^5.0.1"
+				"safe-buffer": "5.1.2"
 			}
 		},
 		"tweetnacl": {
@@ -1485,7 +1491,7 @@
 			"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
 			"dev": true,
 			"requires": {
-				"punycode": "^2.1.0"
+				"punycode": "2.1.1"
 			}
 		},
 		"url-parse": {
@@ -1494,8 +1500,8 @@
 			"integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==",
 			"dev": true,
 			"requires": {
-				"querystringify": "^2.0.0",
-				"requires-port": "^1.0.0"
+				"querystringify": "2.1.1",
+				"requires-port": "1.0.0"
 			}
 		},
 		"uuid": {
@@ -1510,9 +1516,9 @@
 			"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
 			"dev": true,
 			"requires": {
-				"assert-plus": "^1.0.0",
+				"assert-plus": "1.0.0",
 				"core-util-is": "1.0.2",
-				"extsprintf": "^1.2.0"
+				"extsprintf": "1.3.0"
 			}
 		},
 		"vscode": {
@@ -1521,13 +1527,13 @@
 			"integrity": "sha512-sXedp2oF6y4ZvqrrFiZpeMzaCLSWV+PpYkIxjG/iYquNZ9KrLL2LujltGxPLvzn49xu2sZkyC+avVNFgcJD1Iw==",
 			"dev": true,
 			"requires": {
-				"glob": "^7.1.2",
-				"mocha": "^4.0.1",
-				"request": "^2.88.0",
-				"semver": "^5.4.1",
-				"source-map-support": "^0.5.0",
-				"url-parse": "^1.4.4",
-				"vscode-test": "^0.1.4"
+				"glob": "7.1.2",
+				"mocha": "4.1.0",
+				"request": "2.88.0",
+				"semver": "5.7.0",
+				"source-map-support": "0.5.9",
+				"url-parse": "1.4.4",
+				"vscode-test": "0.1.5"
 			},
 			"dependencies": {
 				"browser-stdout": {
@@ -1584,7 +1590,7 @@
 					"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
 					"dev": true,
 					"requires": {
-						"has-flag": "^2.0.0"
+						"has-flag": "2.0.0"
 					}
 				}
 			}
@@ -1595,8 +1601,8 @@
 			"integrity": "sha512-s+lbF1Dtasc0yXVB9iQTexBe2JK6HJAUJe3fWezHKIjq+xRw5ZwCMEMBaonFIPy7s95qg2HPTRDR5W4h4kbxGw==",
 			"dev": true,
 			"requires": {
-				"http-proxy-agent": "^2.1.0",
-				"https-proxy-agent": "^2.2.1"
+				"http-proxy-agent": "2.1.0",
+				"https-proxy-agent": "2.2.1"
 			}
 		},
 		"which": {
@@ -1605,7 +1611,7 @@
 			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 			"dev": true,
 			"requires": {
-				"isexe": "^2.0.0"
+				"isexe": "2.0.0"
 			}
 		},
 		"which-module": {
@@ -1620,7 +1626,7 @@
 			"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
 			"dev": true,
 			"requires": {
-				"string-width": "^1.0.2 || 2"
+				"string-width": "2.1.1"
 			}
 		},
 		"wrap-ansi": {
@@ -1629,8 +1635,8 @@
 			"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
 			"dev": true,
 			"requires": {
-				"string-width": "^1.0.1",
-				"strip-ansi": "^3.0.1"
+				"string-width": "1.0.2",
+				"strip-ansi": "3.0.1"
 			},
 			"dependencies": {
 				"is-fullwidth-code-point": {
@@ -1639,7 +1645,7 @@
 					"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
 					"dev": true,
 					"requires": {
-						"number-is-nan": "^1.0.0"
+						"number-is-nan": "1.0.1"
 					}
 				},
 				"string-width": {
@@ -1648,9 +1654,9 @@
 					"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
 					"dev": true,
 					"requires": {
-						"code-point-at": "^1.0.0",
-						"is-fullwidth-code-point": "^1.0.0",
-						"strip-ansi": "^3.0.0"
+						"code-point-at": "1.1.0",
+						"is-fullwidth-code-point": "1.0.0",
+						"strip-ansi": "3.0.1"
 					}
 				}
 			}
@@ -1673,17 +1679,17 @@
 			"integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==",
 			"dev": true,
 			"requires": {
-				"cliui": "^4.0.0",
-				"find-up": "^3.0.0",
-				"get-caller-file": "^2.0.1",
-				"os-locale": "^3.1.0",
-				"require-directory": "^2.1.1",
-				"require-main-filename": "^2.0.0",
-				"set-blocking": "^2.0.0",
-				"string-width": "^3.0.0",
-				"which-module": "^2.0.0",
-				"y18n": "^4.0.0",
-				"yargs-parser": "^13.0.0"
+				"cliui": "4.1.0",
+				"find-up": "3.0.0",
+				"get-caller-file": "2.0.5",
+				"os-locale": "3.1.0",
+				"require-directory": "2.1.1",
+				"require-main-filename": "2.0.0",
+				"set-blocking": "2.0.0",
+				"string-width": "3.1.0",
+				"which-module": "2.0.0",
+				"y18n": "4.0.0",
+				"yargs-parser": "13.0.0"
 			},
 			"dependencies": {
 				"ansi-regex": {
@@ -1698,9 +1704,9 @@
 					"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
 					"dev": true,
 					"requires": {
-						"emoji-regex": "^7.0.1",
-						"is-fullwidth-code-point": "^2.0.0",
-						"strip-ansi": "^5.1.0"
+						"emoji-regex": "7.0.3",
+						"is-fullwidth-code-point": "2.0.0",
+						"strip-ansi": "5.2.0"
 					}
 				},
 				"strip-ansi": {
@@ -1709,7 +1715,7 @@
 					"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^4.1.0"
+						"ansi-regex": "4.1.0"
 					}
 				}
 			}
@@ -1720,8 +1726,8 @@
 			"integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==",
 			"dev": true,
 			"requires": {
-				"camelcase": "^5.0.0",
-				"decamelize": "^1.2.0"
+				"camelcase": "5.3.1",
+				"decamelize": "1.2.0"
 			}
 		},
 		"yargs-unparser": {
@@ -1730,9 +1736,9 @@
 			"integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==",
 			"dev": true,
 			"requires": {
-				"flat": "^4.1.0",
-				"lodash": "^4.17.11",
-				"yargs": "^12.0.5"
+				"flat": "4.1.0",
+				"lodash": "4.17.11",
+				"yargs": "12.0.5"
 			},
 			"dependencies": {
 				"get-caller-file": {
@@ -1753,18 +1759,18 @@
 					"integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
 					"dev": true,
 					"requires": {
-						"cliui": "^4.0.0",
-						"decamelize": "^1.2.0",
-						"find-up": "^3.0.0",
-						"get-caller-file": "^1.0.1",
-						"os-locale": "^3.0.0",
-						"require-directory": "^2.1.1",
-						"require-main-filename": "^1.0.1",
-						"set-blocking": "^2.0.0",
-						"string-width": "^2.0.0",
-						"which-module": "^2.0.0",
-						"y18n": "^3.2.1 || ^4.0.0",
-						"yargs-parser": "^11.1.1"
+						"cliui": "4.1.0",
+						"decamelize": "1.2.0",
+						"find-up": "3.0.0",
+						"get-caller-file": "1.0.3",
+						"os-locale": "3.1.0",
+						"require-directory": "2.1.1",
+						"require-main-filename": "1.0.1",
+						"set-blocking": "2.0.0",
+						"string-width": "2.1.1",
+						"which-module": "2.0.0",
+						"y18n": "4.0.0",
+						"yargs-parser": "11.1.1"
 					}
 				},
 				"yargs-parser": {
@@ -1773,8 +1779,8 @@
 					"integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
 					"dev": true,
 					"requires": {
-						"camelcase": "^5.0.0",
-						"decamelize": "^1.2.0"
+						"camelcase": "5.3.1",
+						"decamelize": "1.2.0"
 					}
 				}
 			}
diff --git a/package.json b/package.json
index b116c1e..2afa879 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
 	"categories": [
 		"Programming Languages"
 	],
-	"main": "./out/extension",
+	"main": "./out/extension.js",
 	"contributes": {
 		"languages": [
 			{
@@ -32,14 +32,33 @@
 				"scopeName": "source.fidl",
 				"path": "./syntaxes/fidl.tmLanguage.json"
 			}
+		],
+		"configuration": [
+			{
+				"title": "FIDL",
+				"properties": {
+					"fidl.format.enable": {
+						"type": "boolean",
+						"default": true,
+						"description": "Enable/disable FIDL formatter."
+					},
+					"fidl.formatTool": {
+						"type": "string",
+						"description": "Specifies the absolute path to the fidl-format tool."
+					}
+				}
+			}
 		]
-        },
+	},
 	"homepage": "https://fuchsia.googlesource.com/vscode-language-fidl",
 	"repository": {
 		"type": "git",
 		"url": "https://fuchsia.googlesource.com/vscode-language-fidl"
 	},
 	"icon": "images/fuchsia_logo_128x128.png",
+	"activationEvents": [
+		"onLanguage:fidl"
+	],
 	"scripts": {
 		"vscode:prepublish": "npm run compile",
 		"compile": "tsc -p ./",
@@ -53,6 +72,7 @@
 		"@types/mocha": "^5.2.6",
 		"@types/node": "^11.13.4",
 		"@types/oniguruma": "^7.0.1",
+		"@types/tmp": "^0.1.0",
 		"mocha": "^6.1.2",
 		"oniguruma": "^7.0.2",
 		"prettier": "*",
diff --git a/src/extension.ts b/src/extension.ts
index 2d99392..e3cc0a0 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -1,9 +1,12 @@
 'use strict';
 
 import * as vscode from 'vscode';
+import FidlFormattingEditProvider from './formatter';
 
-export function activate(context: vscode.ExtensionContext) {
-}
-
-export function deactivate() {
+export function activate(_context: vscode.ExtensionContext) {
+    if (vscode.workspace.getConfiguration('fidl.format').get('enable')) {
+        vscode.languages.registerDocumentFormattingEditProvider(
+            { language: 'fidl' },
+            new FidlFormattingEditProvider());
+    }
 }
\ No newline at end of file
diff --git a/src/formatter.ts b/src/formatter.ts
new file mode 100644
index 0000000..78c9f93
--- /dev/null
+++ b/src/formatter.ts
@@ -0,0 +1,131 @@
+'use strict';
+
+import * as vscode from 'vscode';
+import { spawnSync } from 'child_process';
+import * as fs from 'fs';
+
+const notDefined = "FIDL format tool not specified. Please set the path to fidl-format in Settings.";
+const notExecutable = "FIDL format tool doesn't exist or can't be run. Please verify the path to fidl-format in Settings.";
+const formatterError = "Error formatting FIDL";
+
+const editSettingLabel = "Edit setting";
+
+enum FormatToolErrorCause {
+    ToolNotSpecified, ToolNotExecutable, FormatterError
+}
+
+class FormatToolError extends Error {
+    cause: FormatToolErrorCause;
+    formatterMessage: string | undefined;
+
+    constructor(cause: FormatToolErrorCause) {
+        super();
+        this.cause = cause;
+    }
+}
+
+/**
+ * Checks whether the path to fidl-format has been filled out. If the default
+ * value of an empty string is found, an error is shown as a notification.
+ */
+function getFidlFormatToolPath(): string {
+    const formatTool: string | undefined | null = vscode.workspace.getConfiguration('fidl').get('formatTool');
+    if (!formatTool) {
+        throw new FormatToolError(FormatToolErrorCause.ToolNotSpecified);
+    }
+
+    try {
+        // Throws if tool is not present or not executable.
+        fs.accessSync(formatTool, fs.constants.X_OK);
+    } catch (e) {
+        throw new FormatToolError(FormatToolErrorCause.ToolNotExecutable);
+    }
+
+    return formatTool as string;
+}
+
+async function showError(e: FormatToolError) {
+    let message;
+    let showEdit = false;
+    switch (e.cause) {
+        case FormatToolErrorCause.ToolNotSpecified:
+            message = notDefined;
+            showEdit = true;
+            break;
+        case FormatToolErrorCause.ToolNotExecutable:
+            message = notExecutable;
+            showEdit = true;
+            break;
+        case FormatToolErrorCause.FormatterError:
+            message = `${formatterError}: ${e.formatterMessage}`
+            break;
+        default:
+            // This shouldn't happen. Since we don't know what kind of error we
+            // have, we rethrow so this error appears in the console during
+            // development.
+            throw e;
+    }
+    let items: string[] = [];
+    if (showEdit) {
+        items.push(editSettingLabel);
+    }
+    let item = await vscode.window.showErrorMessage(message, ...items);
+    switch (item) {
+        case undefined:
+        case null:
+            // The user did not choose to edit setting.
+            return;
+        case editSettingLabel:
+            vscode.commands.executeCommand('workbench.action.openSettings', 'fidl.formatTool');
+    }
+}
+
+/**
+ * A formatting edit provider that runs fidl-format over the code in the
+ * current FIDL file. This happens indirectly by the use of a temporary file to
+ * work around fidl-format's limitation of not accepting FIDL code via standard
+ * input.
+ *
+ * Objects of this class will check for the presence of the fidl-format path in
+ * settings when instantiated and on every formatting request. If the path is
+ * left empty (the default) and the path to fidl-format isn't specified,
+ * objects of this class will show a notification to the user each time they
+ * try to format a FIDL file.
+ */
+export default class FidlFormattingEditProvider implements vscode.DocumentFormattingEditProvider {
+    constructor() {
+        try {
+            getFidlFormatToolPath();
+        } catch (e) {
+            showError(e);
+        }
+    }
+
+    provideDocumentFormattingEdits(document: vscode.TextDocument): vscode.TextEdit[] {
+        let formatTool: string;
+        try {
+            formatTool = getFidlFormatToolPath();
+        } catch (e) {
+            showError(e);
+            return [];
+        }
+
+        // FIDL files are assumed to always be UTF-8.
+        const format = spawnSync(formatTool, ["-"], { encoding: 'utf8', input: document.getText() });
+        if (format.status) {
+            // fidl-format exited with an error.
+            const e = new FormatToolError(FormatToolErrorCause.FormatterError);
+            e.formatterMessage = format.stderr;
+            showError(e);
+            // Return no edits. i.e. no changes to document.
+            return [];
+        }
+
+        const fileStart = new vscode.Position(0, 0);
+        const fileEnd = document.lineAt(document.lineCount - 1).range.end;
+
+        // Casting: because spawnSync was called with an encoding,
+        // format.stdout is already a string.
+        return [new vscode.TextEdit(new vscode.Range(fileStart, fileEnd), format.stdout as string)];
+    }
+}