All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.javascript.jscomp.resources.resources.json Maven / Gradle / Ivy

Go to download

Closure Compiler is a JavaScript optimizing compiler. It parses your JavaScript, analyzes it, removes dead code and rewrites and minimizes what's left. It also checks syntax, variable references, and types, and warns about common JavaScript pitfalls. It is used in many of Google's JavaScript apps, including Gmail, Google Web Search, Google Maps, and Google Docs.

There is a newer version: v20240317
Show newest version
{"externs/es3.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview ECMAScript 3 Built-Ins. This include common extensions so this\n * is actually ES3+Reality.\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n * @author [email protected] (Nick Santos)\n * @author [email protected] (Erik Arvidsson)\n * @author [email protected] (John Lenz)\n */\n\n\n// START ES6 RETROFIT CODE\n// symbol, Symbol and Symbol.iterator are actually ES6 types but some\n// base types require them to be part of their definition (such as Array).\n\n\n/**\n * @constructor\n * @param {*=} opt_description\n * @return {symbol}\n * @nosideeffects\n * Note: calling `new Symbol('x');` will always throw, but we mark this\n * nosideeffects because the compiler does not promise to preserve all coding\n * errors.\n */\nfunction Symbol(opt_description) {}\n\n\n/**\n * @const {string|undefined}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/description\n */\nSymbol.prototype.description;\n\n\n/**\n * @param {string} sym\n * @return {symbol}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for\n */\nSymbol.for = function(sym) {};\n\n\n/**\n * @param {symbol} sym\n * @return {string|undefined}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/keyFor\n */\nSymbol.keyFor = function(sym) {};\n\n\n// Well known symbols\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator\n * @const {symbol}\n */\nSymbol.asyncIterator;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance\n * @const {symbol}\n */\nSymbol.hasInstance;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable\n * @const {symbol}\n */\nSymbol.isConcatSpreadable;\n\n/**\n * @const {symbol}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator\n */\nSymbol.iterator;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/match\n * @const {symbol}\n */\nSymbol.match;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/matchAll\n * @const {symbol}\n */\nSymbol.matchAll;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace\n * @const {symbol}\n */\nSymbol.replace;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/search\n * @const {symbol}\n */\nSymbol.search;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species\n * @const {symbol}\n */\nSymbol.species;\n\n// /**\n//  * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/split\n//  * @const {symbol}\n//  */\n// Symbol.split;\n\n/**\n * @const {symbol}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive\n */\nSymbol.toPrimitive;\n\n/**\n * @const {symbol}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag\n */\nSymbol.toStringTag;\n\n/**\n * @const {symbol}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/unscopables\n */\nSymbol.unscopables;\n\n\n/**\n * @record\n * @template VALUE\n */\nfunction IIterableResult() {};\n\n/** @type {boolean} */\nIIterableResult.prototype.done;\n\n/** @type {VALUE} */\nIIterableResult.prototype.value;\n\n\n\n/**\n * @interface\n * @template VALUE\n */\nfunction Iterable() {}\n\n// TODO(johnlenz): remove the suppression when the compiler understands\n// \"symbol\" natively\n/**\n * @return {!Iterator}\n * @suppress {externsValidation}\n */\nIterable.prototype[Symbol.iterator] = function() {};\n\n\n\n/**\n * TODO(b/142881197): UNUSED_RETURN_T and UNUSED_NEXT_T are not yet used for\n * anything. https://github.com/google/closure-compiler/issues/3489\n * @interface\n * @template VALUE, UNUSED_RETURN_T, UNUSED_NEXT_T\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol\n */\nfunction Iterator() {}\n\n/**\n * @param {?=} opt_value\n * @return {!IIterableResult}\n */\nIterator.prototype.next = function(opt_value) {};\n\n\n/**\n * Use this to indicate a type is both an Iterator and an Iterable.\n *\n * @interface\n * @extends {Iterator}\n * @extends {Iterable}\n * @template T\n */\nfunction IteratorIterable() {}\n\n// END ES6 RETROFIT CODE\n\n\n/**\n * @interface\n * @template IOBJECT_KEY, IOBJECT_VALUE\n */\nfunction IObject() {}\n\n/**\n * @record\n * @extends {IObject}\n * @template VALUE2\n */\nfunction IArrayLike() {}\n\n/** @type {number} */\nIArrayLike.prototype.length;\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments\n */\nfunction Arguments() {}\n\n/**\n * @type {Function}\n * @see http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Functions_and_function_scope/arguments/callee\n */\nArguments.prototype.callee;\n\n/**\n * Use the non-standard {@see Function.prototype.caller} property of a function\n * object instead.\n * @type {Function}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller\n * @deprecated\n */\nArguments.prototype.caller;\n\n/**\n * @type {number}\n * @see http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Functions_and_function_scope/arguments/length\n */\nArguments.prototype.length;\n\n/**\n * Not actually a global variable, when running in a browser environment. But\n * we need it in order for the type checker to typecheck the \"arguments\"\n * variable in a function correctly.\n *\n * TODO(tbreisacher): There should be a separate 'arguments' variable of type\n * `Array`, in the d8 externs.\n *\n * @type {!Arguments}\n * @see http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Functions_and_function_scope/arguments\n */\nvar arguments;\n\n/**\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity\n * @const\n */\nvar Infinity;\n\n/**\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN\n * @const\n */\nvar NaN;\n\n/**\n * @type {undefined}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined\n * @const\n */\nvar undefined;\n\n/**\n * @param {string} uri\n * @return {string}\n * @throws {URIError} when used wrongly.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURI\n */\nfunction decodeURI(uri) {}\n\n/**\n * @param {string} uri\n * @return {string}\n * @throws {URIError} when used wrongly.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n */\nfunction decodeURIComponent(uri) {}\n\n/**\n * @param {string} uri\n * @return {string}\n * @throws {URIError} if one attempts to encode a surrogate which is not part of\n * a high-low pair.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI\n */\nfunction encodeURI(uri) {}\n\n/**\n * @param {string} uri\n * @return {string}\n * @throws {URIError} if one attempts to encode a surrogate which is not part of\n * a high-low pair.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n */\nfunction encodeURIComponent(uri) {}\n\n/**\n * Should only be used in browsers where encode/decodeURIComponent\n * are not present, as the latter handle fancy Unicode characters.\n * @param {string} str\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Predefined_Functions/escape_and_unescape_Functions\n */\nfunction escape(str) {}\n\n/**\n * Should only be used in browsers where encode/decodeURIComponent\n * are not present, as the latter handle fancy Unicode characters.\n * @param {string} str\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Predefined_Functions/escape_and_unescape_Functions\n */\nfunction unescape(str) {}\n\n/**\n * @param {*} num\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite\n */\nfunction isFinite(num) {}\n\n/**\n * @param {*} num\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN\n */\nfunction isNaN(num) {}\n\n/**\n * @param {*} num\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat\n */\nfunction parseFloat(num) {}\n\n/**\n * Parse an integer. Use of `parseInt` without `base` is strictly\n * banned in Google. If you really want to parse octal or hex based on the\n * leader, then pass `undefined` as the base.\n *\n * @param {*} num\n * @param {number|undefined} base\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt\n */\nfunction parseInt(num, base) {}\n\n/**\n * @param {string} code\n * @return {*}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval\n */\nfunction eval(code) {}\n\n\n\n/**\n * @constructor\n * @param {*=} opt_value\n * @return {!Object}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n */\nfunction Object(opt_value) {}\n\n/**\n * The constructor of the current object.\n * @type {Function}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor\n */\nObject.prototype.constructor = function() {};\n\n/**\n * Binds an object's property to a function to be called when that property is\n * looked up.\n * Mozilla-only.\n *\n * @param {string} sprop\n * @param {Function} fun\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineGetter\n * @return {undefined}\n * @deprecated\n */\nObject.prototype.__defineGetter__ = function(sprop, fun) {};\n\n/**\n * Binds an object's property to a function to be called when an attempt is made\n * to set that property.\n * Mozilla-only.\n *\n * @param {string} sprop\n * @param {Function} fun\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineSetter\n * @return {undefined}\n * @deprecated\n */\nObject.prototype.__defineSetter__ = function(sprop, fun) {};\n\n/**\n * Returns whether the object has a property with the specified name.\n *\n * @param {*} propertyName Implicitly cast to a string.\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty\n */\nObject.prototype.hasOwnProperty = function(propertyName) {};\n\n/**\n * Returns whether an object exists in another object's prototype chain.\n *\n * @param {Object} other\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf\n */\nObject.prototype.isPrototypeOf = function(other) {};\n\n/**\n * Return the function bound as a getter to the specified property.\n * Mozilla-only.\n *\n * @param {string} sprop a string containing the name of the property whose\n * getter should be returned\n * @return {Function}\n * @nosideeffects\n * @deprecated\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/lookupGetter\n */\nObject.prototype.__lookupGetter__ = function(sprop) {};\n\n/**\n * Return the function bound as a setter to the specified property.\n * Mozilla-only.\n *\n * @param {string} sprop a string containing the name of the property whose\n *     setter should be returned.\n * @return {Function}\n * @nosideeffects\n * @deprecated\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/lookupSetter\n */\nObject.prototype.__lookupSetter__ = function(sprop) {};\n\n/**\n * Executes a function when a non-existent method is called on an object.\n * Mozilla-only.\n *\n * @param {Function} fun\n * @return {*}\n * @deprecated\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod\n */\nObject.prototype.__noSuchMethod__ = function(fun) {};\n\n/**\n * Points to an object's context.  For top-level objects, this is the e.g. window.\n * Mozilla-only.\n *\n * @type {Object}\n * @deprecated\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/parent\n */\nObject.prototype.__parent__;\n\n/**\n * Points to the object which was used as prototype when the object was instantiated.\n * Mozilla-only.\n *\n * Will be null on Object.prototype.\n *\n * @type {Object}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto\n */\nObject.prototype.__proto__;\n\n/**\n * Determine whether the specified property in an object can be enumerated by a\n * for..in loop, with the exception of properties inherited through the\n * prototype chain.\n *\n * @param {string|symbol} propertyName\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable\n */\nObject.prototype.propertyIsEnumerable = function(propertyName) {};\n\n/**\n * Returns a localized string representing the object.\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toLocaleString\n */\nObject.prototype.toLocaleString = function() {};\n\n/**\n * Returns a string representing the source code of the object.\n * Mozilla-only.\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toSource\n */\nObject.prototype.toSource = function() {};\n\n/**\n * Returns a string representing the object.\n * @this {*}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString\n */\nObject.prototype.toString = function() {};\n\n/**\n * Returns the object's `this` value.\n * @return {*}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf\n */\nObject.prototype.valueOf = function() {};\n\n/**\n * @constructor\n * @param {...*} var_args\n * @throws {Error}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n */\nfunction Function(var_args) {}\n\n/**\n * @param {...*} var_args\n * @return {*}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call\n */\nFunction.prototype.call = function(var_args) {};\n\n/**\n * @param {...*} var_args\n * @return {*}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply\n */\nFunction.prototype.apply = function(var_args) {};\n\nFunction.prototype.arguments;\n\n/**\n * @type {number}\n * @deprecated\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/arity\n */\nFunction.prototype.arity;\n\n/**\n * Nonstandard; Mozilla and JScript only.\n * @type {Function}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller\n */\nFunction.prototype.caller;\n\n/**\n * Nonstandard.\n * @type {?}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\n */\nFunction.prototype.displayName;\n\n/**\n * Expected number of arguments.\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length\n */\nFunction.prototype.length;\n\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n */\nFunction.prototype.name;\n\n/**\n * @this {Function}\n * @return {string}\n * @nosideeffects\n * @override\n */\nFunction.prototype.toString = function() {};\n\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @param {...*} var_args\n * @return {!Array}\n * @nosideeffects\n * @template T\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n */\nfunction Array(var_args) {}\n\n/**\n * @return {Iterator}\n * @suppress {externsValidation}\n */\nArray.prototype[Symbol.iterator] = function() {};\n\n// Functions:\n\n/**\n * Returns a new array comprised of this array joined with other array(s)\n * and/or value(s).\n *\n * @param {...*} var_args\n * @return {!Array}\n * @this {*}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat\n */\nArray.prototype.concat = function(var_args) {};\n\n/**\n * Joins all elements of an array into a string.\n *\n * @param {*=} opt_separator Specifies a string to separate each element of the\n *     array. The separator is converted to a string if necessary. If omitted,\n *     the array elements are separated with a comma.\n * @return {string}\n * @this {IArrayLike|string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join\n */\nArray.prototype.join = function(opt_separator) {};\n\n/**\n * Removes the last element from an array and returns that element.\n *\n * @return {T}\n * @this {IArrayLike}\n * @modifies {this}\n * @template T\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop\n */\nArray.prototype.pop = function() {};\n\n// TODO(bradfordcsmith): remove \"undefined\" from the var_args of push\n/**\n * Mutates an array by appending the given elements and returning the new\n * length of the array.\n *\n * @param {...(T|undefined)} var_args\n * @return {number} The new length of the array.\n * @this {IArrayLike}\n * @template T\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push\n */\nArray.prototype.push = function(var_args) {};\n\n/**\n * Transposes the elements of an array in place: the first array element becomes the\n * last and the last becomes the first. The mutated array is also returned.\n *\n * @return {THIS} A reference to the original modified array.\n * @this {THIS}\n * @template THIS\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse\n */\nArray.prototype.reverse = function() {};\n\n/**\n * Removes the first element from an array and returns that element. This\n * method changes the length of the array.\n *\n * @this {IArrayLike}\n * @modifies {this}\n * @return {T}\n * @template T\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift\n */\nArray.prototype.shift = function() {};\n\n/**\n * Extracts a section of an array and returns a new array.\n *\n * @param {?number=} begin Zero-based index at which to begin extraction.\n * @param {?number=} end Zero-based index at which to end extraction.  slice\n *     extracts up to but not including end.\n * @return {!Array}\n * @this {IArrayLike|string}\n * @template T\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\n */\nArray.prototype.slice = function(begin, end) {};\n\n/**\n * Sorts the elements of an array in place.\n *\n * @param {function(T,T):number=} opt_compareFn Specifies a function that\n *     defines the sort order.\n * @this {IArrayLike}\n * @template T\n * @modifies {this}\n * @return {!Array}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n */\nArray.prototype.sort = function(opt_compareFn) {};\n\n/**\n * Changes the content of an array, adding new elements while removing old\n * elements.\n *\n * @param {?number=} index Index at which to start changing the array. If\n *     negative, will begin that many elements from the end.\n * @param {?number=} howMany An integer indicating the number of old array\n *     elements to remove.\n * @param {...T} var_args\n * @return {!Array}\n * @this {IArrayLike}\n * @modifies {this}\n * @template T\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice\n */\nArray.prototype.splice = function(index, howMany, var_args) {};\n\n/**\n * @return {string}\n * @this {Object}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toSource\n */\nArray.prototype.toSource;\n\n/**\n * @this {Array}\n * @return {string}\n * @nosideeffects\n * @override\n */\nArray.prototype.toString = function() {};\n\n/**\n * Adds one or more elements to the beginning of an array and returns the new\n * length of the array.\n *\n * @param {...*} var_args\n * @return {number} The new length of the array\n * @this {IArrayLike}\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift\n */\nArray.prototype.unshift = function(var_args) {};\n\n/**\n * Apply a function simultaneously against two values of the array (from\n * left-to-right) as to reduce it to a single value.\n *\n * @param {?function(?, T, number, !Array) : R} callback\n * @param {*=} opt_initialValue\n * @return {R}\n * @this {IArrayLike|string}\n * @template T,R\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce\n */\nArray.prototype.reduce = function(callback, opt_initialValue) {};\n\n/**\n * Apply a function simultaneously against two values of the array (from\n * right-to-left) as to reduce it to a single value.\n *\n * @param {?function(?, T, number, !Array) : R} callback\n * @param {*=} opt_initialValue\n * @return {R}\n * @this {IArrayLike|string}\n * @template T,R\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight\n */\nArray.prototype.reduceRight = function(callback, opt_initialValue) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {?function(this:S, T, number, !Array): ?} callback\n * @param {S=} opt_thisobj\n * @return {boolean}\n * @this {IArrayLike|string}\n * @template T,S\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every\n */\nArray.prototype.every = function(callback, opt_thisobj) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {?function(this:S, T, number, !Array): ?} callback\n * @param {S=} opt_thisobj\n * @return {!Array}\n * @this {IArrayLike|string}\n * @template T,S\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\n */\nArray.prototype.filter = function(callback, opt_thisobj) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {?function(this:S, T, number, !Array): ?} callback\n * @param {S=} opt_thisobj\n * @this {IArrayLike|string}\n * @template T,S\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach\n * @return {undefined}\n */\nArray.prototype.forEach = function(callback, opt_thisobj) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {T} obj\n * @param {number=} opt_fromIndex\n * @return {number}\n * @this {IArrayLike|string}\n * @nosideeffects\n * @template T\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\n */\nArray.prototype.indexOf = function(obj, opt_fromIndex) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {T} obj\n * @param {number=} opt_fromIndex\n * @return {number}\n * @this {IArrayLike|string}\n * @nosideeffects\n * @template T\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf\n */\nArray.prototype.lastIndexOf = function(obj, opt_fromIndex) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {?function(this:S, T, number, !Array): R} callback\n * @param {S=} opt_thisobj\n * @return {!Array}\n * @this {IArrayLike|string}\n * @template T,S,R\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map\n */\nArray.prototype.map = function(callback, opt_thisobj) {};\n\n/**\n * Available in ECMAScript 5, Mozilla 1.6+.\n * @param {?function(this:S, T, number, !Array): ?} callback\n * @param {S=} opt_thisobj\n * @return {boolean}\n * @this {IArrayLike|string}\n * @template T,S\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some\n */\nArray.prototype.some = function(callback, opt_thisobj) {};\n\n/**\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/index\n */\nArray.prototype.index;\n\n/**\n * @type {?string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/input\n */\nArray.prototype.input;\n\n/**\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length\n */\nArray.prototype.length;\n\n/**\n * Introduced in 1.8.5.\n * @param {*} arr\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\n */\nArray.isArray = function(arr) {};\n\n/**\n * @constructor\n * @param {*=} opt_value\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean\n */\nfunction Boolean(opt_value) {}\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean/toSource\n * @override\n */\nBoolean.prototype.toSource = function() {};\n\n/**\n * @this {boolean|Boolean}\n * @return {string}\n * @nosideeffects\n * @override\n */\nBoolean.prototype.toString = function() {};\n\n/**\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean/valueOf\n * @override\n */\nBoolean.prototype.valueOf = function() {};\n\n/**\n * @constructor\n * @param {*=} opt_value\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number\n */\nfunction Number(opt_value) {}\n\n/**\n * @this {Number|number}\n * @param {number=} opt_fractionDigits\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toExponential\n */\nNumber.prototype.toExponential = function(opt_fractionDigits) {};\n\n/**\n * @this {Number|number}\n * @param {*=} opt_digits\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed\n */\nNumber.prototype.toFixed = function(opt_digits) {};\n\n/**\n * @this {Number|number}\n * @param {number=} opt_precision\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision\n */\nNumber.prototype.toPrecision = function(opt_precision) {};\n\n/**\n * Returns a string representing the number.\n * @this {Number|number}\n * @param {(number|Number)=} opt_radix An optional radix.\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString\n * @override\n */\nNumber.prototype.toString = function(opt_radix) {};\n\n// Properties.\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE\n */\nNumber.MAX_VALUE;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE\n */\nNumber.MIN_VALUE;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/NaN\n */\nNumber.NaN;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY\n */\nNumber.NEGATIVE_INFINITY;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY\n */\nNumber.POSITIVE_INFINITY;\n\n\n/**\n * @const\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math\n */\nvar Math = {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs\n */\nMath.abs = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acos\n */\nMath.acos = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asin\n */\nMath.asin = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan\n */\nMath.atan = function(x) {};\n\n/**\n * @param {?} y\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2\n */\nMath.atan2 = function(y, x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil\n */\nMath.ceil = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos\n */\nMath.cos = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/exp\n */\nMath.exp = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor\n */\nMath.floor = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log\n */\nMath.log = function(x) {};\n\n/**\n * @param {...?} var_args\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max\n */\nMath.max = function(var_args) {};\n\n/**\n * @param {...?} var_args\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min\n */\nMath.min = function(var_args) {};\n\n/**\n * @param {?} x\n * @param {?} y\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow\n */\nMath.pow = function(x, y) {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random\n */\nMath.random = function() {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n */\nMath.round = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin\n */\nMath.sin = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt\n */\nMath.sqrt = function(x) {};\n\n/**\n * @param {?} x\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan\n */\nMath.tan = function(x) {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/toSource\n */\nMath.toSource = function() {};\n\n// Properties:\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/E\n */\nMath.E;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/LN2\n */\nMath.LN2;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/LN10\n */\nMath.LN10;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/LOG2E\n */\nMath.LOG2E;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/LOG10E\n */\nMath.LOG10E;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/PI\n */\nMath.PI;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/SQRT1_2\n */\nMath.SQRT1_2;\n\n/**\n * @const {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/SQRT2\n */\nMath.SQRT2;\n\n\n/**\n * @param {?=} opt_yr_num\n * @param {?=} opt_mo_num\n * @param {?=} opt_day_num\n * @param {?=} opt_hr_num\n * @param {?=} opt_min_num\n * @param {?=} opt_sec_num\n * @param {?=} opt_ms_num\n * @constructor\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date\n */\nfunction Date(opt_yr_num, opt_mo_num, opt_day_num, opt_hr_num, opt_min_num,\n    opt_sec_num, opt_ms_num) {}\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now\n */\nDate.now = function() {};\n\n/**\n * Parses a string representation of a date, and returns the number\n * of milliseconds since January 1, 1970, 00:00:00, local time.\n * @param {*} date\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse\n */\nDate.parse = function(date) {};\n\n/**\n * @param {number} year\n * @param {number} month\n * @param {number=} opt_date\n * @param {number=} opt_hours\n * @param {number=} opt_minute\n * @param {number=} opt_second\n * @param {number=} opt_ms\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC\n */\nDate.UTC = function(year, month,\n                    opt_date, opt_hours, opt_minute, opt_second, opt_ms) {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDate\n */\nDate.prototype.getDate = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay\n */\nDate.prototype.getDay = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth\n */\nDate.prototype.getMonth = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear\n */\nDate.prototype.getFullYear = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getYear\n */\nDate.prototype.getYear = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours\n */\nDate.prototype.getHours = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMinutes\n */\nDate.prototype.getMinutes = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getSeconds\n */\nDate.prototype.getSeconds = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds\n */\nDate.prototype.getMilliseconds = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime\n */\nDate.prototype.getTime = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset\n */\nDate.prototype.getTimezoneOffset = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate\n */\nDate.prototype.getUTCDate = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDay\n */\nDate.prototype.getUTCDay = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMonth\n */\nDate.prototype.getUTCMonth = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCFullYear\n */\nDate.prototype.getUTCFullYear = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours\n */\nDate.prototype.getUTCHours = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMinutes\n */\nDate.prototype.getUTCMinutes = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCSeconds\n */\nDate.prototype.getUTCSeconds = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds\n */\nDate.prototype.getUTCMilliseconds = function() {};\n\n/**\n * Sets the day of the month for a specified date according to local time.\n *\n * @param {number} dayValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate\n * @return {number}\n */\nDate.prototype.setDate = function(dayValue) {};\n\n/**\n * Set the month for a specified date according to local time.\n *\n * @param {number} monthValue\n * @param {number=} opt_dayValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth\n * @return {number}\n */\nDate.prototype.setMonth = function(monthValue, opt_dayValue) {};\n\n/**\n * Sets the full year for a specified date according to local time.\n *\n * @param {number} yearValue\n * @param {number=} opt_monthValue\n * @param {number=} opt_dayValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear\n * @return {number}\n */\nDate.prototype.setFullYear =\n    function(yearValue, opt_monthValue, opt_dayValue) {};\n\n/**\n * Sets the year for a specified date according to local time.\n *\n * @param {number} yearValue\n * @deprecated\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setYear\n * @return {number}\n */\nDate.prototype.setYear = function(yearValue) {};\n\n/**\n * Sets the hours for a specified date according to local time.\n *\n * @param {number} hoursValue\n * @param {number=} opt_minutesValue\n * @param {number=} opt_secondsValue\n * @param {number=} opt_msValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours\n * @return {number}\n */\nDate.prototype.setHours = function(hoursValue, opt_minutesValue,\n                                   opt_secondsValue, opt_msValue) {};\n\n/**\n * Sets the minutes for a specified date according to local time.\n *\n * @param {number} minutesValue\n * @param {number=} opt_secondsValue\n * @param {number=} opt_msValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMinutes\n * @return {number}\n */\nDate.prototype.setMinutes =\n    function(minutesValue, opt_secondsValue, opt_msValue) {};\n\n/**\n * Sets the seconds for a specified date according to local time.\n *\n * @param {number} secondsValue\n * @param {number=} opt_msValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setSeconds\n * @return {number}\n */\nDate.prototype.setSeconds = function(secondsValue, opt_msValue) {};\n\n/**\n * Sets the milliseconds for a specified date according to local time.\n *\n * @param {number} millisecondsValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMilliseconds\n * @return {number}\n */\nDate.prototype.setMilliseconds = function(millisecondsValue) {};\n\n/**\n * Sets the Date object to the time represented by a number of milliseconds\n * since January 1, 1970, 00:00:00 UTC.\n *\n * @param {number} timeValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setTime\n * @return {number}\n */\nDate.prototype.setTime = function(timeValue) {};\n\n/**\n * Sets the day of the month for a specified date according to universal time.\n *\n * @param {number} dayValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCDate\n * @return {number}\n */\nDate.prototype.setUTCDate = function(dayValue) {};\n\n/**\n * Sets the month for a specified date according to universal time.\n *\n * @param {number} monthValue\n * @param {number=} opt_dayValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth\n * @return {number}\n */\nDate.prototype.setUTCMonth = function(monthValue, opt_dayValue) {};\n\n/**\n * Sets the full year for a specified date according to universal time.\n *\n * @param {number} yearValue\n * @param {number=} opt_monthValue\n * @param {number=} opt_dayValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear\n * @return {number}\n */\nDate.prototype.setUTCFullYear = function(yearValue, opt_monthValue,\n                                         opt_dayValue) {};\n\n/**\n * Sets the hour for a specified date according to universal time.\n *\n * @param {number} hoursValue\n * @param {number=} opt_minutesValue\n * @param {number=} opt_secondsValue\n * @param {number=} opt_msValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours\n * @return {number}\n */\nDate.prototype.setUTCHours = function(hoursValue, opt_minutesValue,\n                                      opt_secondsValue, opt_msValue) {};\n\n/**\n * Sets the minutes for a specified date according to universal time.\n *\n * @param {number} minutesValue\n * @param {number=} opt_secondsValue\n * @param {number=} opt_msValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMinutes\n * @return {number}\n */\nDate.prototype.setUTCMinutes = function(minutesValue, opt_secondsValue,\n                                        opt_msValue) {};\n\n\n/**\n * Sets the seconds for a specified date according to universal time.\n *\n * @param {number} secondsValue\n * @param {number=} opt_msValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\n * @return {number}\n */\nDate.prototype.setUTCSeconds = function(secondsValue, opt_msValue) {};\n\n/**\n * Sets the milliseconds for a specified date according to universal time.\n *\n * @param {number} millisecondsValue\n * @modifies {this}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds\n * @return {number}\n */\nDate.prototype.setUTCMilliseconds = function(millisecondsValue) {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toSource\n * @override\n */\nDate.prototype.toSource = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toDateString\n */\nDate.prototype.toDateString = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toGMTString\n */\nDate.prototype.toGMTString = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toTimeString\n */\nDate.prototype.toTimeString = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString\n */\nDate.prototype.toUTCString = function() {};\n\n/**\n * @param {(string|Array)=} opt_locales\n * @param {Object=} opt_options\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString\n */\nDate.prototype.toLocaleDateString = function(opt_locales, opt_options) {};\n\n/**\n * @param {string} formatString\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleFormat\n */\nDate.prototype.toLocaleFormat = function(formatString) {};\n\n/**\n * @param {string|Array=} opt_locales\n * @param {Object=} opt_options\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString\n * @see http://www.ecma-international.org/ecma-402/1.0/#sec-13.3.1\n * @override\n */\nDate.prototype.toLocaleString = function(opt_locales, opt_options) {};\n\n/**\n * @param {(string|Array)=} opt_locales\n * @param {Object=} opt_options\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString\n */\nDate.prototype.toLocaleTimeString = function(opt_locales, opt_options) {};\n\n/**\n * @this {Date}\n * @return {string}\n * @nosideeffects\n * @override\n */\nDate.prototype.toString = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf\n */\nDate.prototype.valueOf;\n\n/**\n * @constructor\n * @implements {Iterable}\n * @param {*=} opt_str\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String\n */\nfunction String(opt_str) {}\n\n/**\n * @param {...number} var_args\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode\n */\nString.fromCharCode = function(var_args) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/anchor\n */\nString.prototype.anchor = function() {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/big\n */\nString.prototype.big = function() {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/blink\n */\nString.prototype.blink = function() {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/bold\n */\nString.prototype.bold = function() {};\n\n/**\n * Returns the specified character from a string.\n *\n * @this {String|string}\n * @param {number} index\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt\n */\nString.prototype.charAt = function(index) {};\n\n/**\n * Returns a number indicating the Unicode value of the character at the given\n * index.\n *\n * @this {String|string}\n * @param {number=} opt_index\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n */\nString.prototype.charCodeAt = function(opt_index) {};\n\n/**\n * Combines the text of two or more strings and returns a new string.\n *\n * @this {String|string}\n * @param {...*} var_args\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat\n */\nString.prototype.concat = function(var_args) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fixed\n */\nString.prototype.fixed = function() {};\n\n/**\n * @this {String|string}\n * @param {string} color\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fontcolor\n */\nString.prototype.fontcolor = function(color) {};\n\n/**\n * @this {String|string}\n * @param {number} size\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fontsize\n */\nString.prototype.fontsize = function(size) {};\n\n/**\n * Returns the index within the calling String object of the first occurrence\n * of the specified value, starting the search at fromIndex, returns -1 if the\n * value is not found.\n *\n * @this {String|string}\n * @param {string|null} searchValue\n * @param {(number|null)=} opt_fromIndex\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf\n */\nString.prototype.indexOf = function(searchValue, opt_fromIndex) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/italics\n */\nString.prototype.italics = function() {};\n\n/**\n * Returns the index within the calling String object of the last occurrence of\n * the specified value, or -1 if not found. The calling string is searched\n * backward, starting at fromIndex.\n *\n * @this {String|string}\n * @param {string|null} searchValue\n * @param {(number|null)=} opt_fromIndex\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf\n */\nString.prototype.lastIndexOf = function(searchValue, opt_fromIndex) {};\n\n/**\n * @this {String|string}\n * @param {string} hrefAttribute\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/link\n */\nString.prototype.link = function(hrefAttribute) {};\n\n/**\n * Returns a number indicating whether a reference string comes before or after\n * or is the same as the given string in sort order.\n *\n * @this {*}\n * @param {?string} compareString\n * @param {string|Array=} locales\n * @param {Object=} options\n * @return {number}\n * @nosideeffects\n * @see http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String/localeCompare\n * @see http://www.ecma-international.org/ecma-402/1.0/#sec-13.1.1\n */\nString.prototype.localeCompare = function(compareString, locales, options) {};\n\n/**\n * Used to retrieve the matches when matching a string against a regular\n * expression.\n *\n * @this {String|string}\n * @param {*} regexp\n * @return {Array} This should really return an Array with a few\n *     special properties, but we do not have a good way to model this in\n *     our type system. Also see Regexp.prototype.exec.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match\n */\nString.prototype.match = function(regexp) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/quote\n */\nString.prototype.quote = function() {};\n\n/**\n * Finds a match between a regular expression and a string, and replaces the\n * matched substring with a new substring.\n *\n * This may have side-effects if the replacement function has side-effects.\n *\n * @this {String|string}\n * @param {RegExp|string} pattern\n * @param {?string|function(string, ...?):*} replacement\n * @return {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace\n */\nString.prototype.replace = function(pattern, replacement) {};\n\n/**\n * Executes the search for a match between a regular expression and this String\n * object.\n *\n * @this {String|string}\n * @param {RegExp|string} pattern\n * @return {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search\n */\nString.prototype.search = function(pattern) {};\n\n/**\n * @this {String|string}\n * @param {number} begin\n * @param {number=} opt_end\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\n */\nString.prototype.slice = function(begin, opt_end) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/small\n */\nString.prototype.small = function() {};\n\n/**\n * @this {String|string}\n * @param {*=} opt_separator\n * @param {number=} opt_limit\n * @return {!Array}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split\n */\nString.prototype.split = function(opt_separator, opt_limit) {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/strike\n */\nString.prototype.strike = function() {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/sub\n */\nString.prototype.sub = function() {};\n\n/**\n * @this {String|string}\n * @param {number} start\n * @param {number=} opt_length\n * @return {string} The specified substring.\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr\n */\nString.prototype.substr = function(start, opt_length) {};\n\n/**\n * @this {String|string}\n * @param {number} start\n * @param {number=} opt_end\n * @return {string} The specified substring.\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring\n */\nString.prototype.substring = function(start, opt_end) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/sup\n */\nString.prototype.sup = function() {};\n\n/**\n * @this {String|string}\n * @param {(string|Array)=} opt_locales\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase\n */\nString.prototype.toLocaleUpperCase = function(opt_locales) {};\n\n/**\n * @this {String|string}\n * @param {(string|Array)=} opt_locales\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase\n */\nString.prototype.toLocaleLowerCase = function(opt_locales) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase\n */\nString.prototype.toLowerCase = function() {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase\n */\nString.prototype.toUpperCase = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toSource\n * @override\n */\nString.prototype.toSource = function() {};\n\n/**\n * @this {string|String}\n * @return {string}\n * @nosideeffects\n * @override\n */\nString.prototype.toString = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/valueOf\n */\nString.prototype.valueOf;\n\n/**\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length\n */\nString.prototype.length;\n\n/**\n * @constructor\n * @param {*=} opt_pattern\n * @param {*=} opt_flags\n * @return {!RegExp}\n * @throws {SyntaxError} if opt_pattern is an invalid pattern.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nfunction RegExp(opt_pattern, opt_flags) {}\n\n/**\n * @param {*} pattern\n * @param {*=} opt_flags\n * @return {void}\n * @modifies {this}\n * @deprecated\n * @see http://msdn.microsoft.com/en-us/library/x9cswe0z(v=VS.85).aspx\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/compile\n */\nRegExp.prototype.compile = function(pattern, opt_flags) {};\n\n/**\n * @param {*} str The string to search.\n * @return {?RegExpResult}\n * @see http://msdn.microsoft.com/en-us/library/z908hy33(VS.85).aspx\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec\n */\nRegExp.prototype.exec = function(str) {};\n\n/**\n * @param {*} str The string to search.\n * @return {boolean} Whether the string was matched.\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test\n */\nRegExp.prototype.test = function(str) {};\n\n/**\n * @this {RegExp}\n * @return {string}\n * @nosideeffects\n * @override\n */\nRegExp.prototype.toString = function() {};\n\n/**\n * @constructor\n * @extends {Array}\n */\nvar RegExpResult = function() {};\n\n\n/** @type {number} */\nRegExpResult.prototype.index;\n\n\n/** @type {string} */\nRegExpResult.prototype.input;\n\n\n/** @type {number} */\nRegExpResult.prototype.length;\n\n\n/**\n * Not actually part of ES3; was added in 2018.\n * https://github.com/tc39/proposal-regexp-named-groups\n *\n * @type {!Object}\n */\nRegExpResult.prototype.groups;\n\n\n// Constructor properties:\n\n/**\n * The string against which the last regexp was matched.\n * @type {string}\n * @see http://www.devguru.com/Technologies/Ecmascript/Quickref/regexp_input.html\n */\nRegExp.input;\n\n/**\n * The last matched characters.\n * @type {string}\n * @see http://www.devguru.com/Technologies/Ecmascript/Quickref/regexp_lastMatch.html\n */\nRegExp.lastMatch;\n\n/**\n * The last matched parenthesized substring, if any.\n * @type {string}\n * @see http://www.devguru.com/Technologies/Ecmascript/Quickref/regexp_lastParen.html\n */\nRegExp.lastParen;\n\n/**\n * The substring of the input up to the characters most recently matched.\n * @type {string}\n * @see http://www.devguru.com/Technologies/Ecmascript/Quickref/regexp_leftContext.html\n */\nRegExp.leftContext;\n\n/**\n * The substring of the input after the characters most recently matched.\n * @type {string}\n * @see http://www.devguru.com/Technologies/Ecmascript/Quickref/regexp_rightContext.html\n */\nRegExp.rightContext;\n\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$1;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$2;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$3;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$4;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$5;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$6;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$7;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$8;\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n */\nRegExp.$9;\n\n// Prototype properties:\n\n/**\n * Whether to test the regular expression against all possible matches\n * in a string, or only against the first.\n * @type {boolean}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global\n */\nRegExp.prototype.global;\n\n/**\n * Whether to ignore case while attempting a match in a string.\n * @type {boolean}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/ignoreCase\n */\nRegExp.prototype.ignoreCase;\n\n/**\n * The index at which to start the next match.\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex\n */\nRegExp.prototype.lastIndex;\n\n/**\n * Whether or not the regular expression uses lastIndex.\n * @type {boolean}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky\n */\nRegExp.prototype.sticky;\n\n/**\n * Whether or not to search in strings across multiple lines.\n * @type {boolean}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline\n */\nRegExp.prototype.multiline;\n\n/**\n * The text of the pattern.\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source\n */\nRegExp.prototype.source;\n\n/**\n * The flags the regex was created with.\n * @type {string}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags\n */\nRegExp.prototype.flags;\n\n/**\n * @constructor\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!Error}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n */\nfunction Error(opt_message, opt_file, opt_line) {}\n\n\n/**\n * Chrome/v8 specific, altering the maximum depth of the stack trace\n * (10 by default).\n * @type {number}\n * @see http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi\n */\nError.stackTraceLimit;\n\n\n/**\n * Chrome/v8 specific, adds a stack trace to the error object. The optional\n * constructorOpt parameter allows you to pass in a function value. When\n * collecting the stack trace all frames above the topmost call to this\n * function, including that call, will be left out of the stack trace.\n * @param {Object} error The object to add the stack trace to.\n * @param {Function=} opt_constructor A function in the stack trace\n * @see http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi\n * @return {undefined}\n */\nError.captureStackTrace = function(error, opt_constructor){};\n\n\n/**\n * IE-only.\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/2w6a45b5.aspx\n */\nError.prototype.description;\n\n\n/**\n * Mozilla-only.\n * @type {number}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/lineNumber\n */\nError.prototype.lineNumber;\n\n/**\n * Mozilla-only\n * @type {string}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/fileName\n */\nError.prototype.fileName;\n\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/name\n */\nError.prototype.name;\n\n/**\n * @type {string}\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/message\n */\nError.prototype.message;\n\n/**\n * Doesn't seem to exist, but closure/debug.js references it.\n */\nError.prototype.sourceURL;\n\n/** @type {string} */\nError.prototype.stack;\n\n\n/**\n * @constructor\n * @extends {Error}\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!EvalError}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError\n */\nfunction EvalError(opt_message, opt_file, opt_line) {}\n\n/**\n * @constructor\n * @extends {Error}\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!RangeError}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError\n */\nfunction RangeError(opt_message, opt_file, opt_line) {}\n\n/**\n * @constructor\n * @extends {Error}\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!ReferenceError}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError\n */\nfunction ReferenceError(opt_message, opt_file, opt_line) {}\n\n/**\n * @constructor\n * @extends {Error}\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!SyntaxError}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError\n */\nfunction SyntaxError(opt_message, opt_file, opt_line) {}\n\n/**\n * @constructor\n * @extends {Error}\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!TypeError}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError\n */\nfunction TypeError(opt_message, opt_file, opt_line) {}\n\n/**\n * @constructor\n * @extends {Error}\n * @param {*=} opt_message\n * @param {*=} opt_file\n * @param {*=} opt_line\n * @return {!URIError}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError\n */\nfunction URIError(opt_message, opt_file, opt_line) {}\n\n\n// JScript extensions.\n// @see http://msdn.microsoft.com/en-us/library/894hfyb4(VS.80).aspx\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/7sw4ddf8.aspx\n * @type {function(new:?, string, string=)}\n * @deprecated\n */\nfunction ActiveXObject(progId, opt_location) {}\n","externs/es5.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for ECMAScript 5.\n * @see https://es5.github.io/\n * @externs\n * @author [email protected] (DJ Lee)\n */\n\n\n/**\n * @param {?Object|undefined} selfObj Specifies the object to which |this|\n *     should point when the function is run. If the value is null or undefined,\n *     it will default to the global object.\n * @param {...*} var_args Additional arguments that are partially\n *     applied to fn.\n * @return {!Function} A partially-applied form of the Function on which\n *     bind() was invoked as a method.\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind\n */\nFunction.prototype.bind = function(selfObj, var_args) {};\n\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/Trim\n */\nString.prototype.trim = function() {};\n\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/TrimLeft\n */\nString.prototype.trimLeft = function() {};\n\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see http://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/TrimRight\n */\nString.prototype.trimRight = function() {};\n\n\n/**\n * A object property descriptor used by Object.create, Object.defineProperty,\n * Object.defineProperties, Object.getOwnPropertyDescriptor.\n *\n * @record\n * @template THIS\n */\nfunction ObjectPropertyDescriptor() {}\n\n/** @type {(*|undefined)} */\nObjectPropertyDescriptor.prototype.value;\n\n/** @type {(function(this: THIS):?)|undefined} */\nObjectPropertyDescriptor.prototype.get;\n\n/** @type {(function(this: THIS, ?):void)|undefined} */\nObjectPropertyDescriptor.prototype.set;\n\n/** @type {boolean|undefined} */\nObjectPropertyDescriptor.prototype.writable;\n\n/** @type {boolean|undefined} */\nObjectPropertyDescriptor.prototype.enumerable;\n\n/** @type {boolean|undefined} */\nObjectPropertyDescriptor.prototype.configurable;\n\n\n/**\n * @param {?Object} proto\n * @param {?Object>=} properties\n *     A map of ObjectPropertyDescriptors.\n * @return {!Object}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create\n */\nObject.create = function(proto, properties) {};\n\n\n/**\n * @template T\n * @param {T} obj\n * @param {string|symbol} prop\n * @param {!ObjectPropertyDescriptor} descriptor A ObjectPropertyDescriptor.\n * @return {T}\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty\n */\nObject.defineProperty = function(obj, prop, descriptor) {};\n\n\n/**\n * @template T\n * @param {T} obj\n * @param {!Object>} props A map of\n *     ObjectPropertyDescriptors.\n * @return {T}\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperties\n */\nObject.defineProperties = function(obj, props) {};\n\n\n/**\n * @param {T} obj\n * @param {string|symbol} prop\n * @return {!ObjectPropertyDescriptor|undefined}\n * @nosideeffects\n * @template T\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor\n */\nObject.getOwnPropertyDescriptor = function(obj, prop) {};\n\n\n/**\n * @param {!Object} obj\n * @return {!Array}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys\n */\nObject.keys = function(obj) {};\n\n\n/**\n * @param {!Object} obj\n * @return {!Array}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames\n */\nObject.getOwnPropertyNames = function(obj) {};\n\n\n/**\n * @param {!Object} obj\n * @return {Object}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/GetPrototypeOf\n */\nObject.getPrototypeOf = function(obj) {};\n\n\n/**\n * @param {T} obj\n * @return {T}\n * @template T\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/preventExtensions\n */\nObject.preventExtensions = function(obj) {};\n\n\n/**\n * @param {T} obj\n * @return {T}\n * @template T\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/seal\n */\nObject.seal = function(obj) {};\n\n\n/**\n * @param {T} obj\n * @return {T}\n * @template T\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze\n */\nObject.freeze = function(obj) {};\n\n\n/**\n * @param {!Object} obj\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isExtensible\n */\nObject.isExtensible = function(obj) {};\n\n\n/**\n * @param {!Object} obj\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isSealed\n */\nObject.isSealed = function(obj) {};\n\n\n/**\n * @param {!Object} obj\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isFrozen\n */\nObject.isFrozen = function(obj) {};\n\n\n/**\n * We acknowledge that this function does not exist on the `Object.prototype`\n * and is declared in this file for other reasons.\n *\n * When `toJSON` is defined as a property on an object it can be used in\n * conjunction with the JSON.stringify() function.\n *\n * It is defined here to:\n * (1) Prevent the compiler from renaming the property on internal classes.\n * (2) Enforce that the signature is correct for users defining it.\n *\n * @param {string=} opt_key The JSON key for this object.\n * @return {*} The serializable representation of this object. Note that this\n *     need not be a string. See http://goo.gl/PEUvs.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_behavior\n */\nObject.prototype.toJSON = function(opt_key) {};\n\n\n/**\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString\n * @return {string}\n */\nDate.prototype.toISOString = function() {};\n\n\n/**\n * @param {*=} opt_ignoredKey\n * @return {string}\n * @override\n */\nDate.prototype.toJSON = function(opt_ignoredKey) {};\n\n\n/**\n * A fake type to model the JSON object.\n * @constructor\n */\nfunction JSONType() {}\n\n\n/**\n * @param {string} jsonStr The string to parse.\n * @param {(function(this:?, string, *) : *)=} opt_reviver\n * @return {*} The JSON object.\n * @throws {Error}\n */\nJSONType.prototype.parse = function(jsonStr, opt_reviver) {};\n\n\n/**\n * @param {*} jsonObj Input object.\n * @param {(Array|(function(this:?, string, *) : *)|null)=} opt_replacer\n * @param {(number|string)=} opt_space\n * @return {string} JSON string which represents jsonObj.\n * @throws {Error}\n */\nJSONType.prototype.stringify = function(jsonObj, opt_replacer, opt_space) {};\n\n\n/**\n * @type {!JSONType}\n * @suppress {duplicate}\n */\nvar JSON;\n","externs/es6.js":"/*\n * Copyright 2014 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for ECMAScript 6 and later.\n * @see https://tc39.github.io/ecma262/\n * @see https://www.khronos.org/registry/typedarray/specs/latest/\n * @externs\n */\n\n/**\n * Some es6 definitions:\n * Symbol, IIterableResult, Iterable, IteratorIterable, Iterator,\n * IteratorIterable moved to es3 file, because some base type requires them, and\n * we want to keep them together. If you add new externs related to those types\n * define them together in the es3 file.\n */\n\n/**\n * TODO(b/142881197): UNUSED_RETURN_T and UNUSED_NEXT_T are not yet used for\n * anything. https://github.com/google/closure-compiler/issues/3489\n * @interface\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator\n * @extends {IteratorIterable}\n * @template VALUE, UNUSED_RETURN_T, UNUSED_NEXT_T\n */\nfunction Generator() {}\n\n/**\n * @param {?=} opt_value\n * @return {!IIterableResult}\n * @override\n */\nGenerator.prototype.next = function(opt_value) {};\n\n/**\n * @param {VALUE} value\n * @return {!IIterableResult}\n */\nGenerator.prototype.return = function(value) {};\n\n/**\n * @param {?} exception\n * @return {!IIterableResult}\n */\nGenerator.prototype.throw = function(exception) {};\n\n\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.log10 = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.log2 = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.log1p = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.expm1 = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.cosh = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.sinh = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.tanh = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.acosh = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.asinh = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.atanh = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.trunc = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.sign = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n */\nMath.cbrt = function(value) {};\n\n/**\n * @param {...number} var_args\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot\n */\nMath.hypot = function(var_args) {};\n\n/**\n * @param {number} value1\n * @param {number} value2\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\n */\nMath.imul = function(value1, value2) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32\n */\nMath.clz32 = function(value) {};\n\n/**\n * @param {number} value\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround\n */\nMath.fround = function(value) {};\n\n\n/**\n * @param {*} a\n * @param {*} b\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nObject.is = function(a, b) {};\n\n\n/**\n * Returns a language-sensitive string representation of this number.\n * @param {(string|!Array)=} opt_locales\n * @param {Object=} opt_options\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\n * @see http://www.ecma-international.org/ecma-402/1.0/#sec-13.2.1\n * @override\n */\nNumber.prototype.toLocaleString = function(opt_locales, opt_options) {};\n\n/**\n * Returns the wrapped primitive value of this Number object.\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/valueOf\n * @override\n */\nNumber.prototype.valueOf = function() {};\n\n\n/**\n * Pads the end of the string so that it reaches the given length.\n * NOTE: this is an ES2017 (ES8) extern.\n *\n * @param {number} targetLength The target length.\n * @param {string=} opt_padString The string to pad with.\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd\n */\nString.prototype.padEnd = function(targetLength, opt_padString) {};\n\n/**\n * Pads the start of the string so that it reaches the given length.\n * NOTE: this is an ES2017 (ES8) extern.\n *\n * @param {number} targetLength The target length.\n * @param {string=} opt_padString The string to pad with.\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\n */\nString.prototype.padStart = function(targetLength, opt_padString) {};\n\n/**\n * Repeats the string the given number of times.\n *\n * @param {number} count The number of times the string is repeated.\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n */\nString.prototype.repeat = function(count) {};\n\n/**\n * @constructor\n * @extends {Array}\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-gettemplateobject\n */\nvar ITemplateArray = function() {};\n\n/**\n * @type {!Array}\n */\nITemplateArray.prototype.raw;\n\n/**\n * @param {!ITemplateArray} template\n * @param {...*} var_args Substitution values.\n * @return {string}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw\n */\nString.raw = function(template, var_args) {};\n\n\n/**\n * @param {number} codePoint\n * @param {...number} var_args Additional codepoints\n * @return {string}\n */\nString.fromCodePoint = function(codePoint, var_args) {};\n\n\n/**\n * @param {number} index\n * @return {number}\n * @nosideeffects\n */\nString.prototype.codePointAt = function(index) {};\n\n\n/**\n * @param {string=} opt_form\n * @return {string}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n */\nString.prototype.normalize = function(opt_form) {};\n\n\n/**\n * @param {string} searchString\n * @param {number=} opt_position\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n */\nString.prototype.startsWith = function(searchString, opt_position) {};\n\n/**\n * @param {string} searchString\n * @param {number=} opt_position\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\n */\nString.prototype.endsWith = function(searchString, opt_position) {};\n\n/**\n * @param {string} searchString\n * @param {number=} opt_position\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n */\nString.prototype.includes = function(searchString, opt_position) {};\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimStart\n */\nString.prototype.trimStart = function() {};\n\n\n/**\n * @this {String|string}\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimEnd\n */\nString.prototype.trimEnd = function() {};\n\n\n/**\n * @this {String|string}\n * @param {!RegExp|string} regexp\n * @return {!IteratorIterable}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll\n */\nString.prototype.matchAll = function(regexp) {};\n\n\n/**\n * @see http://dev.w3.org/html5/postmsg/\n * @interface\n */\nfunction Transferable() {}\n\n/**\n * @param {number} length The length in bytes\n * @constructor\n * @throws {Error}\n * @implements {Transferable}\n */\nfunction ArrayBuffer(length) {}\n\n/** @type {number} */\nArrayBuffer.prototype.byteLength;\n\n/**\n * @param {number} begin\n * @param {number=} opt_end\n * @return {!ArrayBuffer}\n * @nosideeffects\n */\nArrayBuffer.prototype.slice = function(begin, opt_end) {};\n\n/**\n * @param {*} arg\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView\n */\nArrayBuffer.isView = function(arg) {};\n\n\n/**\n * @constructor\n */\nfunction ArrayBufferView() {}\n\n/** @type {!ArrayBuffer} */\nArrayBufferView.prototype.buffer;\n\n/** @type {number} */\nArrayBufferView.prototype.byteOffset;\n\n/** @type {number} */\nArrayBufferView.prototype.byteLength;\n\n\n/**\n * @param {number} length The length in bytes\n * @constructor\n * @throws {Error}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer\n */\nfunction SharedArrayBuffer(length) {}\n\n/** @type {number} */\nSharedArrayBuffer.prototype.byteLength;\n\n/**\n * @param {number} begin\n * @param {number=} opt_end\n * @return {!SharedArrayBuffer}\n * @nosideeffects\n */\nSharedArrayBuffer.prototype.slice = function(begin, opt_end) {};\n\n\n/**\n * @typedef {!ArrayBuffer|!ArrayBufferView}\n */\nvar BufferSource;\n\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @extends {ArrayBufferView}\n */\nfunction TypedArray() {};\n\n/** @const {number} */\nTypedArray.prototype.BYTES_PER_ELEMENT;\n\n/**\n * @param {number} target\n * @param {number} start\n * @param {number=} opt_end\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/copyWithin\n */\nTypedArray.prototype.copyWithin = function(target, start, opt_end) {};\n\n/**\n * @return {!IteratorIterable>}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/entries\n */\nTypedArray.prototype.entries = function() {};\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : ?} callback\n * @param {S=} opt_thisArg\n * @return {boolean}\n * @template S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/every\n */\nTypedArray.prototype.every = function(callback, opt_thisArg) {};\n\n/**\n * @param {number} value\n * @param {number=} opt_begin\n * @param {number=} opt_end\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/fill\n */\nTypedArray.prototype.fill = function(value, opt_begin, opt_end) {};\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : boolean} callback\n * @param {S=} opt_thisArg\n * @return {THIS}\n * @this {THIS}\n * @template THIS,S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/filter\n */\nTypedArray.prototype.filter = function(callback, opt_thisArg) {};\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : boolean} callback\n * @param {S=} opt_thisArg\n * @return {(number|undefined)}\n * @template S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/find\n */\nTypedArray.prototype.find = function(callback, opt_thisArg) {};\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : boolean} callback\n * @param {S=} opt_thisArg\n * @return {number}\n * @template S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/findIndex\n */\nTypedArray.prototype.findIndex = function(callback, opt_thisArg) {};\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : ?} callback\n * @param {S=} opt_thisArg\n * @return {undefined}\n * @template S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/forEach\n */\nTypedArray.prototype.forEach = function(callback, opt_thisArg) {};\n\n/**\n * NOTE: this is an ES2016 (ES7) extern.\n * @param {number} searchElement\n * @param {number=} opt_fromIndex\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/includes\n */\nTypedArray.prototype.includes = function(searchElement, opt_fromIndex) {};\n\n/**\n * @param {number} searchElement\n * @param {number=} opt_fromIndex\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/indexOf\n */\nTypedArray.prototype.indexOf = function(searchElement, opt_fromIndex) {};\n\n/**\n * @param {string=} opt_separator\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/join\n */\nTypedArray.prototype.join = function(opt_separator) {};\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/keys\n */\nTypedArray.prototype.keys = function() {};\n\n/**\n * @param {number} searchElement\n * @param {number=} opt_fromIndex\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/lastIndexOf\n */\nTypedArray.prototype.lastIndexOf = function(searchElement, opt_fromIndex) {};\n\n/** @type {number} */\nTypedArray.prototype.length;\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : number} callback\n * @param {S=} opt_thisArg\n * @return {THIS}\n * @this {THIS}\n * @template THIS,S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/map\n */\nTypedArray.prototype.map = function(callback, opt_thisArg) {};\n\n/**\n * @param {function((number|INIT|RET), number, number, !TypedArray) : RET}\n *     callback\n * @param {INIT=} opt_initialValue\n * @return {RET}\n * @template INIT,RET\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/reduce\n */\nTypedArray.prototype.reduce = function(callback, opt_initialValue) {};\n\n/**\n * @param {function((number|INIT|RET), number, number, !TypedArray) : RET}\n *     callback\n * @param {INIT=} opt_initialValue\n * @return {RET}\n * @template INIT,RET\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/reduceRight\n */\nTypedArray.prototype.reduceRight = function(callback, opt_initialValue) {};\n\n/**\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/reverse\n */\nTypedArray.prototype.reverse = function() {};\n\n/**\n * @param {!ArrayBufferView|!Array} array\n * @param {number=} opt_offset\n * @return {undefined}\n * @throws {!RangeError}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set\n */\nTypedArray.prototype.set = function(array, opt_offset) {};\n\n/**\n * @param {number=} opt_begin\n * @param {number=} opt_end\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice\n */\nTypedArray.prototype.slice = function(opt_begin, opt_end) {};\n\n/**\n * @param {function(this:S, number, number, !TypedArray) : boolean} callback\n * @param {S=} opt_thisArg\n * @return {boolean}\n * @template S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/some\n */\nTypedArray.prototype.some = function(callback, opt_thisArg) {};\n\n/**\n * @param {(function(number, number) : number)=} opt_compareFunction\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/sort\n */\nTypedArray.prototype.sort = function(opt_compareFunction) {};\n\n/**\n * @param {number} begin\n * @param {number=} opt_end\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray\n */\nTypedArray.prototype.subarray = function(begin, opt_end) {};\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/values\n */\nTypedArray.prototype.values = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/toLocaleString\n * @override\n */\nTypedArray.prototype.toLocaleString = function() {};\n\n/**\n * @return {string}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/toString\n * @override\n */\nTypedArray.prototype.toString = function() {};\n\n/** @override */\nTypedArray.prototype[Symbol.iterator] = function() {};\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments} If the user passes a backing array, then indexed\n *     accesses will modify the backing array. JSCompiler does not model\n *     this well. In other words, if you have:\n *     \n *     var x = new ArrayBuffer(1);\n *     var y = new Int8Array(x);\n *     y[0] = 2;\n *     \n *     JSCompiler will not recognize that the last assignment modifies x.\n *     We workaround this by marking all these arrays as @modifies {arguments},\n *     to introduce the possibility that x aliases y.\n */\nfunction Int8Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nInt8Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Int8Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nInt8Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Int8Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nInt8Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Uint8Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nUint8Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Uint8Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nUint8Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Uint8Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nUint8Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Uint8ClampedArray(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nUint8ClampedArray.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Uint8ClampedArray}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nUint8ClampedArray.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Uint8ClampedArray}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nUint8ClampedArray.of = function(var_args) {};\n\n\n/**\n * @typedef {Uint8ClampedArray}\n * @deprecated CanvasPixelArray has been replaced by Uint8ClampedArray\n *     in the latest spec.\n * @see http://www.w3.org/TR/2dcontext/#imagedata\n */\nvar CanvasPixelArray;\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Int16Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nInt16Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Int16Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nInt16Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Int16Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nInt16Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Uint16Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nUint16Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Uint16Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nUint16Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Uint16Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nUint16Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Int32Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nInt32Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Int32Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nInt32Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Int32Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nInt32Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Uint32Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nUint32Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Uint32Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nUint32Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Uint32Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nUint32Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Float32Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nFloat32Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Float32Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nFloat32Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Float32Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nFloat32Array.of = function(var_args) {};\n\n\n/**\n * @param {number|ArrayBufferView|Array|ArrayBuffer|SharedArrayBuffer}\n *     length or array or buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_length\n * @constructor\n * @extends {TypedArray}\n * @throws {Error}\n * @modifies {arguments}\n */\nfunction Float64Array(length, opt_byteOffset, opt_length) {}\n\n/** @const {number} */\nFloat64Array.BYTES_PER_ELEMENT;\n\n/**\n * @param {string|!IArrayLike|!Iterable} source\n * @param {function(this:S, number): number=} opt_mapFn\n * @param {S=} opt_this\n * @template S\n * @return {!Float64Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from\n */\nFloat64Array.from = function(source, opt_mapFn, opt_this) {};\n\n/**\n * @param {...number} var_args\n * @return {!Float64Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of\n */\nFloat64Array.of = function(var_args) {};\n\n\n/**\n * @param {ArrayBuffer|SharedArrayBuffer} buffer\n * @param {number=} opt_byteOffset\n * @param {number=} opt_byteLength\n * @constructor\n * @extends {ArrayBufferView}\n * @throws {Error}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays/DataView\n */\nfunction DataView(buffer, opt_byteOffset, opt_byteLength) {}\n\n/**\n * @param {number} byteOffset\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getInt8 = function(byteOffset) {};\n\n/**\n * @param {number} byteOffset\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getUint8 = function(byteOffset) {};\n\n/**\n * @param {number} byteOffset\n * @param {boolean=} opt_littleEndian\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getInt16 = function(byteOffset, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {boolean=} opt_littleEndian\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getUint16 = function(byteOffset, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {boolean=} opt_littleEndian\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getInt32 = function(byteOffset, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {boolean=} opt_littleEndian\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getUint32 = function(byteOffset, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {boolean=} opt_littleEndian\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getFloat32 = function(byteOffset, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {boolean=} opt_littleEndian\n * @return {number}\n * @throws {Error}\n */\nDataView.prototype.getFloat64 = function(byteOffset, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setInt8 = function(byteOffset, value) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setUint8 = function(byteOffset, value) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @param {boolean=} opt_littleEndian\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setInt16 = function(byteOffset, value, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @param {boolean=} opt_littleEndian\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setUint16 = function(byteOffset, value, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @param {boolean=} opt_littleEndian\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setInt32 = function(byteOffset, value, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @param {boolean=} opt_littleEndian\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setUint32 = function(byteOffset, value, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @param {boolean=} opt_littleEndian\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setFloat32 = function(\n    byteOffset, value, opt_littleEndian) {};\n\n/**\n * @param {number} byteOffset\n * @param {number} value\n * @param {boolean=} opt_littleEndian\n * @throws {Error}\n * @return {undefined}\n */\nDataView.prototype.setFloat64 = function(\n    byteOffset, value, opt_littleEndian) {};\n\n\n/**\n * @see https://github.com/promises-aplus/promises-spec\n * @typedef {{then: ?}}\n */\nvar Thenable;\n\n\n/**\n * This is not an official DOM interface. It is used to add generic typing\n * and respective type inference where available.\n * {@see goog.Thenable} inherits from this making all promises\n * interoperate.\n * @interface\n * @struct\n * @template TYPE\n */\nfunction IThenable() {}\n\n\n/**\n * @param {?(function(TYPE):VALUE)=} opt_onFulfilled\n * @param {?(function(*): *)=} opt_onRejected\n * @return {RESULT}\n * @template VALUE\n *\n * When a `Thenable` is fulfilled or rejected with another `Thenable`, the\n * payload of the second is used as the payload of the first.\n *\n * @template RESULT := type('IThenable',\n *     cond(isUnknown(VALUE), unknown(),\n *       mapunion(VALUE, (V) =>\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *           templateTypeOf(V, 0),\n *           cond(sub(V, 'Thenable'),\n *              unknown(),\n *              V)))))\n * =:\n */\nIThenable.prototype.then = function(opt_onFulfilled, opt_onRejected) {};\n\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n * @param {function(\n *             function((TYPE|IThenable|Thenable|null)=),\n *             function(*=))} resolver\n * @constructor\n * @implements {IThenable}\n * @template TYPE\n */\nfunction Promise(resolver) {}\n\n\n/**\n * @param {VALUE=} opt_value\n * @return {RESULT}\n * @template VALUE\n * @template RESULT := type('Promise',\n *     cond(isUnknown(VALUE), unknown(),\n *       mapunion(VALUE, (V) =>\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *           templateTypeOf(V, 0),\n *           cond(sub(V, 'Thenable'),\n *              unknown(),\n *              V)))))\n * =:\n */\nPromise.resolve = function(opt_value) {};\n\n\n/**\n * @param {*=} opt_error\n * @return {!Promise}\n */\nPromise.reject = function(opt_error) {};\n\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n * @param {!Iterable} iterable\n * @return {!Promise>}\n * @template VALUE\n * @template RESULT := mapunion(VALUE, (V) =>\n *     cond(isUnknown(V),\n *         unknown(),\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *             templateTypeOf(V, 0),\n *             cond(sub(V, 'Thenable'), unknown(), V))))\n * =:\n */\nPromise.all = function(iterable) {};\n\n/**\n * Record type representing a single element of the array value one gets from\n * Promise.allSettled.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled\n * @record\n * @template VALUE\n */\nPromise.AllSettledResultElement = function() {};\n\n/**\n * 'fulfilled' or 'rejected' to indicate the final state of the corresponding\n * Promise.\n * @type {string}\n */\nPromise.AllSettledResultElement.prototype.status;\n\n/**\n * Exists only if the status field is 'fulfilled'\n * @type {VALUE|undefined}\n */\nPromise.AllSettledResultElement.prototype.value;\n\n/**\n * Exists only if the status field is 'rejected'\n * @type {*|undefined}\n */\nPromise.AllSettledResultElement.prototype.reason;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled\n * @param {!Iterable} iterable\n * @return {!Promise>>}\n * @template VALUE\n * @template RESULT := mapunion(VALUE, (V) =>\n *     cond(isUnknown(V),\n *         unknown(),\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *             templateTypeOf(V, 0),\n *             cond(sub(V, 'Thenable'), unknown(), V))))\n * =:\n */\nPromise.allSettled = function(iterable) {};\n\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n * @param {!Iterable} iterable\n * @return {!Promise}\n * @template VALUE\n * @template RESULT := mapunion(VALUE, (V) =>\n *     cond(isUnknown(V),\n *         unknown(),\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *             templateTypeOf(V, 0),\n *             cond(sub(V, 'Thenable'), unknown(), V))))\n * =:\n */\nPromise.race = function(iterable) {};\n\n\n/**\n * @param {?(function(this:void, TYPE):VALUE)=} opt_onFulfilled\n * @param {?(function(this:void, *): *)=} opt_onRejected\n * @return {RESULT}\n * @template VALUE\n *\n * When a `Thenable` is fulfilled or rejected with another `Thenable`, the\n * payload of the second is used as the payload of the first.\n *\n * @template RESULT := type('Promise',\n *     cond(isUnknown(VALUE), unknown(),\n *       mapunion(VALUE, (V) =>\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *           templateTypeOf(V, 0),\n *           cond(sub(V, 'Thenable'),\n *              unknown(),\n *              V)))))\n * =:\n * @override\n */\nPromise.prototype.then = function(opt_onFulfilled, opt_onRejected) {};\n\n\n/**\n * @param {function(*):VALUE} onRejected\n * @return {!Promise} A Promise of the original type or a possibly\n *     a different type depending on whether the parent promise was rejected.\n *\n * @template VALUE\n *\n * When a `Thenable` is rejected with another `Thenable`, the payload of the\n * second is used as the payload of the first.\n *\n * @template RESULT := cond(\n *     isUnknown(VALUE),\n *     unknown(),\n *     mapunion(VALUE, (V) =>\n *         cond(\n *             isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *             templateTypeOf(V, 0),\n *             cond(\n *                 sub(V, 'Thenable'),\n *                 unknown(),\n *                 V))))\n * =:\n */\nPromise.prototype.catch = function(onRejected) {};\n\n\n/**\n * @param {function()} callback\n * @return {!Promise}\n */\nPromise.prototype.finally = function(callback) {};\n\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of\n * @param {...T} var_args\n * @return {!Array}\n * @template T\n */\nArray.of = function(var_args) {};\n\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from\n * @param {string|!IArrayLike|!Iterable} arrayLike\n * @param {function(this:S, (string|T), number): R=} opt_mapFn\n * @param {S=} opt_this\n * @return {!Array}\n * @template T,S,R\n */\nArray.from = function(arrayLike, opt_mapFn, opt_this) {};\n\n\n/** @return {!IteratorIterable} */\nArray.prototype.keys;\n\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values\n */\nArray.prototype.values;\n\n\n/**\n * @return {!IteratorIterable>} Iterator of [key, value] pairs.\n */\nArray.prototype.entries;\n\n\n/**\n * @param {function(this:S, T, number, !Array): boolean} predicateFn\n * @param {S=} opt_this\n * @return {T|undefined}\n * @this {IArrayLike|string}\n * @template T,S\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.find\n */\nArray.prototype.find = function(predicateFn, opt_this) {};\n\n\n/**\n * @param {function(this:S, T, number, !Array): boolean} predicateFn\n * @param {S=} opt_this\n * @return {number}\n * @this {IArrayLike|string}\n * @template T,S\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.findindex\n */\nArray.prototype.findIndex = function(predicateFn, opt_this) {};\n\n\n/**\n * @param {T} value\n * @param {number=} opt_begin\n * @param {number=} opt_end\n * @return {!Array}\n * @this {!IArrayLike|string}\n * @template T\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.fill\n */\nArray.prototype.fill = function(value, opt_begin, opt_end) {};\n\n\n/**\n * @param {number} target\n * @param {number} start\n * @param {number=} opt_end\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.copywithin\n * @this {!IArrayLike|string}\n * @template T\n * @return {!Array}\n */\nArray.prototype.copyWithin = function(target, start, opt_end) {};\n\n\n/**\n * NOTE: this is an ES2016 (ES7) extern.\n * @param {T} searchElement\n * @param {number=} opt_fromIndex\n * @return {boolean}\n * @this {!IArrayLike|string}\n * @template T\n * @nosideeffects\n * @see https://tc39.github.io/ecma262/#sec-array.prototype.includes\n */\nArray.prototype.includes = function(searchElement, opt_fromIndex) {};\n\n/**\n * Generates an array by passing every element of this array to a callback that\n * returns an array of zero or more elements to be added to the result.\n *\n * NOTE: The specified behavior of the method is that the callback can return\n * either an Array, which will be flattened into the result, or a non-array,\n * which will simply be included.\n *\n * However, while defining that in the type information here is possible it's\n * very hard to understand both for humans and automated tools other than\n * closure-compiler that process these files. Also, we think it's best to\n * encourage writing callbacks that just always return an Array for the sake\n * of readability.\n *\n * The polyfill for this method provided by closure-compiler does behave as\n * defined in the specification, though.\n *\n * @param {function(this: THIS, T, number, !IArrayLike): !Array}\n *     callback\n * @param {THIS=} thisArg\n * @return {!Array}\n * @this {!IArrayLike}\n * @template T, THIS, S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap\n */\nArray.prototype.flatMap = function(callback, thisArg) {};\n\n/**\n * @param {number=} depth\n * @return {!Array}\n * @this {!IArrayLike}\n * @template T, S\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n */\nArray.prototype.flat = function(depth) {};\n\n/**\n * @param {!Object} obj\n * @return {!Array}\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-object.getownpropertysymbols\n */\nObject.getOwnPropertySymbols = function(obj) {};\n\n\n/**\n * @param {!Object} obj\n * @param {?} proto\n * @return {!Object}\n * @see http://www.ecma-international.org/ecma-262/6.0/#sec-object.setprototypeof\n */\nObject.setPrototypeOf = function(obj, proto) {};\n\n\n/**\n * @const {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON\n */\nNumber.EPSILON;\n\n/**\n * @const {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER\n */\nNumber.MIN_SAFE_INTEGER;\n\n/**\n * @const {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER\n */\nNumber.MAX_SAFE_INTEGER;\n\n\n\n/**\n * Parse an integer. Use of `parseInt` without `base` is strictly\n * banned in Google. If you really want to parse octal or hex based on the\n * leader, then pass `undefined` as the base.\n *\n * @param {string} string\n * @param {number|undefined} radix\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt\n */\nNumber.parseInt = function(string, radix) {};\n\n/**\n * @param {string} string\n * @return {number}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat\n */\nNumber.parseFloat = function(string) {};\n\n/**\n * @param {number} value\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN\n */\nNumber.isNaN = function(value) {};\n\n/**\n * @param {number} value\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite\n */\nNumber.isFinite = function(value) {};\n\n/**\n * @param {number} value\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n */\nNumber.isInteger = function(value) {};\n\n/**\n * @param {number} value\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger\n */\nNumber.isSafeInteger = function(value) {};\n\n\n\n/**\n * @param {!Object} target\n * @param {...(Object|null|undefined)} var_args\n * @return {!Object}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n */\nObject.assign = function(target, var_args) {};\n\n/**\n * TODO(dbeam): find a better place for ES2017 externs like this one.\n * NOTE: this is an ES2017 (ES8) extern.\n * @param {!Object} obj\n * @return {!Array} values\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values\n * @throws {Error}\n * @template T\n */\nObject.values = function(obj) {};\n\n/**\n * NOTE: this is an ES2017 (ES8) extern.\n * @param {!Object} obj\n * @return {!Array>} entries\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n * @throws {Error}\n * @template T\n */\nObject.entries = function(obj) {};\n\n/**\n * @param {!Iterable<*>} iter\n * @return {!Object}\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries\n */\nObject.fromEntries = function(iter) {};\n\n/**\n * NOTE: this is an ES2017 (ES8) extern.\n * @param {!Object} obj\n * @return {!Object} descriptors\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors\n * @throws {Error}\n * @template T\n */\nObject.getOwnPropertyDescriptors = function(obj) {};\n\n\n\n/**\n * @const\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n */\nvar Reflect = {};\n\n/**\n * @param {function(this: THIS, ...?): RESULT} targetFn\n * @param {THIS} thisArg\n * @param {!Array} argList\n * @return {RESULT}\n * @template THIS, RESULT\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply\n */\nReflect.apply = function(targetFn, thisArg, argList) {};\n\n/**\n * @param {function(new: ?, ...?)} targetConstructorFn\n * @param {!Array} argList\n * @param {function(new: TARGET, ...?)=} opt_newTargetConstructorFn\n * @return {TARGET}\n * @template TARGET\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct\n */\nReflect.construct = function(\n    targetConstructorFn, argList, opt_newTargetConstructorFn) {};\n\n/**\n * @param {!Object} target\n * @param {string} propertyKey\n * @param {!ObjectPropertyDescriptor} attributes\n * @return {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty\n */\nReflect.defineProperty = function(target, propertyKey, attributes) {};\n\n/**\n * @param {!Object} target\n * @param {string} propertyKey\n * @return {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/deleteProperty\n */\nReflect.deleteProperty = function(target, propertyKey) {};\n\n/**\n * @param {!Object} target\n * @param {string} propertyKey\n * @param {!Object=} opt_receiver\n * @return {*}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get\n */\nReflect.get = function(target, propertyKey, opt_receiver) {};\n\n/**\n * @param {!Object} target\n * @param {string} propertyKey\n * @return {?ObjectPropertyDescriptor}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor\n */\nReflect.getOwnPropertyDescriptor = function(target, propertyKey) {};\n\n/**\n * @param {!Object} target\n * @return {?Object}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getPrototypeOf\n */\nReflect.getPrototypeOf = function(target) {};\n\n/**\n * @param {!Object} target\n * @param {string} propertyKey\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has\n */\nReflect.has = function(target, propertyKey) {};\n\n/**\n * @param {!Object} target\n * @return {boolean}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/isExtensible\n */\nReflect.isExtensible = function(target) {};\n\n/**\n * @param {!Object} target\n * @return {!Array<(string|symbol)>}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys\n */\nReflect.ownKeys = function(target) {};\n\n/**\n * @param {!Object} target\n * @return {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions\n */\nReflect.preventExtensions = function(target) {};\n\n/**\n * @param {!Object} target\n * @param {string} propertyKey\n * @param {*} value\n * @param {!Object=} opt_receiver\n * @return {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set\n */\nReflect.set = function(target, propertyKey, value, opt_receiver) {};\n\n/**\n * @param {!Object} target\n * @param {?Object} proto\n * @return {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/setPrototypeOf\n */\nReflect.setPrototypeOf = function(target, proto) {};\n\n\n/**\n * @const\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics\n */\nvar Atomics = {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.add = function(typedArray, index, value) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.and = function(typedArray, index, value) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} expectedValue\n * @param {number} replacementValue\n * @return {number}\n */\nAtomics.compareExchange = function(\n    typedArray, index, expectedValue, replacementValue) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.exchange = function(typedArray, index, value) {};\n\n/**\n * @param {number} size\n * @return {boolean}\n */\nAtomics.isLockFree = function(size) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @return {number}\n */\nAtomics.load = function(typedArray, index) {};\n\n/**\n * @param {!Int32Array} typedArray\n * @param {number} index\n * @param {number=} count\n * @return {number}\n */\nAtomics.notify = function(typedArray, index, count) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.or = function(typedArray, index, value) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.store = function(typedArray, index, value) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.sub = function(typedArray, index, value) {};\n\n/**\n * @param {!Int32Array} typedArray\n * @param {number} index\n * @param {number} value\n * @param {number=} timeout\n * @return {String}\n */\nAtomics.wait = function(typedArray, index, value, timeout) {};\n\n/**\n * @param {!Int32Array} typedArray\n * @param {number} index\n * @param {number=} count\n * @return {number}\n */\nAtomics.wake = function(typedArray, index, count) {};\n\n/**\n * @param {!TypedArray} typedArray\n * @param {number} index\n * @param {number} value\n * @return {number}\n */\nAtomics.xor = function(typedArray, index, value) {};\n\n\n/**\n * TODO(b/142881197): UNUSED_RETURN_T and UNUSED_NEXT_T are not yet used for\n * anything.\n * https://github.com/google/closure-compiler/issues/3489\n * @interface\n * @template VALUE, UNUSED_RETURN_T, UNUSED_NEXT_T\n * @see https://tc39.github.io/proposal-async-iteration/\n */\nfunction AsyncIterator() {}\n\n/**\n * @param {?=} opt_value\n * @return {!Promise>}\n */\nAsyncIterator.prototype.next;\n\n\n/**\n * @interface\n * @template VALUE\n */\nfunction AsyncIterable() {}\n\n\n/**\n * @return {!AsyncIterator}\n */\nAsyncIterable.prototype[Symbol.asyncIterator] = function() {};\n\n\n/**\n * @interface\n * @extends {AsyncIterator}\n * @extends {AsyncIterable}\n * @template VALUE\n * @see https://tc39.github.io/proposal-async-iteration/\n */\nfunction AsyncIteratorIterable() {}\n\n/**\n * @interface\n * @see https://tc39.github.io/proposal-async-iteration/\n * @extends {AsyncIteratorIterable}\n * @template VALUE\n */\nfunction AsyncGenerator() {}\n\n/**\n * @param {?=} opt_value\n * @return {!Promise>}\n * @override\n */\nAsyncGenerator.prototype.next = function(opt_value) {};\n\n/**\n * @param {VALUE} value\n * @return {!Promise>}\n */\nAsyncGenerator.prototype.return = function(value) {};\n\n/**\n * @param {?} exception\n * @return {!Promise>}\n */\nAsyncGenerator.prototype.throw = function(exception) {};\n\n/**\n * @type {!Global}\n */\nvar globalThis;\n","externs/es6_collections.js":"/*\n * Copyright 2014 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for ECMAScript 6.\n * @see http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts\n * @externs\n */\n\n// TODO(johnlenz): Use Tuples for the Map and Set iterators where appropriate.\n\n/**\n * @constructor @struct\n * @param {Iterable>|!Array>=} opt_iterable\n * @implements {Iterable>}\n * @template KEY, VALUE\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\n */\nfunction Map(opt_iterable) {}\n\n/** @return {void} */\nMap.prototype.clear = function() {};\n\n/**\n * @param {KEY} key\n * @return {boolean}\n */\nMap.prototype.delete = function(key) {};\n\n/**\n * @return {!IteratorIterable>}\n * @nosideeffects\n */\nMap.prototype.entries = function() {};\n\n/**\n * @param {function(this:THIS, VALUE, KEY, MAP)} callback\n * @param {THIS=} opt_thisArg\n * @this {MAP}\n * @template MAP,THIS\n */\nMap.prototype.forEach = function(callback, opt_thisArg) {};\n\n/**\n * @param {KEY} key\n * @return {VALUE}\n * @nosideeffects\n */\nMap.prototype.get = function(key) {};\n\n/**\n * @param {KEY} key\n * @return {boolean}\n * @nosideeffects\n */\nMap.prototype.has = function(key) {};\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n */\nMap.prototype.keys = function() {};\n\n/**\n * @param {KEY} key\n * @param {VALUE} value\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n */\nMap.prototype.set = function(key, value) {};\n\n/**\n * @type {number}\n * (readonly)\n */\nMap.prototype.size;\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n */\nMap.prototype.values = function() {};\n\n/**\n * @return {!Iterator>}\n */\nMap.prototype[Symbol.iterator] = function() {};\n\n\n/**\n * @constructor @struct\n * @param {Iterable>|!Array>=} opt_iterable\n * @template KEY, VALUE\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap\n */\nfunction WeakMap(opt_iterable) {}\n\n/** @return {void} */\nWeakMap.prototype.clear = function() {};\n\n/**\n * @param {KEY} key\n * @return {boolean}\n */\nWeakMap.prototype.delete = function(key) {};\n\n/**\n * @param {KEY} key\n * @return {VALUE}\n * @nosideeffects\n */\nWeakMap.prototype.get = function(key) {};\n\n/**\n * @param {KEY} key\n * @return {boolean}\n * @nosideeffects\n */\nWeakMap.prototype.has = function(key) {};\n\n/**\n * @param {KEY} key\n * @param {VALUE} value\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n */\nWeakMap.prototype.set = function(key, value) {};\n\n/**\n * @constructor @struct\n * @param {Iterable|Array=} opt_iterable\n * @implements {Iterable}\n * @template VALUE\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\n */\nfunction Set(opt_iterable) {}\n\n/**\n * @param {VALUE} value\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n */\nSet.prototype.add = function(value) {};\n\n/**\n * @return {void}\n */\nSet.prototype.clear = function() {};\n\n/**\n * @param {VALUE} value\n * @return {boolean}\n */\nSet.prototype.delete = function(value) {};\n\n/**\n * @return {!IteratorIterable>} Where each array has two entries:\n *     [value, value]\n * @nosideeffects\n */\nSet.prototype.entries = function() {};\n\n/**\n * @param {function(this: THIS, VALUE, VALUE, SET)} callback\n * @param {THIS=} opt_thisArg\n * @this {SET}\n * @template SET,THIS\n */\nSet.prototype.forEach = function(callback, opt_thisArg) {};\n\n/**\n * @param {VALUE} value\n * @return {boolean}\n * @nosideeffects\n */\nSet.prototype.has = function(value) {};\n\n/**\n * @type {number} (readonly)\n */\nSet.prototype.size;\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n */\nSet.prototype.keys = function() {};\n\n/**\n * @return {!IteratorIterable}\n * @nosideeffects\n */\nSet.prototype.values = function() {};\n\n/**\n * @return {!Iterator}\n */\nSet.prototype[Symbol.iterator] = function() {};\n\n\n\n/**\n * @constructor @struct\n * @param {Iterable|Array=} opt_iterable\n * @template VALUE\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\n */\nfunction WeakSet(opt_iterable) {}\n\n/**\n * @param {VALUE} value\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n */\nWeakSet.prototype.add = function(value) {};\n\n/**\n * @return {void}\n */\nWeakSet.prototype.clear = function() {};\n\n/**\n * @param {VALUE} value\n * @return {boolean}\n */\nWeakSet.prototype.delete = function(value) {};\n\n/**\n * @param {VALUE} value\n * @return {boolean}\n * @nosideeffects\n */\nWeakSet.prototype.has = function(value) {};\n","externs/w3c_event.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's event specification.\n *  The whole file has been fully type annotated.\n *  Created from\n *   http://www.w3.org/TR/DOM-Level-2-Events/ecma-script-binding.html\n *\n * @externs\n * @author [email protected] (Alan Leung)\n */\n\n\n/**\n * @interface\n * @see https://dom.spec.whatwg.org/#interface-eventtarget\n */\nfunction EventTarget() {}\n\n/**\n * @param {string} type\n * @param {EventListener|function(this:THIS, !Event):*} listener\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @return {undefined}\n * @this {THIS}\n * @template THIS\n * @see https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener\n */\nEventTarget.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/**\n * @param {string} type\n * @param {EventListener|function(this:THIS, !Event):*} listener\n * @param {(boolean|!EventListenerOptions)=} opt_options\n * @return {undefined}\n * @this {THIS}\n * @template THIS\n * @see https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener\n */\nEventTarget.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/**\n * @param {!Event} evt\n * @return {boolean}\n * @see https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent\n */\nEventTarget.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @interface\n */\nfunction EventListener() {}\n\n/**\n * @param {!Event} evt\n * @return {undefined}\n */\nEventListener.prototype.handleEvent = function(evt) {};\n\n// The EventInit interface and the parameters to the Event constructor are part\n// of DOM Level 3 (suggested) and the DOM \"Living Standard\" (mandated). They are\n// included here as externs cannot be redefined. The same applies to other\n// *EventInit interfaces and *Event constructors throughout this file. See:\n// http://www.w3.org/TR/DOM-Level-3-Events/#event-initializers\n// http://dom.spec.whatwg.org/#constructing-events\n// https://dvcs.w3.org/hg/d4e/raw-file/tip/source_respec.htm#event-constructors\n\n/**\n * @record\n * @see https://dom.spec.whatwg.org/#dictdef-eventinit\n */\nfunction EventInit() {}\n\n/** @type {(undefined|boolean)} */\nEventInit.prototype.bubbles;\n\n/** @type {(undefined|boolean)} */\nEventInit.prototype.cancelable;\n\n/** @type {(undefined|boolean)} */\nEventInit.prototype.composed;\n\n\n/**\n * @constructor\n * @param {string} type\n * @param {EventInit=} opt_eventInitDict\n */\nfunction Event(type, opt_eventInitDict) {}\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Events/ecma-script-binding.html\n */\nEvent.CAPTURING_PHASE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Events/ecma-script-binding.html\n */\nEvent.AT_TARGET;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Events/ecma-script-binding.html\n */\nEvent.BUBBLING_PHASE;\n\n/** @type {string} */\nEvent.prototype.type;\n\n/** @type {EventTarget} */\nEvent.prototype.target;\n\n/** @type {EventTarget} */\nEvent.prototype.currentTarget;\n\n/** @type {number} */\nEvent.prototype.eventPhase;\n\n/** @type {boolean} */\nEvent.prototype.bubbles;\n\n/** @type {boolean} */\nEvent.prototype.cancelable;\n\n/** @type {number} */\nEvent.prototype.timeStamp;\n\n/**\n * Present for events spawned in browsers that support shadow dom.\n * @type {Array|undefined}\n */\nEvent.prototype.path;\n\n/**\n * Present for events spawned in browsers that support shadow dom.\n * @type {function():Array|undefined}\n * @see https://www.w3.org/TR/shadow-dom/#widl-Event-deepPath\n */\nEvent.prototype.deepPath;\n\n/**\n * @return {undefined}\n */\nEvent.prototype.stopPropagation = function() {};\n\n/**\n * @return {undefined}\n */\nEvent.prototype.preventDefault = function() {};\n\n/**\n * @param {string} eventTypeArg\n * @param {boolean=} canBubbleArg\n * @param {boolean=} cancelableArg\n * @return {undefined}\n */\nEvent.prototype.initEvent = function(eventTypeArg, canBubbleArg, cancelableArg) {};\n\n/**\n * @record\n * @extends {EventInit}\n * @template T\n * @see https://dom.spec.whatwg.org/#dictdef-customeventinit\n */\nfunction CustomEventInit() {}\n\n/** @type {(T|undefined)} */\nCustomEventInit.prototype.detail;\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {CustomEventInit=} opt_eventInitDict\n * @template T\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent\n */\nfunction CustomEvent(type, opt_eventInitDict) {}\n\n/**\n * @param {string} eventType\n * @param {boolean} bubbles\n * @param {boolean} cancelable\n * @param {T} detail\n * @return {undefined}\n */\nCustomEvent.prototype.initCustomEvent = function(\n    eventType, bubbles, cancelable, detail) {};\n\n/**\n * @type {T}\n */\nCustomEvent.prototype.detail;\n\n/**\n * @interface\n */\nfunction DocumentEvent() {}\n\n/**\n * @param {string} eventType\n * @return {!Event}\n */\nDocumentEvent.prototype.createEvent = function(eventType) {};\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://w3c.github.io/uievents/#idl-uieventinit\n */\nfunction UIEventInit() {}\n\n/** @type {undefined|?Window} */\nUIEventInit.prototype.view;\n\n/** @type {undefined|number} */\nUIEventInit.prototype.detail;\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {UIEventInit=} opt_eventInitDict\n */\nfunction UIEvent(type, opt_eventInitDict) {}\n\n/** @type {number} */\nUIEvent.prototype.detail;\n\n/**\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {Window} viewArg\n * @param {number} detailArg\n * @return {undefined}\n */\nUIEvent.prototype.initUIEvent = function(typeArg, canBubbleArg, cancelableArg,\n    viewArg, detailArg) {};\n\n/**\n * @record\n * @extends {UIEventInit}\n * @see https://w3c.github.io/uievents/#dictdef-eventmodifierinit\n */\nfunction EventModifierInit() {}\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.ctrlKey;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.shiftKey;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.altKey;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.metaKey;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierAltGraph;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierCapsLock;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierFn;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierFnLock;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierHyper;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierNumLock;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierScrollLock;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierSuper;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierSymbol;\n\n/** @type {undefined|boolean} */\nEventModifierInit.prototype.modifierSymbolLock;\n\n/**\n * @record\n * @extends {EventModifierInit}\n * @see https://w3c.github.io/uievents/#idl-mouseeventinit\n */\nfunction MouseEventInit() {}\n\n/** @type {undefined|number} */\nMouseEventInit.prototype.screenX;\n\n/** @type {undefined|number} */\nMouseEventInit.prototype.screenY;\n\n/** @type {undefined|number} */\nMouseEventInit.prototype.clientX;\n\n/** @type {undefined|number} */\nMouseEventInit.prototype.clientY;\n\n/** @type {undefined|number} */\nMouseEventInit.prototype.button;\n\n/** @type {undefined|number} */\nMouseEventInit.prototype.buttons;\n\n/** @type {undefined|?EventTarget} */\nMouseEventInit.prototype.relatedTarget;\n\n/**\n * @constructor\n * @extends {UIEvent}\n * @param {string} type\n * @param {MouseEventInit=} opt_eventInitDict\n */\nfunction MouseEvent(type, opt_eventInitDict) {}\n\n/** @type {number} */\nMouseEvent.prototype.screenX;\n\n/** @type {number} */\nMouseEvent.prototype.screenY;\n\n/** @type {number} */\nMouseEvent.prototype.clientX;\n\n/** @type {number} */\nMouseEvent.prototype.clientY;\n\n/** @type {boolean} */\nMouseEvent.prototype.ctrlKey;\n\n/** @type {boolean} */\nMouseEvent.prototype.shiftKey;\n\n/** @type {boolean} */\nMouseEvent.prototype.altKey;\n\n/** @type {boolean} */\nMouseEvent.prototype.metaKey;\n\n/** @type {number} */\nMouseEvent.prototype.button;\n\n/** @type {EventTarget} */\nMouseEvent.prototype.relatedTarget;\n\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction MutationEvent() {}\n\n/** @type {Node} */\nMutationEvent.prototype.relatedNode;\n\n/** @type {string} */\nMutationEvent.prototype.prevValue;\n\n/** @type {string} */\nMutationEvent.prototype.newValue;\n\n/** @type {string} */\nMutationEvent.prototype.attrName;\n\n/** @type {number} */\nMutationEvent.prototype.attrChange;\n\n/**\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {Node} relatedNodeArg\n * @param {string} prevValueArg\n * @param {string} newValueArg\n * @param {string} attrNameArg\n * @param {number} attrChangeArg\n * @return {undefined}\n */\nMutationEvent.prototype.initMutationEvent = function(typeArg, canBubbleArg, cancelableArg, relatedNodeArg, prevValueArg, newValueArg, attrNameArg, attrChangeArg) {};\n\n\n// DOM3\n/**\n * @record\n * @extends {EventModifierInit}\n * @see https://w3c.github.io/uievents/#idl-keyboardeventinit\n */\nfunction KeyboardEventInit() {}\n\n/** @type {undefined|string} */\nKeyboardEventInit.prototype.key;\n\n/** @type {undefined|string} */\nKeyboardEventInit.prototype.code;\n\n/** @type {undefined|number} */\nKeyboardEventInit.prototype.location;\n\n/** @type {undefined|boolean} */\nKeyboardEventInit.prototype.repeat;\n\n/** @type {undefined|boolean} */\nKeyboardEventInit.prototype.isComposing;\n\n/** @type {undefined|string} */\nKeyboardEventInit.prototype.char;\n\n/** @type {undefined|string} */\nKeyboardEventInit.prototype.locale;\n\n/**\n * @see https://w3c.github.io/uievents/#idl-keyboardevent\n * @constructor\n * @extends {UIEvent}\n * @param {string} type\n * @param {KeyboardEventInit=} opt_eventInitDict\n */\nfunction KeyboardEvent(type, opt_eventInitDict) {}\n\n/** @type {string} */\nKeyboardEvent.prototype.keyIdentifier;\n\n/** @type {boolean} */\nKeyboardEvent.prototype.ctrlKey;\n\n/** @type {boolean} */\nKeyboardEvent.prototype.shiftKey;\n\n/** @type {boolean} */\nKeyboardEvent.prototype.altKey;\n\n/** @type {boolean} */\nKeyboardEvent.prototype.metaKey;\n\n/** @type {number} */\nKeyboardEvent.DOM_KEY_LOCATION_STANDARD;\n\n/** @type {number} */\nKeyboardEvent.DOM_KEY_LOCATION_LEFT;\n\n/** @type {number} */\nKeyboardEvent.DOM_KEY_LOCATION_RIGHT;\n\n/** @type {number} */\nKeyboardEvent.DOM_KEY_LOCATION_NUMPAD;\n\n/**\n * @param {string} keyIdentifierArg\n * @return {boolean}\n */\nKeyboardEvent.prototype.getModifierState = function(keyIdentifierArg) {};\n\n/**\n * @record\n * @extends {UIEventInit}\n * @see https://w3c.github.io/uievents/#idl-focuseventinit\n */\nfunction FocusEventInit() {}\n\n/** @type {undefined|?EventTarget} */\nFocusEventInit.prototype.relatedTarget;\n\n\n/**\n * The FocusEvent interface provides specific contextual information associated\n * with Focus events.\n * http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent\n *\n * @constructor\n * @extends {UIEvent}\n * @param {string} type\n * @param {FocusEventInit=} opt_eventInitDict\n */\nfunction FocusEvent(type, opt_eventInitDict) {}\n\n/** @type {EventTarget} */\nFocusEvent.prototype.relatedTarget;\n\n\n/**\n * See https://dom.spec.whatwg.org/#dictdef-eventlisteneroptions\n * @record\n */\nvar EventListenerOptions = function() {};\n\n/** @type {boolean|undefined} */\nEventListenerOptions.prototype.capture;\n\n/**\n * See https://dom.spec.whatwg.org/#dictdef-addeventlisteneroptions\n * @record\n * @extends {EventListenerOptions}\n */\nvar AddEventListenerOptions = function() {};\n\n/** @type {boolean|undefined} */\nAddEventListenerOptions.prototype.passive;\n\n/** @type {boolean|undefined} */\nAddEventListenerOptions.prototype.once;\n\n/**\n * @record\n * @extends {UIEventInit}\n * @see https://w3c.github.io/uievents/#idl-inputeventinit\n * @see https://w3c.github.io/input-events/#interface-InputEvent\n */\nfunction InputEventInit() {}\n\n/** @type {undefined|?string} */\nInputEventInit.prototype.data;\n\n/** @type {undefined|boolean} */\nInputEventInit.prototype.isComposing;\n\n/** @type {undefined|string} */\nInputEventInit.prototype.inputType;\n\n/** @type {undefined|?DataTransfer} */\nInputEventInit.prototype.dataTransfer;\n\n\n// TODO(charleyroy): Add getTargetRanges() once a consensus has been made\n// regarding how to structure these values. See\n// https://github.com/w3c/input-events/issues/38.\n/**\n * @constructor\n * @extends {UIEvent}\n * @param {string} type\n * @param {InputEventInit=} opt_eventInitDict\n * @see https://www.w3.org/TR/uievents/#interface-inputevent\n * @see https://w3c.github.io/input-events/#interface-InputEvent\n */\nfunction InputEvent(type, opt_eventInitDict) {}\n\n/** @type {string} */\nInputEvent.prototype.data;\n\n/** @type {boolean} */\nInputEvent.prototype.isComposed;\n\n/** @type {string} */\nInputEvent.prototype.inputType;\n\n/** @type {?DataTransfer} */\nInputEvent.prototype.dataTransfer;\n","externs/w3c_event3.js":"/*\n * Copyright 2010 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's event Level 3 specification.\n *  This file depends on w3c_event.js.\n *  The whole file has been partially type annotated.\n *  Created from\n *   http://www.w3.org/TR/DOM-Level-3-Events/#ecma-script-binding-ecma-binding\n *\n * @externs\n * @author [email protected] (Eric Dingle)\n */\n\n/**\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {Window} viewArg\n * @param {string} keyIdentifierArg\n * @param {number} keyLocationArg\n * @param {string} modifiersList\n * @return {undefined}\n */\nKeyboardEvent.prototype.initKeyboardEvent = function(typeArg, canBubbleArg, cancelableArg, viewArg, keyIdentifierArg, keyLocationArg, modifiersList) {};\n\n/** @type {string} */\nKeyboardEvent.prototype.char;\n\n/** @type {string} */\nKeyboardEvent.prototype.code;\n\n/** @type {string} */\nKeyboardEvent.prototype.key;\n\n/** @type {number} */\nKeyboardEvent.prototype.location;\n\n/** @type {boolean} */\nKeyboardEvent.prototype.repeat;\n\n/** @type {string} */\nKeyboardEvent.prototype.locale;\n\n/** @type {number} */\nMouseEvent.prototype.buttons;\n\n/**\n * @param {string} keyIdentifierArg\n * @return {boolean}\n */\nMouseEvent.prototype.getModifierState = function(keyIdentifierArg) {};\n\n/** @type {boolean} */\nEvent.prototype.defaultPrevented;\n\n/** @type {string} */\nEvent.prototype.namespaceURI;\n\n/** @return {undefined} */\nEvent.prototype.stopImmediatePropagation = function() {};\n","externs/w3c_device_sensor_event.js":"/*\n * Copyright 2013 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's device orientation and device motion\n *  events specification.\n *  This file depends on w3c_event.js.\n *  The whole file has been partially type annotated.\n *  Created from http://dev.w3.org/geo/api/spec-source-orientation.\n *\n * @externs\n * @author [email protected] (Lukasz Bieniasz-Krzywiec)\n */\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://w3c.github.io/deviceorientation/spec-source-orientation.html#deviceorientation\n */\nfunction DeviceOrientationEventInit() {}\n\n/** @type {number|undefined} */\nDeviceOrientationEventInit.prototype.alpha;\n\n/** @type {number|undefined} */\nDeviceOrientationEventInit.prototype.beta;\n\n/** @type {number|undefined} */\nDeviceOrientationEventInit.prototype.gamma;\n\n/** @type {boolean|undefined} */\nDeviceOrientationEventInit.prototype.absolute;\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {!DeviceOrientationEventInit=} opt_eventInitDict\n */\nfunction DeviceOrientationEvent(type, opt_eventInitDict) {}\n\n/** @type {?number} */\nDeviceOrientationEvent.prototype.alpha;\n\n/** @type {?number} */\nDeviceOrientationEvent.prototype.beta;\n\n/** @type {?number} */\nDeviceOrientationEvent.prototype.gamma;\n\n/** @type {boolean} */\nDeviceOrientationEvent.prototype.absolute;\n\n/**\n * @type {?number}\n * @see https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html#//apple_ref/javascript/instp/DeviceOrientationEvent/webkitCompassAccuracy\n */\nDeviceOrientationEvent.prototype.webkitCompassAccuracy;\n\n/**\n * @type {?number}\n * @see https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html#//apple_ref/javascript/instp/DeviceOrientationEvent/webkitCompassHeading\n */\nDeviceOrientationEvent.prototype.webkitCompassHeading;\n\n/**\n * @constructor\n */\nfunction DeviceAcceleration() {}\n\n/** @type {?number} */\nDeviceAcceleration.prototype.x;\n\n/** @type {?number} */\nDeviceAcceleration.prototype.y;\n\n/** @type {?number} */\nDeviceAcceleration.prototype.z;\n\n/**\n * @constructor\n */\nfunction DeviceRotationRate() {}\n\n/** @type {?number} */\nDeviceRotationRate.prototype.alpha;\n\n/** @type {?number} */\nDeviceRotationRate.prototype.beta;\n\n/** @type {?number} */\nDeviceRotationRate.prototype.gamma;\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction DeviceMotionEvent() {}\n\n/** @type {?DeviceAcceleration} */\nDeviceMotionEvent.prototype.acceleration;\n\n/** @type {?DeviceAcceleration} */\nDeviceMotionEvent.prototype.accelerationIncludingGravity;\n\n/** @type {?DeviceRotationRate} */\nDeviceMotionEvent.prototype.rotationRate;\n\n/** @type {?number} */\nDeviceMotionEvent.prototype.interval;\n","externs/gecko_event.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over\n *  W3C's event specification by Gecko. This file depends on\n *  w3c_event.js.\n *\n * @externs\n * @author [email protected] (Alan Leung)\n */\n\n// TODO: Almost all of it has not been annotated with types.\n\n/** @const {number} */ Event.prototype.HORIZONTAL_AXIS;\n/** @const {number} */ Event.prototype.VERTICAL_AXIS;\n/** @type {boolean} */ Event.prototype.altKey;\n/** @type {number} */ Event.prototype.axis;\n/** @type {number} */ Event.prototype.button;\n/** @type {boolean} */ Event.prototype.cancelBubble;\n/** @type {number} */ Event.prototype.charCode;\n/** @type {number} */ Event.prototype.clientX;\n/** @type {number} */ Event.prototype.clientY;\n/** @type {boolean} */ Event.prototype.ctrlKey;\n/** @type {EventTarget} */ Event.prototype.explicitOriginalTarget;\n/** @type {boolean} */ Event.prototype.isChar;\n/** @type {boolean} */ Event.prototype.isTrusted;\n/** @type {number} */ Event.prototype.keyCode;\n/** @type {number} */ Event.prototype.layerX;\n/** @type {number} */ Event.prototype.layerY;\n/** @type {boolean} */ Event.prototype.metaKey;\n/** @type {EventTarget} */ Event.prototype.originalTarget;\n/** @type {number} */ Event.prototype.pageX;\n/** @type {number} */ Event.prototype.pageY;\n/** @type {EventTarget|undefined} */ Event.prototype.relatedTarget;\n/** @type {number} */ Event.prototype.screenX;\n/** @type {number} */ Event.prototype.screenY;\n/** @type {boolean} */ Event.prototype.shiftKey;\n/** @type {Window} */ Event.prototype.view;\n/** @type {number} */ Event.prototype.which;\n\n/** @constructor */ function nsIDOMPageTransitionEvent() {}\n/** @type {boolean} */ nsIDOMPageTransitionEvent.prototype.persisted;\n\n//Methods\nEvent.prototype.initKeyEvent;\n/**\n * @param {string} typeArg\n * @param {boolean=} canBubbleArg\n * @param {boolean=} cancelableArg\n * @param {?Window=} viewArg\n * @param {?number=} detailArg\n * @param {number=} screenXArg\n * @param {number=} screenYArg\n * @param {number=} clientXArg\n * @param {number=} clientYArg\n * @param {boolean=} ctrlKeyArg\n * @param {boolean=} altKeyArg\n * @param {boolean=} shiftKeyArg\n * @param {boolean=} metaKeyArg\n * @param {?number=} buttonArg\n * @param {?EventTarget=} relatedTargetArg\n */\nEvent.prototype.initMouseEvent = function(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg, screenXArg, screenYArg, clientXArg, clientYArg, ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, buttonArg, relatedTargetArg) {};\nEvent.prototype.initUIEvent;\nEvent.prototype.initMessageEvent;\nEvent.prototype.preventBubble;\nEvent.prototype.preventCapture;\n","externs/ie_event.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over the\n *  W3C's event specification by IE in JScript. This file depends on\n *  w3c_event.js.\n *\n * @see http://msdn.microsoft.com/en-us/library/ms535863.aspx\n * @externs\n * @author [email protected] (Alan Leung)\n */\n\n/** @type {string} */\nEvent.prototype.Abstract;\n\n/** @type {boolean} */\nEvent.prototype.altLeft;\n\n/** @type {string} */\nEvent.prototype.Banner;\n\n/**\n * A ClipboardData on IE, but a DataTransfer on WebKit.\n * @see http://msdn.microsoft.com/en-us/library/ms535220.aspx\n * @type {(ClipboardData|undefined)}\n */\nEvent.prototype.clipboardData;\n\n/** @type {boolean} */\nEvent.prototype.contentOverflow;\n\n/** @type {boolean} */\nEvent.prototype.ctrlLeft;\n\n/** @type {string} */\nEvent.prototype.dataFld;\n\nEvent.prototype.domain;\n\n/** @type {Element} */\nEvent.prototype.fromElement;\n\n/** @type {string} */\nEvent.prototype.MoreInfo;\n\n/** @type {string} */\nEvent.prototype.nextPage;\n\n/** @type {number} */\nEvent.prototype.offsetX;\n\n/** @type {number} */\nEvent.prototype.offsetY;\n\n/** @type {string} */\nEvent.prototype.propertyName;\n\n/** @type {string} */\nEvent.prototype.qualifier;\n\n/** @type {?} */\nEvent.prototype.reason;\n\n/** @type {Object<*>} */\nEvent.prototype.recordset;\n\n/** @type {boolean} */\nEvent.prototype.repeat;\n\n/** @type {(boolean|string|undefined)} */\nEvent.prototype.returnValue;\n\n/** @type {string} */\nEvent.prototype.saveType;\n\nEvent.prototype.scheme;\n\n/** @type {boolean} */\nEvent.prototype.shiftLeft;\n\n/** @type {Window} */\nEvent.prototype.source;\n\n/** @type {Element} */\nEvent.prototype.srcElement;\n\nEvent.prototype.srcFilter;\n\n/** @type {string} */\nEvent.prototype.srcUrn;\n\n/** @type {Element} */\nEvent.prototype.toElement;\n\nEvent.prototype.userName;\n\n/** @type {number} */\nEvent.prototype.wheelDelta;\n\n/** @type {number} */\nEvent.prototype.x;\n\n/** @type {number} */\nEvent.prototype.y;\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/windows/apps/hh441257.aspx\n */\nfunction MSPointerPoint() {}\n\n/** @type {number} */\nMSPointerPoint.prototype.pointerId;\n\n/** @type {number} */\nMSPointerPoint.prototype.pointerType;\n\n/**\n * @constructor\n * @extends {Event}\n * @see http://msdn.microsoft.com/en-us/library/windows/apps/hh441233.aspx\n */\nfunction MSPointerEvent() {}\n\n/** @const {number} */\nMSPointerEvent.MSPOINTER_TYPE_MOUSE;\n\n/** @const {number} */\nMSPointerEvent.MSPOINTER_TYPE_PEN;\n\n/** @const {number} */\nMSPointerEvent.MSPOINTER_TYPE_TOUCH;\n\n/** @type {number} */\nMSPointerEvent.prototype.height;\n\n/** @type {number} */\nMSPointerEvent.prototype.hwTimestamp;\n\n/** @type {boolean} */\nMSPointerEvent.prototype.isPrimary;\n\n/** @type {number} */\nMSPointerEvent.prototype.pointerId;\n\n/** @type {number} */\nMSPointerEvent.prototype.pointerType;\n\n/** @type {number} */\nMSPointerEvent.prototype.pressure;\n\n/** @type {number} */\nMSPointerEvent.prototype.rotation;\n\n/** @type {number} */\nMSPointerEvent.prototype.tiltX;\n\n/** @type {number} */\nMSPointerEvent.prototype.tiltY;\n\n/** @type {number} */\nMSPointerEvent.prototype.timeStamp;\n\n/** @type {number} */\nMSPointerEvent.prototype.width;\n\n/**\n * @param {number} pointerId\n * @return {undefined}\n */\nMSPointerEvent.prototype.msReleasePointerCapture;\n\n/**\n * @param {number} pointerId\n * @return {undefined}\n */\nMSPointerEvent.prototype.msSetPointerCapture;\n\n/**\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {Window} viewArg\n * @param {number} detailArg\n * @param {number} screenXArg\n * @param {number} screenYArg\n * @param {number} clientXArg\n * @param {number} clientYArg\n * @param {boolean} ctrlKeyArg\n * @param {boolean} altKeyArg\n * @param {boolean} shiftKeyArg\n * @param {boolean} metaKeyArg\n * @param {number} buttonArg\n * @param {Element} relatedTargetArg\n * @param {number} offsetXArg\n * @param {number} offsetYArg\n * @param {number} widthArg\n * @param {number} heightArg\n * @param {number} pressure\n * @param {number} rotation\n * @param {number} tiltX\n * @param {number} tiltY\n * @param {number} pointerIdArg\n * @param {number} pointerType\n * @param {number} hwTimestampArg\n * @param {boolean} isPrimary\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/windows/apps/hh441246.aspx\n */\nMSPointerEvent.prototype.initPointerEvent;\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/ie/hh968249(v=vs.85).aspx\n */\nfunction MSGesture() {}\n\n/**\n * @type {Element}\n */\nMSGesture.prototype.target;\n\n/**\n * @param {number} pointerId\n * @return {undefined}\n */\nMSGesture.prototype.addPointer = function(pointerId) {};\n\nMSGesture.prototype.stop = function() {};\n\n/**\n * @constructor\n * @extends {Event}\n * @see http://msdn.microsoft.com/en-us/library/ie/hh772076(v=vs.85).aspx\n */\nfunction MSGestureEvent() {}\n\n/** @type {number} */\nMSGestureEvent.prototype.expansion;\n\n/** @type {!MSGesture} */\nMSGestureEvent.prototype.gestureObject;\n\n/** @type {number} */\nMSGestureEvent.prototype.hwTimestamp;\n\n/** @type {number} */\nMSGestureEvent.prototype.rotation;\n\n/** @type {number} */\nMSGestureEvent.prototype.scale;\n\n/** @type {number} */\nMSGestureEvent.prototype.translationX;\n\n/** @type {number} */\nMSGestureEvent.prototype.translationY;\n\n/** @type {number} */\nMSGestureEvent.prototype.velocityAngular;\n\n/** @type {number} */\nMSGestureEvent.prototype.velocityExpansion;\n\n/** @type {number} */\nMSGestureEvent.prototype.velocityX;\n\n/** @type {number} */\nMSGestureEvent.prototype.velocityY;\n\n/**\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {Window} viewArg\n * @param {number} detailArg\n * @param {number} screenXArg\n * @param {number} screenYArg\n * @param {number} clientXArg\n * @param {number} clientYArg\n * @param {number} offsetXArg\n * @param {number} offsetYArg\n * @param {number} translationXArg\n * @param {number} translationYArg\n * @param {number} scaleArg\n * @param {number} expansionArg\n * @param {number} rotationArg\n * @param {number} velocityXArg\n * @param {number} velocityYArg\n * @param {number} velocityExpansionArg\n * @param {number} velocityAngularArg\n * @param {number} hwTimestampArg\n * @param {EventTarget} relatedTargetArg\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/windows/apps/hh441187.aspx\n */\nMSGestureEvent.prototype.initGestureEvent;\n","externs/webkit_event.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over W3C's\n *  event specification by WebKit. This file depends on w3c_event.js.\n *  All the provided definitions have been type annotated\n *\n * @externs\n * @author [email protected] (DJ Lee)\n */\n\n/** @type {number} */\nEvent.prototype.wheelDeltaX;\n\n/** @type {number} */\nEvent.prototype.wheelDeltaY;\n\n/**\n * @constructor\n * @extends {Event}\n * @see http://developer.apple.com/library/safari/documentation/AudioVideo/Reference/WebKitAnimationEventClassReference/WebKitAnimationEvent/WebKitAnimationEvent.html\n */\nfunction WebKitAnimationEvent() {}\n\n/**\n * @const {string}\n */\nWebKitAnimationEvent.prototype.animationName;\n\n/**\n * @const {number}\n */\nWebKitAnimationEvent.prototype.elapsedTime;\n","externs/w3c_pointer_events.js":"/*\n * Copyright 2014 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Pointer Events specification.\n *  Created from\n *   http://www.w3.org/TR/pointerevents/\n *\n * @externs\n */\n\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/pointerevents/#the-touch-action-css-property\n */\nCSSProperties.prototype.touchAction;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/pointerevents/#widl-Navigator-pointerEnabled\n */\nNavigator.prototype.pointerEnabled;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/pointerevents/#widl-Navigator-maxTouchPoints\n */\nNavigator.prototype.maxTouchPoints;\n\n\n/**\n * @param {number} pointerId\n * @see https://www.w3.org/TR/pointerevents/#widl-Element-setPointerCapture-void-long-pointerId\n */\nElement.prototype.setPointerCapture = function(pointerId) {};\n\n/**\n * @param {number} pointerId\n * @see https://www.w3.org/TR/pointerevents/#widl-Element-releasePointerCapture-void-long-pointerId\n */\nElement.prototype.releasePointerCapture = function(pointerId) {};\n\n/**\n * @param {number} pointerId\n * @see https://www.w3.org/TR/pointerevents/#dom-element-haspointercapture\n * @return {boolean}\n */\nElement.prototype.hasPointerCapture = function(pointerId) {};\n\n\n/**\n * @record\n * @extends {MouseEventInit}\n * @see https://www.w3.org/TR/pointerevents/#idl-def-PointerEventInit\n */\nfunction PointerEventInit() {}\n\n/** @type {undefined|number} */\nPointerEventInit.prototype.pointerId;\n\n/** @type {undefined|number} */\nPointerEventInit.prototype.width;\n\n/** @type {undefined|number} */\nPointerEventInit.prototype.height;\n\n/** @type {undefined|number} */\nPointerEventInit.prototype.pressure;\n\n/** @type {undefined|number} */\nPointerEventInit.prototype.tiltX;\n\n/** @type {undefined|number} */\nPointerEventInit.prototype.tiltY;\n\n/** @type {undefined|string} */\nPointerEventInit.prototype.pointerType;\n\n/** @type {undefined|boolean} */\nPointerEventInit.prototype.isPrimary;\n\n/**\n * @constructor\n * @extends {MouseEvent}\n * @param {string} type\n * @param {PointerEventInit=} opt_eventInitDict\n * @see http://www.w3.org/TR/pointerevents/#pointerevent-interface\n */\nfunction PointerEvent(type, opt_eventInitDict) {}\n\n/** @type {number} */\nPointerEvent.prototype.pointerId;\n\n/** @type {number} */\nPointerEvent.prototype.width;\n\n/** @type {number} */\nPointerEvent.prototype.height;\n\n/** @type {number} */\nPointerEvent.prototype.pressure;\n\n/** @type {number} */\nPointerEvent.prototype.tiltX;\n\n/** @type {number} */\nPointerEvent.prototype.tiltY;\n\n/** @type {string} */\nPointerEvent.prototype.pointerType;\n\n/** @type {boolean} */\nPointerEvent.prototype.isPrimary;\n\n// Microsoft pointerType values\n/** @const {string} */\nPointerEvent.prototype.MSPOINTER_TYPE_TOUCH;\n\n/** @const {string} */\nPointerEvent.prototype.MSPOINTER_TYPE_PEN;\n\n/** @const {string} */\nPointerEvent.prototype.MSPOINTER_TYPE_MOUSE;\n\n/**\n * @see https://w3c.github.io/pointerevents/extension.html\n * @return {!Array}\n */\nPointerEvent.prototype.getCoalescedEvents = function() {};\n\n","externs/w3c_gamepad.js":"/*\n * Copyright 2013 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Gamepad specification.\n * @see http://www.w3.org/TR/gamepad/\n * @externs\n */\n\n/**\n * @return {!Array.}\n */\nnavigator.getGamepads = function() {};\n\n/**\n * @return {!Array.}\n */\nnavigator.webkitGetGamepads = function() {};\n\n\n/**\n * @interface\n */\nvar Gamepad = function() {};\n\n/**\n * @type {string}\n */\nGamepad.prototype.id;  // read-only\n\n/**\n * @type {number}\n */\nGamepad.prototype.index;  // read-only\n\n/**\n * @type {boolean}\n */\nGamepad.prototype.connected;  // read-only\n\n/**\n * @type {number}\n */\nGamepad.prototype.timestamp;  // read-only\n\n/**\n * @type {string}\n */\nGamepad.prototype.mapping;  // read-only\n\n/**\n * @type {!Array.}\n */\nGamepad.prototype.axes;  // read-only\n\n/**\n * Note: The W3C spec changed, this property now returns an array of\n * GamepadButton objects.\n *\n * @type {(!Array.|!Array.)}\n */\nGamepad.prototype.buttons;\n\n\n/**\n * @interface\n */\nvar GamepadButton = function() {};\n\n/**\n * @type {boolean}\n */\nGamepadButton.prototype.pressed;  // read-only\n\n/**\n * @type {number}\n */\nGamepadButton.prototype.value;  // read-only\n","externs/w3c_selection.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Selection API.\n *\n * @see https://w3c.github.io/selection-api/\n *\n * @externs\n */\n\n/**\n * @constructor\n * @see http://w3c.github.io/selection-api/#selection-interface\n */\nfunction Selection() {}\n\n/**\n * @type {?Node}\n * @see https://w3c.github.io/selection-api/#dom-selection-anchornode\n */\nSelection.prototype.anchorNode;\n\n/**\n * @type {number}\n * @see https://w3c.github.io/selection-api/#dom-selection-anchoroffset\n */\nSelection.prototype.anchorOffset;\n\n/**\n * @type {?Node}\n * @see https://w3c.github.io/selection-api/#dom-selection-focusnode\n */\nSelection.prototype.focusNode;\n\n/**\n * @type {number}\n * @see https://w3c.github.io/selection-api/#dom-selection-focusoffset\n */\nSelection.prototype.focusOffset;\n\n/**\n * @type {boolean}\n * @see https://w3c.github.io/selection-api/#dom-selection-iscollapsed\n */\nSelection.prototype.isCollapsed;\n\n/**\n * @type {number}\n * @see https://w3c.github.io/selection-api/#dom-selection-rangecount\n */\nSelection.prototype.rangeCount;\n\n/**\n * @type {string}\n * @see https://w3c.github.io/selection-api/#dom-selection-type\n */\nSelection.prototype.type;\n\n/**\n * @param {number} index\n * @return {!Range}\n * @nosideeffects\n * @see https://w3c.github.io/selection-api/#dom-selection-getrangeat\n */\nSelection.prototype.getRangeAt = function(index) {};\n\n/**\n * TODO(tjgq): Clean up internal usages and make the `range` parameter a\n * `!Range` per the spec.\n * @param {?Range} range\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-addrange\n */\nSelection.prototype.addRange = function(range) {};\n\n/**\n * @param {!Range} range\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-removerange\n */\nSelection.prototype.removeRange = function(range) {};\n\n/**\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-removeallranges\n */\nSelection.prototype.removeAllRanges = function() {};\n\n/**\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-empty\n */\nSelection.prototype.empty = function() {};\n\n/**\n * @param {?Node} node\n * @param {number=} offset\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-collapse\n */\nSelection.prototype.collapse = function(node, offset) {};\n\n/**\n * @param {?Node} node\n * @param {number=} offset\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-setposition\n */\nSelection.prototype.setPosition = function(node, offset) {};\n\n/**\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-collapsetostart\n */\nSelection.prototype.collapseToStart = function() {};\n\n/**\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-collapsetoend\n */\nSelection.prototype.collapseToEnd = function() {};\n\n/**\n * TODO(tjgq): Clean up internal usages and make the `node` parameter a `!Node`\n * per the spec.\n * @param {?Node} node\n * @param {number=} offset\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-extend\n */\nSelection.prototype.extend = function(node, offset) {};\n\n/**\n * TODO(tjgq): Clean up internal usages and make the `anchorNode` and\n * `focusNode` parameters `!Node` per the spec.\n * @param {?Node} anchorNode\n * @param {number} anchorOffset\n * @param {?Node} focusNode\n * @param {number} focusOffset\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-setbaseandextent\n */\nSelection.prototype.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {};\n\n/**\n * TODO(tjgq): Clean up internal usages and make the `node` parameter a `!Node`\n * per the spec.\n * @param {?Node} node\n * @return {undefined}\n * @see http://w3c.github.io/selection-api/#dom-selection-selectallchildren\n */\nSelection.prototype.selectAllChildren = function(node) {};\n\n/**\n * @return {undefined}\n * @see https://w3c.github.io/selection-api/#dom-selection-deletefromdocument\n */\nSelection.prototype.deleteFromDocument = function() {};\n\n/**\n * @param {!Node} node\n * @param {boolean=} allowPartialContainment\n * @return {boolean}\n * @nosideeffects\n * @see https://w3c.github.io/selection-api/#dom-selection-containsnode\n */\nSelection.prototype.containsNode = function(node, allowPartialContainment) {};\n\n/**\n * @return {?Selection}\n * @nosideeffects\n * @see https://w3c.github.io/selection-api/#dom-window-getselection\n */\nWindow.prototype.getSelection = function() {};\n\n/**\n * @return {?Selection}\n * @nosideeffects\n * @see https://w3c.github.io/selection-api/#dom-document-getselection\n */\nDocument.prototype.getSelection = function() {};\n\n/**\n * TODO(tjgq): Clean up internal usages and make this `?function(!Event): void`\n * per the spec.\n * @type {?function(?Event)}\n * @see https://w3c.github.io/selection-api/#dom-globaleventhandlers-onselectstart\n */\nElement.prototype.onselectstart;\n\n/**\n * @type {?function(!Event): void}\n * @see https://w3c.github.io/selection-api/#dom-globaleventhandlers-onselectionchange\n */\nElement.prototype.onselectionchange;\n","externs/nonstandard_selection.js":"/*\n * Copyright 2011 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Nonstandard enhancements to W3C's Selection API.\n *\n * @externs\n */\n\n// The following were sources from the webkit externs.\n\n/** @type {?Node} */\nSelection.prototype.baseNode;\n\n/** @type {number} */\nSelection.prototype.baseOffset;\n\n/** @type {?Node} */\nSelection.prototype.extentNode;\n\n/** @type {number} */\nSelection.prototype.extentOffset;\n\n/**\n * @param {string} alter\n * @param {string} direction\n * @param {string} granularity\n * @return {undefined}\n */\nSelection.prototype.modify = function(alter, direction, granularity) {};\n\n\n// The following were sources from the gecko externs.\n\n\n/**\n * @see https://developer.mozilla.org/en/DOM/Selection/selectionLanguageChange\n */\nSelection.prototype.selectionLanguageChange;\n\n\n// The following were sources from the ie externs.\n\n\n/**\n * @type {?Selection}\n * @see http://msdn.microsoft.com/en-us/library/ms535869(VS.85).aspx\n */\nDocument.prototype.selection;\n\n/**\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/ms536418(VS.85).aspx\n */\nSelection.prototype.clear = function() {};\n\n/**\n * @return {?TextRange|?ControlRange}\n * @see http://msdn.microsoft.com/en-us/library/ms536394(VS.85).aspx\n */\nSelection.prototype.createRange = function() {};\n\n/**\n * @return {?Array}\n * @see http://msdn.microsoft.com/en-us/library/ms536396(VS.85).aspx\n */\nSelection.prototype.createRangeCollection = function() {};\n","externs/w3c_trusted_types.js":"/*\n * Copyright 2018 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Trusted Types specification.\n * @see https://github.com/WICG/trusted-types\n * @externs\n */\n\n\n/** @constructor */\nfunction TrustedHTML() {}\n\n/** @constructor */\nfunction TrustedScript() {}\n\n/** @constructor */\nfunction TrustedScriptURL() {}\n\n\n/** @constructor */\nfunction TrustedTypePolicy() {}\n\n/**\n * @param {string} s\n * @return {!TrustedHTML}\n */\nTrustedTypePolicy.prototype.createHTML = function(s) {};\n\n/**\n * @param {string} s\n * @return {!TrustedScript}\n */\nTrustedTypePolicy.prototype.createScript = function(s) {};\n\n/**\n * @param {string} s\n * @return {!TrustedScriptURL}\n */\nTrustedTypePolicy.prototype.createScriptURL = function(s) {};\n\n\n/** @constructor */\nfunction TrustedTypePolicyFactory() {}\n\n/** @record @private */\nfunction TrustedTypePolicyOptions() {};\n\n/**\n *  @type {(function(string, ...*): string)|undefined},\n */\nTrustedTypePolicyOptions.prototype.createHTML;\n\n/**\n *  @type {(function(string, ...*): string)|undefined},\n */\nTrustedTypePolicyOptions.prototype.createScript;\n\n/**\n *  @type {(function(string, ...*): string)|undefined},\n */\nTrustedTypePolicyOptions.prototype.createScriptURL;\n\n\n/**\n * @param {string} name\n * @param {!TrustedTypePolicyOptions} policy\n * @return {!TrustedTypePolicy}\n */\nTrustedTypePolicyFactory.prototype.createPolicy = function(name, policy) {};\n\n\n/**\n * @param {*} obj\n * @return {boolean}\n */\nTrustedTypePolicyFactory.prototype.isHTML = function(obj) {};\n\n/**\n * @param {*} obj\n * @return {boolean}\n */\nTrustedTypePolicyFactory.prototype.isScript = function(obj) {};\n\n/**\n * @param {*} obj\n * @return {boolean}\n */\nTrustedTypePolicyFactory.prototype.isScriptURL = function(obj) {};\n\n\n/** @type {!TrustedHTML} */\nTrustedTypePolicyFactory.prototype.emptyHTML;\n\n\n/** @type {!TrustedScript} */\nTrustedTypePolicyFactory.prototype.emptyScript;\n\n\n/** @type {!TrustedTypePolicyFactory} */\nvar trustedTypes;\n","externs/w3c_dom1.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's DOM Level 1 specification.\n *  The whole file has been fully type annotated. Created from\n *  http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n *\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n */\n\n/**\n * @constructor\n * @param {string=} message\n * @param {string=} name\n * @see https://heycam.github.io/webidl/#idl-DOMException\n */\nfunction DOMException(message, name) {}\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.INDEX_SIZE_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.DOMSTRING_SIZE_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.HIERARCHY_REQUEST_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.WRONG_DOCUMENT_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.INVALID_CHARACTER_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.NO_DATA_ALLOWED_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.NO_MODIFICATION_ALLOWED_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.NOT_FOUND_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.NOT_SUPPORTED_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nDOMException.INUSE_ATTRIBUTE_ERR;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-258A00AF\n */\nfunction ExceptionCode() {}\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-102161490\n */\nfunction DOMImplementation() {}\n\n/**\n * @param {string} feature\n * @param {string} version\n * @return {boolean}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-5CED94D7\n * @nosideeffects\n */\nDOMImplementation.prototype.hasFeature = function(feature, version) {};\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nfunction Node() {}\n\n/** @override */\nNode.prototype.addEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nNode.prototype.removeEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nNode.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @type {NamedNodeMap}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-attributes\n */\nNode.prototype.attributes;\n\n/**\n * @type {!NodeList}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-childNodes\n */\nNode.prototype.childNodes;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-firstChild\n */\nNode.prototype.firstChild;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-lastChild\n */\nNode.prototype.lastChild;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-nextSibling\n */\nNode.prototype.nextSibling;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-nodeName\n */\nNode.prototype.nodeName;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-nodeValue\n */\nNode.prototype.nodeValue;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-nodeType\n */\nNode.prototype.nodeType;\n\n/**\n * @type {Document}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-ownerDocument\n */\nNode.prototype.ownerDocument;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-parentNode\n */\nNode.prototype.parentNode;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-previousSibling\n */\nNode.prototype.previousSibling;\n\n/**\n * @param {Node} newChild\n * @return {!Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-appendChild\n */\nNode.prototype.appendChild = function(newChild) {};\n\n/**\n * @param {boolean} deep\n * @return {THIS}\n * @this {THIS}\n * @template THIS\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-cloneNode\n * @nosideeffects\n */\nNode.prototype.cloneNode = function(deep) {};\n\n/**\n * @return {boolean}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-hasChildNodes\n * @nosideeffects\n */\nNode.prototype.hasChildNodes = function() {};\n\n/**\n * @param {Node} newChild\n * @param {Node} refChild\n * @return {!Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-insertBefore\n */\nNode.prototype.insertBefore = function(newChild, refChild) {};\n\n/**\n * @param {Node} oldChild\n * @return {!Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-removeChild\n */\nNode.prototype.removeChild = function(oldChild) {};\n\n/**\n * @param {Node} newChild\n * @param {Node} oldChild\n * @return {!Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-replaceChild\n */\nNode.prototype.replaceChild = function(newChild, oldChild) {};\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.ATTRIBUTE_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.CDATA_SECTION_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.COMMENT_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.DOCUMENT_FRAGMENT_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.DOCUMENT_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.DOCUMENT_TYPE_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.ELEMENT_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.ENTITY_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.ENTITY_REFERENCE_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.PROCESSING_INSTRUCTION_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.TEXT_NODE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247\n */\nNode.NOTATION_NODE;\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-B63ED1A3\n */\nfunction DocumentFragment() {}\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#i-Document\n */\nfunction Document() {}\n\n/**\n * @type {DocumentType}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-doctype\n */\nDocument.prototype.doctype;\n\n/**\n * @type {!HTMLHtmlElement}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-documentElement\n */\nDocument.prototype.documentElement;\n\n/**\n * @type {DOMImplementation}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-implementation\n */\nDocument.prototype.implementation;\n\n/**\n * @param {string} name\n * @return {!Attr}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createAttribute\n * @nosideeffects\n */\nDocument.prototype.createAttribute = function(name) {};\n\n/**\n * @param {string} data\n * @return {!Comment}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createComment\n * @nosideeffects\n */\nDocument.prototype.createComment = function(data) {};\n\n/**\n * @param {string} data\n * @return {!CDATASection}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createCDATASection\n * @nosideeffects\n */\nDocument.prototype.createCDATASection = function(data) {};\n\n/**\n * @return {!DocumentFragment}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createDocumentFragment\n * @nosideeffects\n */\nDocument.prototype.createDocumentFragment = function() {};\n\n/**\n * Create a DOM element.\n *\n * Web components introduced the second parameter as a way of extending existing\n * tags (e.g. document.createElement('button', {is: 'fancy-button'})).\n *\n * @param {string} tagName\n * @param {({is: string}|string)=} opt_typeExtension\n * @return {!Element}\n * @nosideeffects\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createElement\n * @see https://dom.spec.whatwg.org/#dom-document-createelement\n */\nDocument.prototype.createElement = function(tagName, opt_typeExtension) {};\n\n/**\n * @param {string} target\n * @param {string} data\n * @return {!ProcessingInstruction}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createProcessingInstruction\n * @nosideeffects\n */\nDocument.prototype.createProcessingInstruction = function(target, data) {};\n\n/**\n * @param {number|string} data\n * @return {!Text}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-createTextNode\n * @nosideeffects\n */\nDocument.prototype.createTextNode = function(data) {};\n\n/**\n * @param {string} tagname\n * @return {!NodeList}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-A6C9094\n * @nosideeffects\n */\nDocument.prototype.getElementsByTagName = function(tagname) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/open\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-document-open\n */\nDocument.prototype.open;\n\n/**\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-document-close\n */\nDocument.prototype.close = function() {};\n\n/**\n * @param {!TrustedHTML|string} text\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-document-write\n */\nDocument.prototype.write = function(text) {};\n\n/**\n * @param {!TrustedHTML|string} text\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-document-writeln\n */\nDocument.prototype.writeln = function(text) {};\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @template T\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-536297177\n */\nfunction NodeList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-203510337\n */\nNodeList.prototype.length;\n\n/**\n * @param {number} index\n * @return {T|null}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-844377136\n */\nNodeList.prototype.item = function(index) {};\n\n/**\n * @param {?function(this:S, T, number, !NodeList): ?} callback\n * @param {S=} opt_thisobj\n * @template S\n * @return {undefined}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach\n */\nNodeList.prototype.forEach = function(callback, opt_thisobj) {};\n\n/**\n * @constructor\n * @implements {IObject<(string|number), T>}\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @template T\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1780488922\n */\nfunction NamedNodeMap() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-6D0FB19E\n */\nNamedNodeMap.prototype.length;\n\n/**\n * @param {string} name\n * @return {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1074577549\n * @nosideeffects\n */\nNamedNodeMap.prototype.getNamedItem = function(name) {};\n\n/**\n * @param {number} index\n * @return {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-349467F9\n * @nosideeffects\n */\nNamedNodeMap.prototype.item = function(index) {};\n\n/**\n * @param {string} name\n * @return {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-D58B193\n */\nNamedNodeMap.prototype.removeNamedItem = function(name) {};\n\n/**\n * @param {Node} arg\n * @return {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1025163788\n */\nNamedNodeMap.prototype.setNamedItem = function(arg) {};\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-FF21A306\n */\nfunction CharacterData() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-72AB8359\n */\nCharacterData.prototype.data;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-7D61178C\n */\nCharacterData.prototype.length;\n\n/**\n * @param {string} arg\n * @return {undefined}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-32791A2F\n */\nCharacterData.prototype.appendData = function(arg) {};\n\n/**\n * @param {number} offset\n * @param {number} count\n * @return {undefined}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-7C603781\n */\nCharacterData.prototype.deleteData = function(offset, count) {};\n\n/**\n * @param {number} offset\n * @param {string} arg\n * @return {undefined}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-3EDB695F\n */\nCharacterData.prototype.insertData = function(offset, arg) {};\n\n/**\n * @param {number} offset\n * @param {number} count\n * @param {string} arg\n * @return {undefined}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-E5CBA7FB\n */\nCharacterData.prototype.replaceData = function(offset, count, arg) {};\n\n/**\n * @param {number} offset\n * @param {number} count\n * @return {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-6531BCCF\n * @nosideeffects\n */\nCharacterData.prototype.substringData = function(offset, count) {};\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-637646024\n */\nfunction Attr() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1112119403\n */\nAttr.prototype.name;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-862529273\n */\nAttr.prototype.specified;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-221662474\n */\nAttr.prototype.value;\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-745549614\n */\nfunction Element() {}\n\n/**\n * @type {string}\n * @implicitCast\n * @see https://dom.spec.whatwg.org/index.html#dom-element-id\n */\nElement.prototype.id;\n\n/**\n * An Element always contains a non-null NamedNodeMap containing the attributes\n * of this node.\n * @type {!NamedNodeMap}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-attributes\n */\nElement.prototype.attributes;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#attribute-tagName\n */\nElement.prototype.tagName;\n\n/**\n * @implicitCast\n * @type {?}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/className\n *    We type it as ? even though it is a string, because some SVG elements have\n *    className that is an object, which isn't a subtype of string.\n *    Alternative: TypeScript types this as string and types className on\n *    SVGElement as ?.\n */\nElement.prototype.className;\n\n/**\n * @param {string} name\n * @param {?number=} flags\n * @return {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-getAttribute\n * @see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx\n * @nosideeffects\n */\nElement.prototype.getAttribute = function(name, flags) {};\n\n/**\n * @param {string} name\n * @return {Attr}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-getAttributeNode\n * @nosideeffects\n */\nElement.prototype.getAttributeNode = function(name) {};\n\n/**\n * @param {string} tagname\n * @return {!NodeList}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1938918D\n * @nosideeffects\n */\nElement.prototype.getElementsByTagName = function(tagname) {};\n\n/**\n * @param {string} name\n * @return {undefined}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-removeAttribute\n */\nElement.prototype.removeAttribute = function(name) {};\n\n/**\n * @param {Attr} oldAttr\n * @return {?Attr}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-removeAttributeNode\n */\nElement.prototype.removeAttributeNode = function(oldAttr) {};\n\n/**\n * @param {string} name\n * @param {string|number|boolean|!TrustedHTML|!TrustedScriptURL}\n *     value Values are converted to strings with ToString, so we accept number\n *     and boolean since both convert easily to strings.\n * @return {undefined}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-setAttribute\n */\nElement.prototype.setAttribute = function(name, value) {};\n\n/**\n * @param {Attr} newAttr\n * @return {?Attr}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#method-setAttributeNode\n */\nElement.prototype.setAttributeNode = function(newAttr) {};\n\n// Event handlers\n// The DOM level 3 spec has a good index of these\n// http://www.w3.org/TR/DOM-Level-3-Events/#event-types\n\n/** @type {?function (Event)} */ Element.prototype.onabort;\n/** @type {?function (Event)} */ Element.prototype.onbeforeinput;\n/** @type {?function (Event)} */ Element.prototype.onbeforeunload;\n/** @type {?function (Event)} */ Element.prototype.onblur;\n/** @type {?function (Event)} */ Element.prototype.onchange;\n/** @type {?function (Event)} */ Element.prototype.onclick;\n/** @type {?function (Event)} */ Element.prototype.oncompositionstart;\n/** @type {?function (Event)} */ Element.prototype.oncompositionupdate;\n/** @type {?function (Event)} */ Element.prototype.oncompositionend;\n/** @type {?function (Event)} */ Element.prototype.oncontextmenu;\n/** @type {?function (Event)} */ Element.prototype.oncopy;\n/** @type {?function (Event)} */ Element.prototype.oncut;\n/** @type {?function (Event)} */ Element.prototype.ondblclick;\n/** @type {?function (Event)} */ Element.prototype.onerror;\n/** @type {?function (Event)} */ Element.prototype.onfocus;\n/** @type {?function (Event)} */ Element.prototype.onfocusin;\n/** @type {?function (Event)} */ Element.prototype.onfocusout;\n/** @type {?function (Event)} */ Element.prototype.oninput;\n/** @type {?function (Event)} */ Element.prototype.onkeydown;\n/** @type {?function (Event)} */ Element.prototype.onkeypress;\n/** @type {?function (Event)} */ Element.prototype.onkeyup;\n/** @type {?function (Event): void} */ Element.prototype.onload;\n/** @type {?function (Event): void} */ Element.prototype.onunload;\n/** @type {?function (Event)} */ Element.prototype.onmousedown;\n/** @type {?function (Event)} */ Element.prototype.onmousemove;\n/** @type {?function (Event)} */ Element.prototype.onmouseout;\n/** @type {?function (Event)} */ Element.prototype.onmouseover;\n/** @type {?function (Event)} */ Element.prototype.onmouseup;\n/** @type {?function (Event)} */ Element.prototype.onmousewheel;\n/** @type {?function (Event)} */ Element.prototype.onpaste;\n/** @type {?function (Event)} */ Element.prototype.onreset;\n/** @type {?function (Event)} */ Element.prototype.onresize;\n/** @type {?function (Event)} */ Element.prototype.onscroll;\n/** @type {?function (Event)} */ Element.prototype.onselect;\n/** @type {?function (Event=)} */ Element.prototype.onsubmit;\n/** @type {?function (Event)} */ Element.prototype.ontextinput;\n/** @type {?function (Event)} */ Element.prototype.onwheel;\n\n/**\n * @constructor\n * @extends {CharacterData}\n * @param {string=} contents Optional textual content.\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1312295772\n */\nfunction Text(contents) {}\n\n/**\n * @param {number} offset\n * @return {Text}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-38853C1D\n */\nText.prototype.splitText = function(offset) {};\n\n/**\n * @constructor\n * @extends {CharacterData}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1728279322\n */\nfunction Comment() {}\n\n/**\n * @constructor\n * @extends {Text}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-667469212\n */\nfunction CDATASection() {}\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-412266927\n */\nfunction DocumentType() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1844763134\n */\nDocumentType.prototype.name;\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1004215813\n */\nfunction ProcessingInstruction() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-837822393\n */\nProcessingInstruction.prototype.data;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1478689192\n */\nProcessingInstruction.prototype.target;\n\n\n/**\n * @constructor\n * @implements {EventTarget}\n */\nfunction Window() {}\nWindow.prototype.Window;\n\n/** @override */\nWindow.prototype.addEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nWindow.prototype.removeEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nWindow.prototype.dispatchEvent = function(evt) {};\n\n/** @type {?function (Event)} */ Window.prototype.onabort;\n/** @type {?function (Event)} */ Window.prototype.onbeforeunload;\n/** @type {?function (Event)} */ Window.prototype.onblur;\n/** @type {?function (Event)} */ Window.prototype.onchange;\n/** @type {?function (Event)} */ Window.prototype.onclick;\n/** @type {?function (Event)} */ Window.prototype.onclose;\n/** @type {?function (Event)} */ Window.prototype.oncontextmenu;\n/** @type {?function (Event)} */ Window.prototype.ondblclick;\n/** @type {?function (Event)} */ Window.prototype.ondragdrop;\n// onerror has a special signature.\n// See\n//  https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror\n/**\n * @type {?function (string, string, number, number, !Error):?}\n */\nWindow.prototype.onerror;\n/** @type {?function (Event)} */ Window.prototype.onfocus;\n/** @type {?function (Event)} */ Window.prototype.onhashchange;\n/** @type {?function (Event)} */ Window.prototype.onkeydown;\n/** @type {?function (Event)} */ Window.prototype.onkeypress;\n/** @type {?function (Event)} */ Window.prototype.onkeyup;\n/** @type {?function (Event)} */ Window.prototype.onload;\n/** @type {?function (Event)} */ Window.prototype.onmousedown;\n/** @type {?function (Event)} */ Window.prototype.onmousemove;\n/** @type {?function (Event)} */ Window.prototype.onmouseout;\n/** @type {?function (Event)} */ Window.prototype.onmouseover;\n/** @type {?function (Event)} */ Window.prototype.onmouseup;\n/** @type {?function (Event)} */ Window.prototype.onmousewheel;\n/** @type {?function (Event)} */ Window.prototype.onpaint;\n/** @type {?function (Event)} */ Window.prototype.onpopstate;\n/** @type {?function (Event)} */ Window.prototype.onreset;\n/** @type {?function (Event)} */ Window.prototype.onresize;\n/** @type {?function (Event)} */ Window.prototype.onscroll;\n/** @type {?function (Event)} */ Window.prototype.onselect;\n/** @type {?function (Event=)} */ Window.prototype.onsubmit;\n/** @type {?function (Event)} */ Window.prototype.onunhandledrejection;\n/** @type {?function (Event)} */ Window.prototype.onunload;\n/** @type {?function (Event)} */ Window.prototype.onwheel;\n","externs/w3c_dom2.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's DOM Level 2 specification.\n *  This file depends on w3c_dom1.js.\n *  The whole file has been fully type annotated.\n *  Created from\n *  http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n *\n * @externs\n */\n\n/**\n * @param {string} s id.\n * @return {Element}\n * @nosideeffects\n * @see https://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/core.html#ID-getElBId\n */\nDocument.prototype.getElementById = function(s) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} qualifiedName\n * @param {string=} opt_typeExtension\n * @return {!Element}\n * @see https://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/core.html#ID-DocCrElNS\n */\nDocument.prototype.createElementNS =\n    function(namespaceURI, qualifiedName, opt_typeExtension) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} qualifiedName\n * @return {!Attr}\n * @see https://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/core.html#ID-DocCrElNS\n */\nDocument.prototype.createAttributeNS =\n    function(namespaceURI, qualifiedName) {};\n\n/**\n * @param {Node} root\n * @param {number=} whatToShow\n * @param {NodeFilter=} filter\n * @param {boolean=} entityReferenceExpansion\n * @return {!NodeIterator}\n * @see https://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/traversal.html#Traversal-Document\n * @see https://dom.spec.whatwg.org/#interface-document\n * @nosideeffects\n */\nDocument.prototype.createNodeIterator = function(\n    root, whatToShow, filter, entityReferenceExpansion) {};\n\n/**\n * @param {Node} root\n * @param {number=} whatToShow\n * @param {NodeFilter=} filter\n * @param {boolean=} entityReferenceExpansion\n * @return {!TreeWalker}\n * @see https://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/traversal.html#Traversal-Document\n * @see https://dom.spec.whatwg.org/#interface-document\n * @nosideeffects\n */\nDocument.prototype.createTreeWalker = function(\n    root, whatToShow, filter, entityReferenceExpansion) {};\n\n/**\n * @param {string} namespace\n * @param {string} name\n * @return {!NodeList}\n * @nosideeffects\n * @see https://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/core.html#ID-getElBTNNS\n */\nDocument.prototype.getElementsByTagNameNS = function(namespace, name) {};\n\n/**\n * @param {!Node} externalNode\n * @param {boolean=} deep\n * @return {!Node}\n * @see https://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/core.html#Core-Document-importNode\n */\nDocument.prototype.importNode = function(externalNode, deep) {};\n\n/**\n * @constructor\n * @implements {IObject<(string|number),T>}\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @template T\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75708506\n */\nfunction HTMLCollection() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40057551\n */\nHTMLCollection.prototype.length;\n\n/**\n * @param {number} index\n * @return {T|null}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-33262535\n * @nosideeffects\n */\nHTMLCollection.prototype.item = function(index) {};\n\n/**\n * @param {string} name\n * @return {T|null}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-21069976\n * @nosideeffects\n */\nHTMLCollection.prototype.namedItem = function(name) {};\n\n/**\n * @constructor\n * @extends {HTMLCollection}\n * @see https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#htmloptionscollection\n */\nfunction HTMLOptionsCollection() {}\n\n/**\n * @type {number}\n * @see https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#dom-htmloptionscollection-length\n * @nosideeffects\n */\nHTMLOptionsCollection.prototype.length;\n\n/**\n * @param {HTMLOptionElement|HTMLOptGroupElement} element\n * @param {HTMLElement|number=} before\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#dom-htmloptionscollection-add\n */\nHTMLOptionsCollection.prototype.add = function(element, before) {};\n\n/**\n * NOTE(tjgq): The HTMLOptionsCollection#item method is inherited from\n * HTMLCollection, but it must be declared explicitly to work around an error\n * when building a jsinterop library for GWT.\n * @param {number} index\n * @return {HTMLOptionElement}\n * @override\n * @nosideeffects\n */\nHTMLOptionsCollection.prototype.item = function(index) {};\n\n/**\n * @param {number} index\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#dom-htmloptionscollection-remove\n */\nHTMLOptionsCollection.prototype.remove = function(index) {};\n\n/**\n * @constructor\n * @extends {Document}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-26809268\n */\nfunction HTMLDocument() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-18446827\n */\nHTMLDocument.prototype.title;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-95229140\n */\nHTMLDocument.prototype.referrer;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-2250147\n */\nHTMLDocument.prototype.domain;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-46183437\n */\nHTMLDocument.prototype.URL;\n\n/**\n * @type {!HTMLBodyElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-56360201\n */\nHTMLDocument.prototype.body;\n\n/**\n * @type {!HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-90379117\n */\nHTMLDocument.prototype.images;\n\n/**\n * @type {!HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-85113862\n */\nHTMLDocument.prototype.applets;\n\n/**\n * @type {!HTMLCollection<(!HTMLAnchorElement|!HTMLAreaElement)>}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-7068919\n */\nHTMLDocument.prototype.links;\n\n/**\n * @type {!HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-1689064\n */\nHTMLDocument.prototype.forms;\n\n/**\n * @type {!HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-7577272\n */\nHTMLDocument.prototype.anchors;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-8747038\n */\nHTMLDocument.prototype.cookie;\n\n/**\n * @param {string=} opt_mimeType\n * @param {string=} opt_replace\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-72161170\n * Even though official spec says \"no parameters\" some old browsers might take\n * optional parameters: https://msdn.microsoft.com/en-us/library/ms536652(v=vs.85).aspx\n * @override\n */\nHTMLDocument.prototype.open = function(opt_mimeType, opt_replace) {};\n\n/**\n * @param {string} elementName\n * @return {!NodeList}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-71555259\n * @nosideeffects\n */\nHTMLDocument.prototype.getElementsByName = function(elementName) {};\n\n\n/** @typedef {{\n  createNodeIterator: function(Node, number=, NodeFilter=, boolean=) : NodeIterator,\n  createTreeWalker: function(Node, number=, NodeFilter=, boolean=) : TreeWalker\n}} */\nvar TraversalDocument;\n\n/**\n * @record\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeFilter\n*/\nfunction NodeFilter() {}\n\n/* Constants for whatToShow */\n/** @const {number} */ NodeFilter.SHOW_ALL;\n/** @const {number} */ NodeFilter.SHOW_ATTRIBUTE;\n/** @const {number} */ NodeFilter.SHOW_CDATA_SECTION;\n/** @const {number} */ NodeFilter.SHOW_COMMENT;\n/** @const {number} */ NodeFilter.SHOW_DOCUMENT;\n/** @const {number} */ NodeFilter.SHOW_DOCUMENT_FRAGMENT;\n/** @const {number} */ NodeFilter.SHOW_DOCUMENT_TYPE;\n/** @const {number} */ NodeFilter.SHOW_ELEMENT;\n/** @const {number} */ NodeFilter.SHOW_ENTITY;\n/** @const {number} */ NodeFilter.SHOW_ENTITY_REFERENCE;\n/** @const {number} */ NodeFilter.SHOW_NOTATION;\n/** @const {number} */ NodeFilter.SHOW_PROCESSING_INSTRUCTION;\n/** @const {number} */ NodeFilter.SHOW_TEXT;\n\n/* Consants for acceptNode */\n/** @const {number} */ NodeFilter.FILTER_ACCEPT;\n/** @const {number} */ NodeFilter.FILTER_REJECT;\n/** @const {number} */ NodeFilter.FILTER_SKIP;\n\n/**\n * @param {Node} n\n * @return {number} Any of NodeFilter.FILTER_* constants.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeFilter-acceptNode\n*/\nNodeFilter.prototype.acceptNode = function(n) {};\n\n/**\n * @interface\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeIterator\n*/\nfunction NodeIterator() {}\n\n/**\n * Detach and invalidate the NodeIterator.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeIterator-detach\n * @return {undefined}\n */\nNodeIterator.prototype.detach = function() {};\n\n/**\n * @return {Node} Next node in the set.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeIterator-nextNode\n */\nNodeIterator.prototype.nextNode = function() {};\n\n/**\n * @return {Node} Previous node in the set.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-NodeIterator-previousNode\n */\nNodeIterator.prototype.previousNode = function() {};\n\n/**\n * @interface\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker\n*/\nfunction TreeWalker() {}\n\n/**\n * @return {?Node} The new Node or null.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-firstChild\n */\nTreeWalker.prototype.firstChild = function() {};\n\n/**\n * @return {?Node} The new Node or null..\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-lastChild\n */\nTreeWalker.prototype.lastChild = function() {};\n\n/**\n * @return {?Node} The new Node or null.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-nextNode\n */\nTreeWalker.prototype.nextNode = function() {};\n\n/**\n * @return {?Node} The new Node or null.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-nextSibling\n */\nTreeWalker.prototype.nextSibling = function() {};\n\n/**\n * @return {?Node} The new Node or null.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-parentNode\n */\nTreeWalker.prototype.parentNode = function() {};\n\n/**\n * @return {?Node} The new Node or null.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-previousNode\n */\nTreeWalker.prototype.previousNode = function() {};\n\n/**\n * @return {?Node} The new Node or null.\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html#Traversal-TreeWalker-previousSibling\n */\nTreeWalker.prototype.previousSibling = function() {};\n\n/**\n * @type {Node}\n */\nTreeWalker.prototype.root;\n\n/**\n * @type {number}\n */\nTreeWalker.prototype.whatToShow;\n\n/**\n * @type {NodeFilter}\n */\nTreeWalker.prototype.filter;\n\n/**\n * @type {boolean}\n */\nTreeWalker.prototype.expandEntityReference;\n\n/**\n * @type {Node}\n */\nTreeWalker.prototype.currentNode;\n\n/**\n * @constructor\n * @extends {Element}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58190037\n */\nfunction HTMLElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-78276800\n */\nHTMLElement.prototype.title;\n\n/**\n * @type {!CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-ElementCSSInlineStyle\n */\nHTMLElement.prototype.style;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-59132807\n */\nHTMLElement.prototype.lang;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-52460740\n */\nHTMLElement.prototype.dir;\n\n/**\n * @implicitCast\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-95362176\n */\nHTMLElement.prototype.className;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40676705\n */\nHTMLElement.prototype.tabIndex;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-33759296\n */\nfunction HTMLHtmlElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-9383775\n */\nHTMLHtmlElement.prototype.version;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77253168\n */\nfunction HTMLHeadElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96921909\n */\nHTMLHeadElement.prototype.profile;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @implements {LinkStyle}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-35143001\n */\nfunction HTMLLinkElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87355129\n */\nHTMLLinkElement.prototype.disabled;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-63954491\n */\nHTMLLinkElement.prototype.charset;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-33532588\n */\nHTMLLinkElement.prototype.href;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-85145682\n */\nHTMLLinkElement.prototype.hreflang;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75813125\n */\nHTMLLinkElement.prototype.media;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-41369587\n */\nHTMLLinkElement.prototype.rel;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40715461\n */\nHTMLLinkElement.prototype.rev;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-84183095\n */\nHTMLLinkElement.prototype.target;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-32498296\n */\nHTMLLinkElement.prototype.type;\n\n/** @type {StyleSheet} */\nHTMLLinkElement.prototype.sheet;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79243169\n */\nfunction HTMLTitleElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77500413\n */\nHTMLTitleElement.prototype.text;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-37041454\n */\nfunction HTMLMetaElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87670826\n */\nHTMLMetaElement.prototype.content;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77289449\n */\nHTMLMetaElement.prototype.httpEquiv;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-31037081\n */\nHTMLMetaElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-35993789\n */\nHTMLMetaElement.prototype.scheme;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-73629039\n */\nfunction HTMLBaseElement() {}\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-65382887\n */\nHTMLBaseElement.prototype.href;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-73844298\n */\nHTMLBaseElement.prototype.target;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-85283003\n */\nfunction HTMLIsIndexElement() {}\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87069980\n */\nHTMLIsIndexElement.prototype.form;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-33589862\n */\nHTMLIsIndexElement.prototype.prompt;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @implements {LinkStyle}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-16428977\n */\nfunction HTMLStyleElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-51162010\n */\nHTMLStyleElement.prototype.disabled;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-76412738\n */\nHTMLStyleElement.prototype.media;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-22472002\n */\nHTMLStyleElement.prototype.type;\n\n/** @type {StyleSheet} */\nHTMLStyleElement.prototype.sheet;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-62018039\n */\nfunction HTMLBodyElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-59424581\n */\nHTMLBodyElement.prototype.aLink;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-37574810\n */\nHTMLBodyElement.prototype.background;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-24940084\n */\nHTMLBodyElement.prototype.bgColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-7662206\n */\nHTMLBodyElement.prototype.link;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-73714763\n */\nHTMLBodyElement.prototype.text;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-83224305\n */\nHTMLBodyElement.prototype.vLink;\n\n/**\n * @constructor\n * @extends {HTMLCollection}\n * @implements {IObject)>}\n * @implements {IArrayLike}\n * @template T\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#the-htmlformcontrolscollection-interface\n */\nfunction HTMLFormControlsCollection() {}\n\n/**\n * @param {string} name\n * @return {T|RadioNodeList|null}\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#dom-htmlformcontrolscollection-nameditem\n * @nosideeffects\n * @override\n */\nHTMLFormControlsCollection.prototype.namedItem = function(name) {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40002357\n */\nfunction HTMLFormElement() {}\n\n/**\n * @type {!HTMLFormControlsCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-76728479\n */\nHTMLFormElement.prototype.elements;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#HTML-HTMLFormElement-length\n */\nHTMLFormElement.prototype.length;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-22051454\n */\nHTMLFormElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-19661795\n */\nHTMLFormElement.prototype.acceptCharset;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-74049184\n */\nHTMLFormElement.prototype.action;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-84227810\n */\nHTMLFormElement.prototype.enctype;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-82545539\n */\nHTMLFormElement.prototype.method;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6512890\n */\nHTMLFormElement.prototype.target;\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-76767676\n */\nHTMLFormElement.prototype.submit = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-76767677\n */\nHTMLFormElement.prototype.reset = function() {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-94282980\n */\nfunction HTMLSelectElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58783172\n */\nHTMLSelectElement.prototype.type;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-85676760\n */\nHTMLSelectElement.prototype.selectedIndex;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-59351919\n */\nHTMLSelectElement.prototype.value;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-5933486\n */\nHTMLSelectElement.prototype.length;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-20489458\n */\nHTMLSelectElement.prototype.form;\n\n/**\n * @type {!HTMLOptionsCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-30606413\n */\nHTMLSelectElement.prototype.options;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79102918\n */\nHTMLSelectElement.prototype.disabled;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-13246613\n */\nHTMLSelectElement.prototype.multiple;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-41636323\n */\nHTMLSelectElement.prototype.name;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-18293826\n */\nHTMLSelectElement.prototype.size;\n\n/**\n * @param {HTMLElement} element\n * @param {HTMLElement=} opt_before\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-14493106\n */\nHTMLSelectElement.prototype.add = function(element, opt_before) {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-28216144\n * @override\n */\nHTMLSelectElement.prototype.blur = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-32130014\n * @override\n */\nHTMLSelectElement.prototype.focus = function() {};\n\n/**\n * @param {number=} opt_index\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-33404570\n * @override\n */\nHTMLSelectElement.prototype.remove = function(opt_index) {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-38450247\n */\nfunction HTMLOptGroupElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-15518803\n */\nHTMLOptGroupElement.prototype.disabled;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-95806054\n */\nHTMLOptGroupElement.prototype.label;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70901257\n */\nfunction HTMLOptionElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-37770574\n */\nHTMLOptionElement.prototype.defaultSelected;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-23482473\n */\nHTMLOptionElement.prototype.disabled;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-17116503\n */\nHTMLOptionElement.prototype.form;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-14038413\n */\nHTMLOptionElement.prototype.index;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40736115\n */\nHTMLOptionElement.prototype.label;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70874476\n */\nHTMLOptionElement.prototype.selected;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-48154426\n */\nHTMLOptionElement.prototype.text;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6185554\n */\nHTMLOptionElement.prototype.value;\n\n\n\n/**\n * @constructor\n * @extends {HTMLOptionElement}\n * @param {*=} opt_text\n * @param {*=} opt_value\n * @param {*=} opt_defaultSelected\n * @param {*=} opt_selected\n */\nfunction Option(opt_text, opt_value, opt_defaultSelected, opt_selected) {}\n\n\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6043025\n */\nfunction HTMLInputElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-15328520\n */\nHTMLInputElement.prototype.accept;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-59914154\n */\nHTMLInputElement.prototype.accessKey;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96991182\n */\nHTMLInputElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-92701314\n */\nHTMLInputElement.prototype.alt;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-30233917\n */\nHTMLInputElement.prototype.checked;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-20509171\n */\nHTMLInputElement.prototype.defaultChecked;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-26091157\n */\nHTMLInputElement.prototype.defaultValue;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-50886781\n */\nHTMLInputElement.prototype.disabled;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-63239895\n */\nHTMLInputElement.prototype.form;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-54719353\n */\nHTMLInputElement.prototype.maxLength;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-89658498\n */\nHTMLInputElement.prototype.name;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-88461592\n */\nHTMLInputElement.prototype.readOnly;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79659438\n */\nHTMLInputElement.prototype.size;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-97320704\n */\nHTMLInputElement.prototype.src;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-62176355\n */\nHTMLInputElement.prototype.tabIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-62883744\n */\nHTMLInputElement.prototype.type;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-32463706\n */\nHTMLInputElement.prototype.useMap;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-49531485\n */\nHTMLInputElement.prototype.value;\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-26838235\n * @override\n */\nHTMLInputElement.prototype.blur = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-2651361\n * @override\n */\nHTMLInputElement.prototype.click = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-65996295\n * @override\n */\nHTMLInputElement.prototype.focus = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-34677168\n */\nHTMLInputElement.prototype.select = function() {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-24874179\n */\nfunction HTMLTextAreaElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-93102991\n */\nHTMLTextAreaElement.prototype.accessKey;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-51387225\n */\nHTMLTextAreaElement.prototype.cols;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-36152213\n */\nHTMLTextAreaElement.prototype.defaultValue;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-98725443\n */\nHTMLTextAreaElement.prototype.disabled;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-18911464\n */\nHTMLTextAreaElement.prototype.form;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70715578\n */\nHTMLTextAreaElement.prototype.name;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-39131423\n */\nHTMLTextAreaElement.prototype.readOnly;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-46975887\n */\nHTMLTextAreaElement.prototype.rows;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-60363303\n */\nHTMLTextAreaElement.prototype.tabIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#HTML-HTMLTextAreaElement-type\n */\nHTMLTextAreaElement.prototype.type;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70715579\n */\nHTMLTextAreaElement.prototype.value;\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6750689\n * @override\n */\nHTMLTextAreaElement.prototype.blur = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-39055426\n * @override\n */\nHTMLTextAreaElement.prototype.focus = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-48880622\n */\nHTMLTextAreaElement.prototype.select = function() {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-34812697\n */\nfunction HTMLButtonElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-73169431\n */\nHTMLButtonElement.prototype.accessKey;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-92757155\n */\nHTMLButtonElement.prototype.disabled;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-71254493\n */\nHTMLButtonElement.prototype.form;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-11029910\n */\nHTMLButtonElement.prototype.name;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-39190908\n */\nHTMLButtonElement.prototype.tabIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-27430092\n */\nHTMLButtonElement.prototype.type;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-72856782\n */\nHTMLButtonElement.prototype.value;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-13691394\n */\nfunction HTMLLabelElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-43589892\n */\nHTMLLabelElement.prototype.accessKey;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-32480901\n */\nHTMLLabelElement.prototype.form;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96509813\n */\nHTMLLabelElement.prototype.htmlFor;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-7365882\n */\nfunction HTMLFieldSetElement() {}\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75392630\n */\nHTMLFieldSetElement.prototype.form;\n\n/**\n * @type {boolean}\n * @see https://www.w3.org/TR/html5/forms.html#attr-fieldset-disabled\n */\nHTMLFieldSetElement.prototype.disabled;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-21482039\n */\nfunction HTMLLegendElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-11297832\n */\nHTMLLegendElement.prototype.accessKey;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79538067\n */\nHTMLLegendElement.prototype.align;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-29594519\n */\nHTMLLegendElement.prototype.form;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-86834457\n */\nfunction HTMLUListElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-39864178\n */\nHTMLUListElement.prototype.compact;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96874670\n */\nHTMLUListElement.prototype.type;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58056027\n */\nfunction HTMLOListElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-76448506\n */\nHTMLOListElement.prototype.compact;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-14793325\n */\nHTMLOListElement.prototype.start;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40971103\n */\nHTMLOListElement.prototype.type;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-52368974\n */\nfunction HTMLDListElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-21738539\n */\nHTMLDListElement.prototype.compact;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-71600284\n */\nfunction HTMLDirectoryElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75317739\n */\nHTMLDirectoryElement.prototype.compact;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-72509186\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#the-menu-element\n */\nfunction HTMLMenuElement() {}\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-68436464\n */\nHTMLMenuElement.prototype.compact;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-74680021\n */\nfunction HTMLLIElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-52387668\n */\nHTMLLIElement.prototype.type;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-45496263\n */\nHTMLLIElement.prototype.value;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-22445964\n */\nfunction HTMLDivElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70908791\n */\nHTMLDivElement.prototype.align;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-84675076\n */\nfunction HTMLParagraphElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-53465507\n */\nHTMLParagraphElement.prototype.align;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-43345119\n */\nfunction HTMLHeadingElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6796462\n */\nHTMLHeadingElement.prototype.align;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70319763\n */\nfunction HTMLQuoteElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-53895598\n */\nHTMLQuoteElement.prototype.cite;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-11383425\n */\nfunction HTMLPreElement() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-13894083\n */\nHTMLPreElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-56836063\n */\nfunction HTMLBRElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-82703081\n */\nHTMLBRElement.prototype.clear;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-32774408\n */\nfunction HTMLBaseFontElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87502302\n */\nHTMLBaseFontElement.prototype.color;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-88128969\n */\nHTMLBaseFontElement.prototype.face;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-38930424\n */\nHTMLBaseFontElement.prototype.size;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-43943847\n */\nfunction HTMLFontElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-53532975\n */\nHTMLFontElement.prototype.color;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-55715655\n */\nHTMLFontElement.prototype.face;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-90127284\n */\nHTMLFontElement.prototype.size;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-68228811\n */\nfunction HTMLHRElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-15235012\n */\nHTMLHRElement.prototype.align;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79813978\n */\nHTMLHRElement.prototype.noShade;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77612587\n */\nHTMLHRElement.prototype.size;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87744198\n */\nHTMLHRElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79359609\n */\nfunction HTMLModElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75101708\n */\nHTMLModElement.prototype.cite;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-88432678\n */\nHTMLModElement.prototype.dateTime;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-48250443\n */\nfunction HTMLAnchorElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-89647724\n */\nHTMLAnchorElement.prototype.accessKey;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-67619266\n */\nHTMLAnchorElement.prototype.charset;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-92079539\n */\nHTMLAnchorElement.prototype.coords;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-88517319\n */\nHTMLAnchorElement.prototype.href;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87358513\n */\nHTMLAnchorElement.prototype.hreflang;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-32783304\n */\nHTMLAnchorElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-3815891\n */\nHTMLAnchorElement.prototype.rel;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58259771\n */\nHTMLAnchorElement.prototype.rev;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-49899808\n */\nHTMLAnchorElement.prototype.shape;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-41586466\n */\nHTMLAnchorElement.prototype.tabIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6414197\n */\nHTMLAnchorElement.prototype.target;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-63938221\n */\nHTMLAnchorElement.prototype.type;\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-65068939\n * @override\n */\nHTMLAnchorElement.prototype.blur = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-47150313\n * @override\n */\nHTMLAnchorElement.prototype.focus = function() {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-17701901\n */\nfunction HTMLImageElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-3211094\n */\nHTMLImageElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-95636861\n */\nHTMLImageElement.prototype.alt;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-136671\n */\nHTMLImageElement.prototype.border;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-91561496\n */\nHTMLImageElement.prototype.height;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-53675471\n */\nHTMLImageElement.prototype.hspace;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58983880\n */\nHTMLImageElement.prototype.isMap;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77376969\n */\nHTMLImageElement.prototype.longDesc;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-91256910\n */\nHTMLImageElement.prototype.lowSrc;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-47534097\n */\nHTMLImageElement.prototype.name;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-87762984\n */\nHTMLImageElement.prototype.src;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-35981181\n */\nHTMLImageElement.prototype.useMap;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-85374897\n */\nHTMLImageElement.prototype.vspace;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-13839076\n */\nHTMLImageElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-9893177\n */\nfunction HTMLObjectElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-16962097\n */\nHTMLObjectElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-47783837\n */\nHTMLObjectElement.prototype.archive;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-82818419\n */\nHTMLObjectElement.prototype.border;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75241146\n */\nHTMLObjectElement.prototype.code;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-25709136\n */\nHTMLObjectElement.prototype.codeBase;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-19945008\n */\nHTMLObjectElement.prototype.codeType;\n\n/**\n * @type {Document}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-38538621\n */\nHTMLObjectElement.prototype.contentDocument;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-81766986\n */\nHTMLObjectElement.prototype.data;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-942770\n */\nHTMLObjectElement.prototype.declare;\n\n/**\n * @type {HTMLFormElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-46094773\n */\nHTMLObjectElement.prototype.form;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-88925838\n */\nHTMLObjectElement.prototype.height;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-17085376\n */\nHTMLObjectElement.prototype.hspace;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-20110362\n */\nHTMLObjectElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-25039673\n */\nHTMLObjectElement.prototype.standby;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-27083787\n */\nHTMLObjectElement.prototype.tabIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-91665621\n */\nHTMLObjectElement.prototype.type;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6649772\n */\nHTMLObjectElement.prototype.useMap;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-8682483\n */\nHTMLObjectElement.prototype.vspace;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-38538620\n */\nHTMLObjectElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-64077273\n */\nfunction HTMLParamElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-59871447\n */\nHTMLParamElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-18179888\n */\nHTMLParamElement.prototype.type;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77971357\n */\nHTMLParamElement.prototype.value;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-23931872\n */\nHTMLParamElement.prototype.valueType;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-31006348\n */\nfunction HTMLAppletElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-8049912\n */\nHTMLAppletElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58610064\n */\nHTMLAppletElement.prototype.alt;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-14476360\n */\nHTMLAppletElement.prototype.archive;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-61509645\n */\nHTMLAppletElement.prototype.code;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6581160\n */\nHTMLAppletElement.prototype.codeBase;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-90184867\n */\nHTMLAppletElement.prototype.height;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-1567197\n */\nHTMLAppletElement.prototype.hspace;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-39843695\n */\nHTMLAppletElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-93681523\n */\nHTMLAppletElement.prototype.object;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-22637173\n */\nHTMLAppletElement.prototype.vspace;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-16526327\n */\nHTMLAppletElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-94109203\n */\nfunction HTMLMapElement() {}\n\n/**\n * @type {HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-71838730\n */\nHTMLMapElement.prototype.areas;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-52696514\n */\nHTMLMapElement.prototype.name;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-26019118\n */\nfunction HTMLAreaElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-57944457\n */\nHTMLAreaElement.prototype.accessKey;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-39775416\n */\nHTMLAreaElement.prototype.alt;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-66021476\n */\nHTMLAreaElement.prototype.coords;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-34672936\n */\nHTMLAreaElement.prototype.href;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-61826871\n */\nHTMLAreaElement.prototype.noHref;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-85683271\n */\nHTMLAreaElement.prototype.shape;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-8722121\n */\nHTMLAreaElement.prototype.tabIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-46054682\n */\nHTMLAreaElement.prototype.target;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-81598695\n */\nfunction HTMLScriptElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-35305677\n */\nHTMLScriptElement.prototype.charset;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-93788534\n */\nHTMLScriptElement.prototype.defer;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-56700403\n */\nHTMLScriptElement.prototype.event;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-66979266\n */\nHTMLScriptElement.prototype.htmlFor;\n\n/**\n * @type {?function(!Event)}\n */\nHTMLScriptElement.prototype.onreadystatechange;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-75147231\n */\nHTMLScriptElement.prototype.src;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-46872999\n */\nHTMLScriptElement.prototype.text;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-30534818\n */\nHTMLScriptElement.prototype.type;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-64060425\n */\nfunction HTMLTableElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-23180977\n */\nHTMLTableElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-83532985\n */\nHTMLTableElement.prototype.bgColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-50969400\n */\nHTMLTableElement.prototype.border;\n\n/**\n * @type {HTMLTableCaptionElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-14594520\n */\nHTMLTableElement.prototype.caption;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-59162158\n */\nHTMLTableElement.prototype.cellPadding;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-68907883\n */\nHTMLTableElement.prototype.cellSpacing;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-64808476\n */\nHTMLTableElement.prototype.frame;\n\n/**\n * @type {HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6156016\n */\nHTMLTableElement.prototype.rows;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-26347553\n */\nHTMLTableElement.prototype.rules;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-44998528\n */\nHTMLTableElement.prototype.summary;\n\n/**\n * @type {HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-63206416\n */\nHTMLTableElement.prototype.tBodies;\n\n/**\n * @type {HTMLTableSectionElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-64197097\n */\nHTMLTableElement.prototype.tFoot;\n\n/**\n * @type {HTMLTableSectionElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-9530944\n */\nHTMLTableElement.prototype.tHead;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-77447361\n */\nHTMLTableElement.prototype.width;\n\n/**\n * @return {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96920263\n */\nHTMLTableElement.prototype.createCaption = function() {};\n\n/**\n * @return {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-8453710\n */\nHTMLTableElement.prototype.createTFoot = function() {};\n\n/**\n * @return {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70313345\n */\nHTMLTableElement.prototype.createTHead = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-22930071\n */\nHTMLTableElement.prototype.deleteCaption = function() {};\n\n/**\n * @param {number} index\n * @return {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-13114938\n */\nHTMLTableElement.prototype.deleteRow = function(index) {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-78363258\n */\nHTMLTableElement.prototype.deleteTFoot = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-38310198\n */\nHTMLTableElement.prototype.deleteTHead = function() {};\n\n/**\n * @param {number=} opt_index\n * @return {HTMLElement}\n * @see https://www.w3.org/TR/html5/tabular-data.html#htmltableelement\n */\nHTMLTableElement.prototype.insertRow = function(opt_index) {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-12035137\n */\nfunction HTMLTableCaptionElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79875068\n */\nHTMLTableCaptionElement.prototype.align;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-84150186\n */\nfunction HTMLTableColElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-31128447\n */\nHTMLTableColElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-9447412\n */\nHTMLTableColElement.prototype.ch;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-57779225\n */\nHTMLTableColElement.prototype.chOff;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96511335\n */\nHTMLTableColElement.prototype.span;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-83291710\n */\nHTMLTableColElement.prototype.vAlign;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-25196799\n */\nHTMLTableColElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-67417573\n */\nfunction HTMLTableSectionElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-40530119\n */\nHTMLTableSectionElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-83470012\n */\nHTMLTableSectionElement.prototype.ch;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-53459732\n */\nHTMLTableSectionElement.prototype.chOff;\n\n/**\n * @type {HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-52092650\n */\nHTMLTableSectionElement.prototype.rows;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-4379116\n */\nHTMLTableSectionElement.prototype.vAlign;\n\n/**\n * @param {number} index\n * @return {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-5625626\n */\nHTMLTableSectionElement.prototype.deleteRow = function(index) {};\n\n/**\n * @param {number=} opt_index\n * @return {HTMLElement}\n * @see https://www.w3.org/TR/html5/tabular-data.html#htmltablesectionelement\n */\nHTMLTableSectionElement.prototype.insertRow = function(opt_index) {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-6986576\n */\nfunction HTMLTableRowElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-74098257\n */\nHTMLTableRowElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-18161327\n */\nHTMLTableRowElement.prototype.bgColor;\n\n/**\n * @type {HTMLCollection}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-67349879\n */\nHTMLTableRowElement.prototype.cells;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-16230502\n */\nHTMLTableRowElement.prototype.ch;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-68207461\n */\nHTMLTableRowElement.prototype.chOff;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-67347567\n */\nHTMLTableRowElement.prototype.rowIndex;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-79105901\n */\nHTMLTableRowElement.prototype.sectionRowIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-90000058\n */\nHTMLTableRowElement.prototype.vAlign;\n\n/**\n * @param {number} index\n * @return {undefined}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-11738598\n */\nHTMLTableRowElement.prototype.deleteCell = function(index) {};\n\n/**\n * @param {number} index\n * @return {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-68927016\n */\nHTMLTableRowElement.prototype.insertCell = function(index) {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-82915075\n */\nfunction HTMLTableCellElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-74444037\n */\nHTMLTableCellElement.prototype.abbr;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-98433879\n */\nHTMLTableCellElement.prototype.align;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-76554418\n */\nHTMLTableCellElement.prototype.axis;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-88135431\n */\nHTMLTableCellElement.prototype.bgColor;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-80748363\n */\nHTMLTableCellElement.prototype.cellIndex;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-30914780\n */\nHTMLTableCellElement.prototype.ch;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-20144310\n */\nHTMLTableCellElement.prototype.chOff;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-84645244\n */\nHTMLTableCellElement.prototype.colSpan;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-89104817\n */\nHTMLTableCellElement.prototype.headers;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-83679212\n */\nHTMLTableCellElement.prototype.height;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-62922045\n */\nHTMLTableCellElement.prototype.noWrap;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-48237625\n */\nHTMLTableCellElement.prototype.rowSpan;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-36139952\n */\nHTMLTableCellElement.prototype.scope;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-58284221\n */\nHTMLTableCellElement.prototype.vAlign;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-27480795\n */\nHTMLTableCellElement.prototype.width;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-43829095\n */\nfunction HTMLFrameSetElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-98869594\n */\nHTMLFrameSetElement.prototype.cols;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-19739247\n */\nHTMLFrameSetElement.prototype.rows;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-97790553\n */\nfunction HTMLFrameElement() {}\n\n/**\n * @type {Document}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-78799536\n */\nHTMLFrameElement.prototype.contentDocument;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-11858633\n */\nHTMLFrameElement.prototype.frameBorder;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-7836998\n */\nHTMLFrameElement.prototype.longDesc;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-55569778\n */\nHTMLFrameElement.prototype.marginHeight;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-8369969\n */\nHTMLFrameElement.prototype.marginWidth;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-91128709\n */\nHTMLFrameElement.prototype.name;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-80766578\n */\nHTMLFrameElement.prototype.noResize;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-45411424\n */\nHTMLFrameElement.prototype.scrolling;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-78799535\n */\nHTMLFrameElement.prototype.src;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-50708718\n */\nfunction HTMLIFrameElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-11309947\n */\nHTMLIFrameElement.prototype.align;\n\n/**\n * @type {Document}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-67133006\n */\nHTMLIFrameElement.prototype.contentDocument;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-22463410\n */\nHTMLIFrameElement.prototype.frameBorder;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-1678118\n */\nHTMLIFrameElement.prototype.height;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-70472105\n */\nHTMLIFrameElement.prototype.longDesc;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-91371294\n */\nHTMLIFrameElement.prototype.marginHeight;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-66486595\n */\nHTMLIFrameElement.prototype.marginWidth;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-96819659\n */\nHTMLIFrameElement.prototype.name;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-36369822\n */\nHTMLIFrameElement.prototype.scrolling;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-43933957\n */\nHTMLIFrameElement.prototype.src;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-67133005\n */\nHTMLIFrameElement.prototype.width;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-258A00AF\n */\nDOMException.INVALID_STATE_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-258A00AF\n */\nDOMException.SYNTAX_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-258A00AF\n */\nDOMException.INVALID_MODIFICATION_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-258A00AF\n */\nDOMException.NAMESPACE_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-258A00AF\n */\nDOMException.INVALID_ACCESS_ERR;\n/**\n * @type {boolean}\n * @see https://developer.mozilla.org/en/DOM/window.closed\n */\nWindow.prototype.closed;\n\n/**\n * @type {HTMLObjectElement|HTMLIFrameElement|null}\n * @see https://developer.mozilla.org/en/DOM/window.frameElement\n */\nWindow.prototype.frameElement;\n\n/**\n * Allows lookup of frames by index or by name.\n * @type {!Window}\n * @see https://developer.mozilla.org/en/DOM/window.frames\n */\nWindow.prototype.frames;\n\n/**\n * @type {!History}\n * @suppress {duplicate}\n * @see https://developer.mozilla.org/en/DOM/window.history\n */\nvar history;\n\n/**\n * @type {!History}\n * @see https://developer.mozilla.org/en/DOM/window.history\n */\nWindow.prototype.history;\n\n/**\n * Returns the number of frames (either frame or iframe elements) in the\n * window.\n *\n * @type {number}\n * @see https://developer.mozilla.org/en/DOM/window.length\n */\nWindow.prototype.length;\n\n/**\n * Location has an exception in the DeclaredGlobalExternsOnWindow pass\n * so we have to manually include it:\n * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/DeclaredGlobalExternsOnWindow.java#L116\n *\n * @type {!Location}\n * @implicitCast\n * @see https://developer.mozilla.org/en/DOM/window.location\n */\nWindow.prototype.location;\n\n/**\n\n * @type {string}\n * @see https://developer.mozilla.org/en/DOM/window.name\n */\nWindow.prototype.name;\n\n/**\n * @type {Navigator}\n * @see https://developer.mozilla.org/en/DOM/window.navigator\n */\nWindow.prototype.navigator;\n\n/**\n * @type {?Window}\n * @see https://developer.mozilla.org/en/DOM/window.opener\n */\nWindow.prototype.opener;\n\n/**\n * @type {!Window}\n * @see https://developer.mozilla.org/en/DOM/window.parent\n */\nWindow.prototype.parent;\n\n/**\n * @type {!Window}\n * @see https://developer.mozilla.org/en/DOM/window.self\n */\nWindow.prototype.self;\n\n/**\n * @type {?string}\n * @see https://developer.mozilla.org/en/DOM/window.status\n */\nWindow.prototype.status;\n\n/**\n * @interface\n * @see https://html.spec.whatwg.org/multipage/window-object.html#the-status-bar-barprop-object\n */\nfunction BarProp() {}\n\n/** @const {boolean} */\nBarProp.prototype.visible;\n\n/**\n * @type {!BarProp}\n * @see https://developer.mozilla.org/en/DOM/window.locationbar\n */\nWindow.prototype.locationbar;\n\n/**\n * @type {!BarProp}\n * @see https://developer.mozilla.org/en/DOM/window.menubar\n */\nWindow.prototype.menubar;\n\n/**\n * @type {!BarProp}\n * @see https://developer.mozilla.org/en/DOM/window.personalbar\n */\nWindow.prototype.personalbar;\n\n\n/**\n * @type {!BarProp}\n * @see https://developer.mozilla.org/en/DOM/window.scrollbars\n */\nWindow.prototype.scrollbars;\n\n/**\n * @type {!BarProp}\n * @see https://developer.mozilla.org/en/DOM/window.statusbar\n */\nWindow.prototype.statusbar;\n\n/**\n * @type {!BarProp}\n * @see https://developer.mozilla.org/en/DOM/window.toolbar\n */\nWindow.prototype.toolbar;\n\n/**\n * @type {!Window}\n * @see https://developer.mozilla.org/en/DOM/window.self\n */\nWindow.prototype.top;\n\n/**\n * @type {!Window}\n * @see https://developer.mozilla.org/en/DOM/window.self\n */\nWindow.prototype.window;\n\n/**\n * @param {*} message\n * @see https://developer.mozilla.org/en/DOM/window.alert\n * @return {undefined}\n */\nWindow.prototype.alert = function(message) {};\n\n/**\n * @param {*} message\n * @return {boolean}\n * @see https://developer.mozilla.org/en/DOM/window.confirm\n */\nWindow.prototype.confirm = function(message) {};\n\n/**\n * @param {string} message\n * @param {string=} value\n * @return {?string}\n * @see https://developer.mozilla.org/en/DOM/window.prompt\n */\nWindow.prototype.prompt = function(message, value) {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.blur\n * @return {undefined}\n */\nWindow.prototype.blur = function() {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.close\n * @return {undefined}\n */\nWindow.prototype.close = function() {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.focus\n * @return {undefined}\n */\nWindow.prototype.focus = function() {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/print\n * @return {undefined}\n */\nWindow.prototype.print = function() {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/stop\n * @return {undefined}\n */\nWindow.prototype.stop = function() {};\n\n/**\n * @param {*=} url\n * @param {string=} windowName\n * @param {string=} windowFeatures\n * @param {boolean=} replace\n * @return {Window}\n * @see http://msdn.microsoft.com/en-us/library/ms536651(VS.85).aspx\n */\nWindow.prototype.open = function(url, windowName, windowFeatures, replace) {};\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML\n * @implicitCast\n */\nElement.prototype.innerHTML;\n\n/**\n * @type {string}\n * @implicitCast\n * @see https://w3c.github.io/DOM-Parsing/#extensions-to-the-element-interface\n */\nElement.prototype.outerHTML;\n\n","externs/w3c_dom3.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's DOM Level 3 specification.\n *  This file depends on w3c_dom2.js.\n *  The whole file has been fully type annotated.\n *  Created from\n *   http://www.w3.org/TR/DOM-Level-3-Core/ecma-script-binding.html\n *\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n */\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-258A00AF\n */\nDOMException.prototype.code;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-258A00AF\n */\nDOMException.VALIDATION_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-258A00AF\n */\nDOMException.TYPE_MISMATCH_ERR;\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMStringList\n */\nfunction DOMStringList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMStringList-length\n */\nDOMStringList.prototype.length;\n\n/**\n * @param {string} str\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMStringList-contains\n * @nosideeffects\n */\nDOMStringList.prototype.contains = function(str) {};\n\n/**\n * @param {number} index\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMStringList-item\n * @nosideeffects\n */\nDOMStringList.prototype.item = function(index) {};\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementationList\n */\nfunction DOMImplementationList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementationList-length\n */\nDOMImplementationList.prototype.length;\n\n/**\n * @param {number} index\n * @return {DOMImplementation}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementationList-item\n * @nosideeffects\n */\nDOMImplementationList.prototype.item = function(index) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementationSource\n */\nfunction DOMImplementationSource() {}\n\n/**\n * @param {?string} namespaceURI\n * @param {string} publicId\n * @param {DocumentType=} doctype\n * @return {Document}\n * @see https://dom.spec.whatwg.org/#ref-for-dom-domimplementation-createdocument%E2%91%A0\n * @nosideeffects\n */\nDOMImplementation.prototype.createDocument = function(namespaceURI, publicId, doctype) {};\n\n/**\n * @param {string} qualifiedName\n * @param {string} publicId\n * @param {string} systemId\n * @return {DocumentType}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Level-2-Core-DOM-createDocType\n * @nosideeffects\n */\nDOMImplementation.prototype.createDocumentType = function(qualifiedName, publicId, systemId) {};\n\n/**\n * @param {string} features\n * @return {DOMImplementation}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-getDOMImpl\n * @nosideeffects\n */\nDOMImplementationSource.prototype.getDOMImplementation = function(features) {};\n\n/**\n * @param {string} features\n * @return {DOMImplementationList}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-getDOMImpls\n * @nosideeffects\n */\nDOMImplementationSource.prototype.getDOMImplementationList = function(features) {};\n\n/**\n * @param {Node} externalNode\n * @return {Node}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-adoptNode\n */\nDocument.prototype.adoptNode = function(externalNode) {};\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-documentURI\n */\nDocument.prototype.documentURI;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-inputEncoding\n */\nDocument.prototype.inputEncoding;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-encoding\n */\nDocument.prototype.xmlEncoding;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-standalone\n */\nDocument.prototype.xmlStandalone;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-version\n */\nDocument.prototype.xmlVersion;\n\n/**\n * @type {?string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-baseURI\n */\nNode.prototype.baseURI;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSLocalN\n */\nNode.prototype.localName;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname\n */\nNode.prototype.namespaceURI;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSPrefix\n */\nNode.prototype.prefix;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent\n */\nNode.prototype.textContent;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node-DOCUMENT_POSITION_DISCONNECTED\n */\nNode.DOCUMENT_POSITION_DISCONNECTED;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node-DOCUMENT_POSITION_PRECEDING\n */\nNode.DOCUMENT_POSITION_PRECEDING;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node-DOCUMENT_POSITION_FOLLOWING\n */\nNode.DOCUMENT_POSITION_FOLLOWING;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node-DOCUMENT_POSITION_CONTAINS\n */\nNode.DOCUMENT_POSITION_CONTAINS;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node-DOCUMENT_POSITION_CONTAINED_BY\n */\nNode.DOCUMENT_POSITION_CONTAINED_BY;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node-DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC\n */\nNode.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;\n\n/**\n * @param {Node} other\n * @return {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition\n * @nosideeffects\n */\nNode.prototype.compareDocumentPosition = function(other) {};\n\n/**\n * @param {string} feature\n * @param {string} version\n * @return {Object}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-getFeature\n * @nosideeffects\n */\nNode.prototype.getFeature = function(feature, version) {};\n\n/**\n * @param {string} key\n * @return {Object}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-getUserData\n * @nosideeffects\n */\nNode.prototype.getUserData = function(key) {};\n\n/**\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeHasAttrs\n * @nosideeffects\n */\nNode.prototype.hasAttributes = function() {};\n\n/**\n * @param {?string} namespaceURI\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace\n * @nosideeffects\n */\nNode.prototype.isDefaultNamespace = function(namespaceURI) {};\n\n/**\n * @param {Node} arg\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isEqualNode\n * @nosideeffects\n */\nNode.prototype.isEqualNode = function(arg) {};\n\n/**\n * @param {Node} other\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isSameNode\n * @nosideeffects\n */\nNode.prototype.isSameNode = function(other) {};\n\n/**\n * @param {string} prefix\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI\n * @nosideeffects\n */\nNode.prototype.lookupNamespaceURI = function(prefix) {};\n\n/**\n * @param {?string} namespaceURI\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n * @nosideeffects\n */\nNode.prototype.lookupPrefix = function(namespaceURI) {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-normalize\n */\nNode.prototype.normalize = function() {};\n\n/**\n * @param {string} query\n * @return {?Element}\n * @see http://www.w3.org/TR/selectors-api/#queryselector\n * @nosideeffects\n */\nNode.prototype.querySelector = function(query) {};\n\n/**\n * @param {string} query\n * @return {!NodeList}\n * @see http://www.w3.org/TR/selectors-api/#queryselectorall\n * @nosideeffects\n */\nNode.prototype.querySelectorAll = function(query) {};\n\n/**\n * @type {Element}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Attr-ownerElement\n */\nAttr.prototype.ownerElement;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Attr-isId\n */\nAttr.prototype.isId;\n\n/**\n * @param {?string} namespaceURI\n * @param {string} localName\n * @return {Attr}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElGetAtNodeNS\n * @nosideeffects\n */\nElement.prototype.getAttributeNodeNS = function(namespaceURI, localName) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} localName\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElGetAttrNS\n * @nosideeffects\n */\nElement.prototype.getAttributeNS = function(namespaceURI, localName) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} localName\n * @return {!NodeList}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-A6C90942\n * @nosideeffects\n */\nElement.prototype.getElementsByTagNameNS = function(namespaceURI, localName) {};\n\n/**\n * @param {string} name\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElHasAttr\n * @nosideeffects\n */\nElement.prototype.hasAttribute = function(name) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} localName\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElHasAttrNS\n * @nosideeffects\n */\nElement.prototype.hasAttributeNS = function(namespaceURI, localName) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} localName\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElRemAtNS\n */\nElement.prototype.removeAttributeNS = function(namespaceURI, localName) {};\n\n/**\n * @param {Attr} newAttr\n * @return {Attr}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElSetAtNodeNS\n */\nElement.prototype.setAttributeNodeNS = function(newAttr) {};\n\n/**\n * @param {?string} namespaceURI\n * @param {string} qualifiedName\n * @param {string|number|boolean} value Values are converted to strings with\n *     ToString, so we accept number and boolean since both convert easily to\n *     strings.\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ElSetAttrNS\n */\nElement.prototype.setAttributeNS = function(namespaceURI, qualifiedName, value) {};\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Text3-wholeText\n */\nText.prototype.wholeText;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-Interfaces-DOMError\n */\nfunction DOMError() {}\n\n/**\n * @type {DOMLocator}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-location\n */\nDOMError.prototype.location;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-message\n */\nDOMError.prototype.message;\n\n/**\n * @type {Object}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-relatedData\n */\nDOMError.prototype.relatedData;\n\n/**\n * @type {Object}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-relatedException\n */\nDOMError.prototype.relatedException;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-severity-warning\n */\nDOMError.SEVERITY_WARNING;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-severity-error\n */\nDOMError.SEVERITY_ERROR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-severity-fatal-error\n */\nDOMError.SEVERITY_FATAL_ERROR;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-severity\n */\nDOMError.prototype.severity;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-DOMError-type\n */\nDOMError.prototype.type;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/dom/#domerror\n */\nDOMError.prototype.name;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ERROR-Interfaces-DOMErrorHandler\n */\nfunction DOMErrorHandler() {}\n\n/**\n * @param {DOMError} error\n * @return {boolean}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-ERRORS-DOMErrorHandler-handleError\n */\nDOMErrorHandler.prototype.handleError = function(error) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#Interfaces-DOMLocator\n */\nfunction DOMLocator() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMLocator-byteOffset\n */\nDOMLocator.prototype.byteOffset;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMLocator-column-number\n */\nDOMLocator.prototype.columnNumber;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMLocator-line-number\n */\nDOMLocator.prototype.lineNumber;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMLocator-node\n */\nDOMLocator.prototype.relatedNode;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMLocator-uri\n */\nDOMLocator.prototype.uri;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMLocator-utf16Offset\n */\nDOMLocator.prototype.utf16Offset;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-Core-DocType-publicId\n */\nDocumentType.prototype.publicId;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-Core-DocType-systemId\n */\nDocumentType.prototype.systemId;\n","externs/w3c_dom4.js":"/*\n * Copyright 2016 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's DOM4 specification. This file depends on\n * w3c_dom3.js. The whole file has been fully type annotated. Created from\n * https://www.w3.org/TR/domcore/.\n *\n * @externs\n * @author [email protected] (Michael Zhou)\n */\n\n/**\n * @typedef {?(DocumentType|Element|CharacterData)}\n * @see https://www.w3.org/TR/domcore/#interface-childnode\n */\nvar ChildNode;\n\n/**\n * @return {undefined}\n * @see https://www.w3.org/TR/domcore/#dom-childnode-remove\n */\nDocumentType.prototype.remove = function() {};\n\n/**\n * @return {undefined}\n * @see https://www.w3.org/TR/domcore/#dom-childnode-remove\n */\nElement.prototype.remove = function() {};\n\n/**\n * @return {undefined}\n * @see https://www.w3.org/TR/domcore/#dom-childnode-remove\n */\nCharacterData.prototype.remove = function() {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-replacewith\n */\nDocumentType.prototype.replaceWith = function(nodes) {};\n\n/**\n * @const {string}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#sec-domerror\n */\nDOMException.prototype.name;\n\n/**\n * @const {string}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#sec-domerror\n */\nDOMException.prototype.message;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.SECURITY_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.NETWORK_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.ABORT_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.URL_MISMATCH_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.QUOTA_EXCEEDED_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.TIMEOUT_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.INVALID_NODE_TYPE_ERR;\n\n/**\n * @const {number}\n * @see https://www.w3.org/TR/2015/REC-dom-20151119/#dfn-error-names-table\n */\nDOMException.DATA_CLONE_ERR;\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-replacewith\n */\nElement.prototype.replaceWith = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-replacewith\n */\nCharacterData.prototype.replaceWith = function(nodes) {};\n\n/**\n * @return {!Array}\n * @see https://dom.spec.whatwg.org/#dom-element-getattributenames\n */\nElement.prototype.getAttributeNames = function() {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-append\n */\nElement.prototype.append = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-append\n */\nDocument.prototype.append = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-append\n */\nDocumentFragment.prototype.append = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-prepend\n */\nElement.prototype.prepend = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-prepend\n */\nDocument.prototype.prepend = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-prepend\n */\nDocumentFragment.prototype.prepend = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-before\n */\nElement.prototype.before = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-before\n */\nDocumentType.prototype.before = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-before\n */\nCharacterData.prototype.before = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-after\n */\nElement.prototype.after = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-after\n */\nDocumentType.prototype.after = function(nodes) {};\n\n/**\n * @param {...(!Node|string)} nodes\n * @return {undefined}\n * @see https://dom.spec.whatwg.org/#dom-childnode-after\n */\nCharacterData.prototype.after = function(nodes) {};\n\n/**\n * @param {string} name\n * @param {boolean=} force\n * @return {boolean}\n * @throws {DOMException}\n * @see https://dom.spec.whatwg.org/#dom-element-toggleattribute\n */\nElement.prototype.toggleAttribute = function(name, force) {};\n\n/**\n * @type {Element}\n * @see http://msdn.microsoft.com/en-us/library/ms534327(VS.85).aspx\n */\nNode.prototype.parentElement;\n\n/**\n * @param {string} name\n * @return {!HTMLCollection}\n * @nosideeffects\n * @see https://dom.spec.whatwg.org/#dom-document-getelementsbyclassname-classnames-classnames\n */\nDocument.prototype.getElementsByClassName = function(name) {};\n\n/**\n * @param {string} classNames\n * @return {!HTMLCollection}\n * @nosideeffects\n * @see https://dom.spec.whatwg.org/#dom-element-getelementsbyclassname-classnames-classnames\n */\nElement.prototype.getElementsByClassName = function(classNames) {};\n","externs/html5.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for all the extensions over the\n *  W3C's DOM3 specification in HTML5. This file depends on\n *  w3c_dom3.js. The whole file has been fully type annotated.\n *\n *  @see http://www.whatwg.org/specs/web-apps/current-work/multipage/index.html\n *  @see http://dev.w3.org/html5/spec/Overview.html\n *\n *  This also includes Typed Array definitions from\n *  http://www.khronos.org/registry/typedarray/specs/latest/\n *\n *  This relies on w3c_event.js being included first.\n *\n * @externs\n */\n\n/** @type {?HTMLSlotElement} */\nNode.prototype.assignedSlot;\n\n/**\n * @type {string}\n * @see https://dom.spec.whatwg.org/#dom-element-slot\n */\nElement.prototype.slot;\n\n/**\n * Note: In IE, the contains() method only exists on Elements, not Nodes.\n * Therefore, it is recommended that you use the Conformance framework to\n * prevent calling this on Nodes which are not Elements.\n * @see https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect\n *\n * @param {Node} n The node to check\n * @return {boolean} If 'n' is this Node, or is contained within this Node.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Node.contains\n * @nosideeffects\n */\nNode.prototype.contains = function(n) {};\n\n/** @type {boolean} */\nNode.prototype.isConnected;\n\n/**\n * Inserts the given HTML Element into the node at the location.\n * @param {string} where Where to insert the HTML text, one of 'beforeBegin',\n *     'afterBegin', 'beforeEnd', 'afterEnd'.\n * @param {!Element} element DOM Element to insert.\n * @return {?Element} The element that was inserted, or null, if the\n *     insertion failed.\n * @see https://dom.spec.whatwg.org/#dom-element-insertadjacentelement\n */\nNode.prototype.insertAdjacentElement = function(where, element) {};\n\n/**\n * @type {boolean}\n * @see https://html.spec.whatwg.org/multipage/scripting.html#the-script-element\n */\nHTMLScriptElement.prototype.async;\n\n/**\n * @constructor\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element\n * @extends {HTMLElement}\n */\nfunction HTMLCanvasElement() {}\n\n/** @type {number} */\nHTMLCanvasElement.prototype.width;\n\n/** @type {number} */\nHTMLCanvasElement.prototype.height;\n\n/**\n * @see https://www.w3.org/TR/html5/scripting-1.html#dom-canvas-toblob\n * @param {function(!Blob)} callback\n * @param {string=} opt_type\n * @param {...*} var_args\n * @throws {Error}\n */\nHTMLCanvasElement.prototype.toBlob = function(callback, opt_type, var_args) {};\n\n/**\n * @param {string=} opt_type\n * @param {...*} var_args\n * @return {string}\n * @throws {Error}\n */\nHTMLCanvasElement.prototype.toDataURL = function(opt_type, var_args) {};\n\n/**\n * @modifies {this}\n * @param {string} contextId\n * @param {Object=} opt_args\n * @return {Object}\n */\nHTMLCanvasElement.prototype.getContext = function(contextId, opt_args) {};\n\n/**\n * @see https://www.w3.org/TR/mediacapture-fromelement/\n * @param {number=} opt_framerate\n * @return {!MediaStream}\n * @throws {Error}\n * */\nHTMLCanvasElement.prototype.captureStream = function(opt_framerate) {};\n\n/**\n * @see https://html.spec.whatwg.org/multipage/canvas.html#dom-canvas-transfercontroltooffscreen\n * @return {!OffscreenCanvas}\n * @throws {Error}\n * */\nHTMLCanvasElement.prototype.transferControlToOffscreen = function() {};\n\n/**\n * @see https://html.spec.whatwg.org/multipage/canvas.html#the-offscreencanvas-interface\n * @implements {EventTarget}\n * @implements {Transferable}\n * @param {number} width\n * @param {number} height\n * @nosideeffects\n * @constructor\n */\nfunction OffscreenCanvas(width, height) {}\n\n/** @override */\nOffscreenCanvas.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nOffscreenCanvas.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nOffscreenCanvas.prototype.dispatchEvent = function(evt) {};\n\n/** @type {number} */\nOffscreenCanvas.prototype.width;\n\n/** @type {number} */\nOffscreenCanvas.prototype.height;\n\n/**\n * @param {string} contextId\n * @param {!Object=} opt_options\n * @modifies {this}\n * @return {!Object}\n */\nOffscreenCanvas.prototype.getContext = function(contextId, opt_options) {};\n\n/**\n * @return {!ImageBitmap}\n */\nOffscreenCanvas.prototype.transferToImageBitmap = function() {};\n\n/**\n * @param {{type: (string|undefined), quality: (number|undefined)}=} opt_options\n * @return {!Promise}\n */\nOffscreenCanvas.prototype.convertToBlob = function(opt_options) {};\n\n// TODO(tjgq): Find a way to add SVGImageElement to this typedef without making\n// svg.js part of core.\n/**\n * @typedef {HTMLImageElement|HTMLVideoElement|HTMLCanvasElement|ImageBitmap|\n *     OffscreenCanvas}\n */\nvar CanvasImageSource;\n\n/**\n * @interface\n * @see https://www.w3.org/TR/2dcontext/#canvaspathmethods\n */\nfunction CanvasPathMethods() {}\n\n/**\n * @return {undefined}\n */\nCanvasPathMethods.prototype.closePath = function() {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nCanvasPathMethods.prototype.moveTo = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nCanvasPathMethods.prototype.lineTo = function(x, y) {};\n\n/**\n * @param {number} cpx\n * @param {number} cpy\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nCanvasPathMethods.prototype.quadraticCurveTo = function(cpx, cpy, x, y) {};\n\n/**\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nCanvasPathMethods.prototype.bezierCurveTo = function(\n    cp1x, cp1y, cp2x, cp2y, x, y) {};\n\n/**\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} radius\n * @return {undefined}\n */\nCanvasPathMethods.prototype.arcTo = function(x1, y1, x2, y2, radius) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {undefined}\n */\nCanvasPathMethods.prototype.rect = function(x, y, w, h) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {boolean=} opt_anticlockwise\n * @return {undefined}\n */\nCanvasPathMethods.prototype.arc = function(\n    x, y, radius, startAngle, endAngle, opt_anticlockwise) {};\n\n/**\n * @constructor\n * @param {!Path2D|string=} arg\n * @implements {CanvasPathMethods}\n * @see https://html.spec.whatwg.org/multipage/scripting.html#path2d-objects\n */\nfunction Path2D(arg) {}\n\n/**\n * @return {undefined}\n * @override\n */\nPath2D.prototype.closePath = function() {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nPath2D.prototype.moveTo = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nPath2D.prototype.lineTo = function(x, y) {};\n\n/**\n * @param {number} cpx\n * @param {number} cpy\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nPath2D.prototype.quadraticCurveTo = function(cpx, cpy, x, y) {};\n\n/**\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nPath2D.prototype.bezierCurveTo = function(\n    cp1x, cp1y, cp2x, cp2y, x, y) {};\n\n/**\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} radius\n * @return {undefined}\n * @override\n */\nPath2D.prototype.arcTo = function(x1, y1, x2, y2, radius) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {undefined}\n * @override\n */\nPath2D.prototype.rect = function(x, y, w, h) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {boolean=} optAnticlockwise\n * @return {undefined}\n * @override\n */\nPath2D.prototype.arc = function(\n    x, y, radius, startAngle, endAngle, optAnticlockwise) {};\n\n/**\n * @param {Path2D} path\n * @return {undefined}\n */\nPath2D.prototype.addPath = function(path) {};\n\n/**\n * @interface\n * @see https://www.w3.org/TR/2dcontext/#canvasdrawingstyles\n */\nfunction CanvasDrawingStyles() {}\n\n/** @type {number} */\nCanvasDrawingStyles.prototype.lineWidth;\n\n/** @type {string} */\nCanvasDrawingStyles.prototype.lineCap;\n\n/** @type {string} */\nCanvasDrawingStyles.prototype.lineJoin;\n\n/** @type {number} */\nCanvasDrawingStyles.prototype.miterLimit;\n\n/**\n * @param {Array} segments\n * @return {undefined}\n */\nCanvasDrawingStyles.prototype.setLineDash = function(segments) {};\n\n/**\n * @return {!Array}\n */\nCanvasDrawingStyles.prototype.getLineDash = function() {};\n\n/** @type {string} */\nCanvasDrawingStyles.prototype.font;\n\n/** @type {string} */\nCanvasDrawingStyles.prototype.textAlign;\n\n/** @type {string} */\nCanvasDrawingStyles.prototype.textBaseline;\n\n// TODO(dramaix): replace this with @record.\n/**\n * @constructor\n * @abstract\n * @implements {CanvasDrawingStyles}\n * @implements {CanvasPathMethods}\n * @see http://www.w3.org/TR/2dcontext/#canvasrenderingcontext2d\n */\nfunction BaseRenderingContext2D() {}\n\n/** @const {!HTMLCanvasElement|!OffscreenCanvas} */\nBaseRenderingContext2D.prototype.canvas;\n\n/**\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.save = function() {};\n\n/**\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.restore = function() {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.scale = function(x, y) {};\n\n/**\n * @param {number} angle\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.rotate = function(angle) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.translate = function(x, y) {};\n\n/**\n * @param {number} m11\n * @param {number} m12\n * @param {number} m21\n * @param {number} m22\n * @param {number} dx\n * @param {number} dy\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.transform = function(\n    m11, m12, m21, m22, dx, dy) {};\n\n/**\n * @param {number} m11\n * @param {number} m12\n * @param {number} m21\n * @param {number} m22\n * @param {number} dx\n * @param {number} dy\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.setTransform = function(\n    m11, m12, m21, m22, dx, dy) {};\n\n/**\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @return {!CanvasGradient}\n * @throws {Error}\n */\nBaseRenderingContext2D.prototype.createLinearGradient = function(\n    x0, y0, x1, y1) {};\n\n/**\n * @param {number} x0\n * @param {number} y0\n * @param {number} r0\n * @param {number} x1\n * @param {number} y1\n * @param {number} r1\n * @return {!CanvasGradient}\n * @throws {Error}\n */\nBaseRenderingContext2D.prototype.createRadialGradient = function(\n    x0, y0, r0, x1, y1, r1) {};\n\n/**\n * @param {CanvasImageSource} image\n * @param {string} repetition\n * @return {?CanvasPattern}\n * @throws {Error}\n * @see https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-createpattern\n */\nBaseRenderingContext2D.prototype.createPattern = function(\n    image, repetition) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.clearRect = function(x, y, w, h) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.fillRect = function(x, y, w, h) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.strokeRect = function(x, y, w, h) {};\n\n/**\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.beginPath = function() {};\n\n/**\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.closePath = function() {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.moveTo = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.lineTo = function(x, y) {};\n\n/**\n * @param {number} cpx\n * @param {number} cpy\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.quadraticCurveTo = function(\n    cpx, cpy, x, y) {};\n\n/**\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.bezierCurveTo = function(\n    cp1x, cp1y, cp2x, cp2y, x, y) {};\n\n/**\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} radius\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.arcTo = function(x1, y1, x2, y2, radius) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.rect = function(x, y, w, h) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {boolean=} opt_anticlockwise\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.arc = function(\n    x, y, radius, startAngle, endAngle, opt_anticlockwise) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} radiusX\n * @param {number} radiusY\n * @param {number} rotation\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {boolean=} opt_anticlockwise\n * @return {undefined}\n * @see http://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/ellipse\n */\nBaseRenderingContext2D.prototype.ellipse = function(\n    x, y, radiusX, radiusY, rotation, startAngle, endAngle, opt_anticlockwise) {\n};\n\n/**\n * @param {Path2D|string=} optFillRuleOrPath\n * @param {string=} optFillRule\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.fill = function(optFillRuleOrPath, optFillRule) {};\n\n/**\n * @param {Path2D=} optStroke\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.stroke = function(optStroke) {};\n\n/**\n * @param {Element} element\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.drawFocusIfNeeded = function(element) {};\n\n/**\n * @param {Path2D|string=} optFillRuleOrPath\n * @param {string=} optFillRule\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.clip = function(optFillRuleOrPath, optFillRule) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInStroke\n */\nBaseRenderingContext2D.prototype.isPointInStroke = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {string=} opt_fillRule\n * @return {boolean}\n * @nosideeffects\n */\nBaseRenderingContext2D.prototype.isPointInPath = function(\n    x, y, opt_fillRule) {};\n\n/**\n * @param {string} text\n * @param {number} x\n * @param {number} y\n * @param {number=} opt_maxWidth\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.fillText = function(\n    text, x, y, opt_maxWidth) {};\n\n/**\n * @param {string} text\n * @param {number} x\n * @param {number} y\n * @param {number=} opt_maxWidth\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.strokeText = function(\n    text, x, y, opt_maxWidth) {};\n\n/**\n * @param {string} text\n * @return {!TextMetrics}\n * @nosideeffects\n */\nBaseRenderingContext2D.prototype.measureText = function(text) {};\n\n/**\n * @param {CanvasImageSource} image\n * @param {number} dx Destination x coordinate.\n * @param {number} dy Destination y coordinate.\n * @param {number=} opt_dw Destination box width.  Defaults to the image width.\n * @param {number=} opt_dh Destination box height.\n *     Defaults to the image height.\n * @param {number=} opt_sx Source box x coordinate.  Used to select a portion of\n *     the source image to draw.  Defaults to 0.\n * @param {number=} opt_sy Source box y coordinate.  Used to select a portion of\n *     the source image to draw.  Defaults to 0.\n * @param {number=} opt_sw Source box width.  Used to select a portion of\n *     the source image to draw.  Defaults to the full image width.\n * @param {number=} opt_sh Source box height.  Used to select a portion of\n *     the source image to draw.  Defaults to the full image height.\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.drawImage = function(\n    image, dx, dy, opt_dw, opt_dh, opt_sx, opt_sy, opt_sw, opt_sh) {};\n\n/**\n * @param {number} sw\n * @param {number} sh\n * @return {!ImageData}\n * @throws {Error}\n * @nosideeffects\n */\nBaseRenderingContext2D.prototype.createImageData = function(sw, sh) {};\n\n/**\n * @param {number} sx\n * @param {number} sy\n * @param {number} sw\n * @param {number} sh\n * @return {!ImageData}\n * @throws {Error}\n */\nBaseRenderingContext2D.prototype.getImageData = function(sx, sy, sw, sh) {};\n\n/**\n * @param {ImageData} imagedata\n * @param {number} dx\n * @param {number} dy\n * @param {number=} opt_dirtyX\n * @param {number=} opt_dirtyY\n * @param {number=} opt_dirtyWidth\n * @param {number=} opt_dirtyHeight\n * @return {undefined}\n */\nBaseRenderingContext2D.prototype.putImageData = function(imagedata, dx, dy,\n    opt_dirtyX, opt_dirtyY, opt_dirtyWidth, opt_dirtyHeight) {};\n\n/**\n * Note: WebKit only\n * @param {number|string=} opt_a\n * @param {number=} opt_b\n * @param {number=} opt_c\n * @param {number=} opt_d\n * @param {number=} opt_e\n * @see http://developer.apple.com/library/safari/#documentation/appleapplications/reference/WebKitDOMRef/CanvasRenderingContext2D_idl/Classes/CanvasRenderingContext2D/index.html\n * @return {undefined}\n * @deprecated\n */\nBaseRenderingContext2D.prototype.setFillColor = function(\n    opt_a, opt_b, opt_c, opt_d, opt_e) {};\n\n/**\n * Note: WebKit only\n * @param {number|string=} opt_a\n * @param {number=} opt_b\n * @param {number=} opt_c\n * @param {number=} opt_d\n * @param {number=} opt_e\n * @see http://developer.apple.com/library/safari/#documentation/appleapplications/reference/WebKitDOMRef/CanvasRenderingContext2D_idl/Classes/CanvasRenderingContext2D/index.html\n * @return {undefined}\n * @deprecated\n */\nBaseRenderingContext2D.prototype.setStrokeColor = function(\n    opt_a, opt_b, opt_c, opt_d, opt_e) {};\n\n/**\n * @return {!Array}\n * @override\n */\nBaseRenderingContext2D.prototype.getLineDash = function() {};\n\n/**\n * @param {Array} segments\n * @return {undefined}\n * @override\n */\nBaseRenderingContext2D.prototype.setLineDash = function(segments) {};\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.fillColor;\n\n/**\n * @type {string|!CanvasGradient|!CanvasPattern}\n * @see https://html.spec.whatwg.org/multipage/scripting.html#fill-and-stroke-styles:dom-context-2d-fillstyle\n * @implicitCast\n */\nBaseRenderingContext2D.prototype.fillStyle;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.font;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.globalAlpha;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.globalCompositeOperation;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.lineWidth;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.lineCap;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.lineJoin;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.miterLimit;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.shadowBlur;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.shadowColor;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.shadowOffsetX;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.shadowOffsetY;\n\n/** @type {boolean} */\nBaseRenderingContext2D.prototype.imageSmoothingEnabled;\n\n/**\n * @type {string|!CanvasGradient|!CanvasPattern}\n * @see https://html.spec.whatwg.org/multipage/scripting.html#fill-and-stroke-styles:dom-context-2d-strokestyle\n * @implicitCast\n */\nBaseRenderingContext2D.prototype.strokeStyle;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.strokeColor;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.textAlign;\n\n/** @type {string} */\nBaseRenderingContext2D.prototype.textBaseline;\n\n/** @type {number} */\nBaseRenderingContext2D.prototype.lineDashOffset;\n\n/**\n * @constructor\n * @extends {BaseRenderingContext2D}\n * @see http://www.w3.org/TR/2dcontext/#canvasrenderingcontext2d\n */\nfunction CanvasRenderingContext2D() {}\n\n/** @const {!HTMLCanvasElement} */\nCanvasRenderingContext2D.prototype.canvas;\n\n/**\n * @constructor\n * @extends {BaseRenderingContext2D}\n * @see http://www.w3.org/TR/2dcontext/#canvasrenderingcontext2d\n */\nfunction OffscreenCanvasRenderingContext2D() {}\n\n/** @const {!OffscreenCanvas} */\nOffscreenCanvasRenderingContext2D.prototype.canvas;\n\n/**\n * @constructor\n */\nfunction CanvasGradient() {}\n\n/**\n * @param {number} offset\n * @param {string} color\n * @return {undefined}\n */\nCanvasGradient.prototype.addColorStop = function(offset, color) {};\n\n/**\n * @constructor\n */\nfunction CanvasPattern() {}\n\n/**\n * @constructor\n */\nfunction TextMetrics() {}\n\n/** @const {number} */\nTextMetrics.prototype.width;\n\n/**\n * @param {!Uint8ClampedArray|number} dataOrWidth In the first form, this is the\n *     array of pixel data.  In the second form, this is the image width.\n * @param {number} widthOrHeight In the first form, this is the image width.  In\n *     the second form, this is the image height.\n * @param {number=} opt_height In the first form, this is the optional image\n *     height.  The second form omits this argument.\n * @see https://html.spec.whatwg.org/multipage/scripting.html#imagedata\n * @constructor\n */\nfunction ImageData(dataOrWidth, widthOrHeight, opt_height) {}\n\n/** @const {!Uint8ClampedArray} */\nImageData.prototype.data;\n\n/** @const {number} */\nImageData.prototype.width;\n\n/** @const {number} */\nImageData.prototype.height;\n\n/**\n * @see https://www.w3.org/TR/html51/webappapis.html#webappapis-images\n * @interface\n */\nfunction ImageBitmap() {}\n\n/**\n * @const {number}\n */\nImageBitmap.prototype.width;\n\n/**\n * @const {number}\n */\nImageBitmap.prototype.height;\n\n/**\n * @typedef {{\n *   imageOrientation: (string|undefined),\n *   premultiplyAlpha: (string|undefined),\n *   colorSpaceConversion: (string|undefined),\n *   resizeWidth: (number|undefined),\n *   resizeHeight: (number|undefined),\n *   resizeQuality: (string|undefined)\n * }}\n * @see https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#images-2\n */\nvar ImageBitmapOptions;\n\n/**\n * @param {(!HTMLCanvasElement|!Blob|!HTMLVideoElement|!HTMLImageElement|!ImageBitmap|!CanvasRenderingContext2D|!ImageData)}\n *     image\n * @param {(number|!ImageBitmapOptions)=} sxOrOptions\n * @param {number=} sy\n * @param {number=} sw\n * @param {number=} sh\n * @param {!ImageBitmapOptions=} options\n * @return {!Promise}\n * @see * https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap\n */\nfunction createImageBitmap(image, sxOrOptions, sy, sw, sh, options) {}\n\n\n/**\n * @constructor\n */\nfunction ClientInformation() {}\n\n/** @type {boolean} */\nClientInformation.prototype.onLine;\n\n/**\n * @param {string} protocol\n * @param {string} uri\n * @param {string} title\n * @return {undefined}\n */\nClientInformation.prototype.registerProtocolHandler = function(\n    protocol, uri, title) {};\n\n/**\n * @param {string} mimeType\n * @param {string} uri\n * @param {string} title\n * @return {undefined}\n */\nClientInformation.prototype.registerContentHandler = function(\n    mimeType, uri, title) {};\n\n// HTML5 Database objects\n/**\n * @constructor\n */\nfunction Database() {}\n\n/**\n * @type {string}\n */\nDatabase.prototype.version;\n\n/**\n * @param {function(!SQLTransaction) : void} callback\n * @param {(function(!SQLError) : void)=} opt_errorCallback\n * @param {Function=} opt_Callback\n * @return {undefined}\n */\nDatabase.prototype.transaction = function(\n    callback, opt_errorCallback, opt_Callback) {};\n\n/**\n * @param {function(!SQLTransaction) : void} callback\n * @param {(function(!SQLError) : void)=} opt_errorCallback\n * @param {Function=} opt_Callback\n * @return {undefined}\n */\nDatabase.prototype.readTransaction = function(\n    callback, opt_errorCallback, opt_Callback) {};\n\n/**\n * @param {string} oldVersion\n * @param {string} newVersion\n * @param {function(!SQLTransaction) : void} callback\n * @param {function(!SQLError) : void} errorCallback\n * @param {Function} successCallback\n * @return {undefined}\n */\nDatabase.prototype.changeVersion = function(\n    oldVersion, newVersion, callback, errorCallback, successCallback) {};\n\n/**\n * @interface\n */\nfunction DatabaseCallback() {}\n\n/**\n * @param {!Database} db\n * @return {undefined}\n */\nDatabaseCallback.prototype.handleEvent = function(db) {};\n\n/**\n * @constructor\n */\nfunction SQLError() {}\n\n/**\n * @type {number}\n */\nSQLError.prototype.code;\n\n/**\n * @type {string}\n */\nSQLError.prototype.message;\n\n/**\n * @constructor\n */\nfunction SQLTransaction() {}\n\n/**\n * @param {string} sqlStatement\n * @param {Array<*>=} opt_queryArgs\n * @param {SQLStatementCallback=} opt_callback\n * @param {(function(!SQLTransaction, !SQLError) : (boolean|void))=}\n *     opt_errorCallback\n * @return {undefined}\n */\nSQLTransaction.prototype.executeSql = function(\n    sqlStatement, opt_queryArgs, opt_callback, opt_errorCallback) {};\n\n/**\n * @typedef {(function(!SQLTransaction, !SQLResultSet) : void)}\n */\nvar SQLStatementCallback;\n\n/**\n * @constructor\n */\nfunction SQLResultSet() {}\n\n/**\n * @type {number}\n */\nSQLResultSet.prototype.insertId;\n\n/**\n * @type {number}\n */\nSQLResultSet.prototype.rowsAffected;\n\n/**\n * @type {!SQLResultSetRowList}\n */\nSQLResultSet.prototype.rows;\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist\n */\nfunction SQLResultSetRowList() {}\n\n/**\n * @type {number}\n */\nSQLResultSetRowList.prototype.length;\n\n/**\n * @param {number} index\n * @return {Object}\n * @nosideeffects\n */\nSQLResultSetRowList.prototype.item = function(index) {};\n\n/**\n * @param {string} name\n * @param {string} version\n * @param {string} description\n * @param {number} size\n * @param {(DatabaseCallback|function(Database))=} opt_callback\n * @return {!Database}\n */\nfunction openDatabase(name, version, description, size, opt_callback) {}\n\n/**\n * @param {string} name\n * @param {string} version\n * @param {string} description\n * @param {number} size\n * @param {(DatabaseCallback|function(Database))=} opt_callback\n * @return {!Database}\n */\nWindow.prototype.openDatabase =\n    function(name, version, description, size, opt_callback) {};\n\n/**\n * @type {boolean}\n * @see https://www.w3.org/TR/html5/embedded-content-0.html#dom-img-complete\n */\nHTMLImageElement.prototype.complete;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/html5/embedded-content-0.html#dom-img-naturalwidth\n */\nHTMLImageElement.prototype.naturalWidth;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/html5/embedded-content-0.html#dom-img-naturalheight\n */\nHTMLImageElement.prototype.naturalHeight;\n\n/**\n * @type {string}\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-crossorigin\n */\nHTMLImageElement.prototype.crossOrigin;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-currentsrc\n */\nHTMLImageElement.prototype.currentSrc;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/images.html#image-decoding-hint\n */\nHTMLImageElement.prototype.decoding;\n\n/**\n * @return {!Promise}\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode\n */\nHTMLImageElement.prototype.decode;\n\n\n/**\n * This is a superposition of the Window and Worker postMessage methods.\n * @param {*} message\n * @param {(string|!Array)=} opt_targetOriginOrTransfer\n * @param {(string|!Array|!Array)=}\n *     opt_targetOriginOrPortsOrTransfer\n * @return {void}\n */\nfunction postMessage(message, opt_targetOriginOrTransfer,\n    opt_targetOriginOrPortsOrTransfer) {}\n\n/**\n * @param {*} message\n * @param {string=} targetOrigin\n * @param {(!Array)=} transfer\n * @return {void}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage\n */\nWindow.prototype.postMessage = function(message, targetOrigin, transfer) {};\n\n/**\n * The postMessage method (as implemented in Opera).\n * @param {string} message\n */\nDocument.prototype.postMessage = function(message) {};\n\n/**\n * Document head accessor.\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#the-head-element-0\n * @type {HTMLHeadElement}\n */\nDocument.prototype.head;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/dom.html#current-document-readiness\n */\nDocument.prototype.readyState;\n\n/**\n * @see https://html.spec.whatwg.org/#application-cache-api\n * @constructor\n * @implements {EventTarget}\n */\nfunction ApplicationCache() {}\n\n/** @override */\nApplicationCache.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nApplicationCache.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nApplicationCache.prototype.dispatchEvent = function(evt) {};\n\n/**\n * The object isn't associated with an application cache. This can occur if the\n * update process fails and there is no previous cache to revert to, or if there\n * is no manifest file.\n * @const {number}\n */\nApplicationCache.prototype.UNCACHED;\n\n/**\n * The object isn't associated with an application cache. This can occur if the\n * update process fails and there is no previous cache to revert to, or if there\n * is no manifest file.\n * @const {number}\n */\nApplicationCache.UNCACHED;\n\n/**\n * The cache is idle.\n * @const {number}\n */\nApplicationCache.prototype.IDLE;\n\n/**\n * The cache is idle.\n * @const {number}\n */\nApplicationCache.IDLE;\n\n/**\n * The update has started but the resources are not downloaded yet - for\n * example, this can happen when the manifest file is fetched.\n * @const {number}\n */\nApplicationCache.prototype.CHECKING;\n\n/**\n * The update has started but the resources are not downloaded yet - for\n * example, this can happen when the manifest file is fetched.\n * @const {number}\n */\nApplicationCache.CHECKING;\n\n/**\n * The resources are being downloaded into the cache.\n * @const {number}\n */\nApplicationCache.prototype.DOWNLOADING;\n\n/**\n * The resources are being downloaded into the cache.\n * @const {number}\n */\nApplicationCache.DOWNLOADING;\n\n/**\n * Resources have finished downloading and the new cache is ready to be used.\n * @const {number}\n */\nApplicationCache.prototype.UPDATEREADY;\n\n/**\n * Resources have finished downloading and the new cache is ready to be used.\n * @const {number}\n */\nApplicationCache.UPDATEREADY;\n\n/**\n * The cache is obsolete.\n * @const {number}\n */\nApplicationCache.prototype.OBSOLETE;\n\n/**\n * The cache is obsolete.\n * @const {number}\n */\nApplicationCache.OBSOLETE;\n\n/**\n * The current status of the application cache.\n * @type {number}\n */\nApplicationCache.prototype.status;\n\n/**\n * Sent when the update process finishes for the first time; that is, the first\n * time an application cache is saved.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.oncached;\n\n/**\n * Sent when the cache update process begins.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.onchecking;\n\n/**\n * Sent when the update process begins downloading resources in the manifest\n * file.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.ondownloading;\n\n/**\n * Sent when an error occurs.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.onerror;\n\n/**\n * Sent when the update process finishes but the manifest file does not change.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.onnoupdate;\n\n/**\n * Sent when each resource in the manifest file begins to download.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.onprogress;\n\n/**\n * Sent when there is an existing application cache, the update process\n * finishes, and there is a new application cache ready for use.\n * @type {?function(!Event): void}\n */\nApplicationCache.prototype.onupdateready;\n\n/**\n * Replaces the active cache with the latest version.\n * @throws {DOMException}\n * @return {undefined}\n */\nApplicationCache.prototype.swapCache = function() {};\n\n/**\n * Manually triggers the update process.\n * @throws {DOMException}\n * @return {undefined}\n */\nApplicationCache.prototype.update = function() {};\n\n/** @type {?ApplicationCache} */\nvar applicationCache;\n\n/** @type {ApplicationCache} */\nWindow.prototype.applicationCache;\n\n/**\n * @see https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\n * @param {...!TrustedScriptURL|string} var_args\n * @return {undefined}\n */\nWindow.prototype.importScripts = function(var_args) {};\n\n/**\n * Decodes a string of data which has been encoded using base-64 encoding.\n *\n * @param {string} encodedData\n * @return {string}\n * @nosideeffects\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#dom-atob\n */\nfunction atob(encodedData) {}\n\n/**\n * @param {string} stringToEncode\n * @return {string}\n * @nosideeffects\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#dom-btoa\n */\nfunction btoa(stringToEncode) {}\n\n/**\n * @see https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\n * @param {...!TrustedScriptURL|string} var_args\n * @return {undefined}\n */\nfunction importScripts(var_args) {}\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @constructor\n * @implements {EventTarget}\n */\nfunction WebWorker() {}\n\n/** @override */\nWebWorker.prototype.addEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nWebWorker.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nWebWorker.prototype.dispatchEvent = function(evt) {};\n\n/**\n * Stops the worker process\n * @return {undefined}\n */\nWebWorker.prototype.terminate = function() {};\n\n/**\n * Posts a message to the worker thread.\n * @param {string} message\n * @return {undefined}\n */\nWebWorker.prototype.postMessage = function(message) {};\n\n/**\n * Sent when the worker thread posts a message to its creator.\n * @type {?function(!MessageEvent<*>): void}\n */\nWebWorker.prototype.onmessage;\n\n/**\n * Sent when the worker thread encounters an error.\n * @type {?function(!ErrorEvent): void}\n */\nWebWorker.prototype.onerror;\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @param {string} scriptURL\n * @param {!WorkerOptions=} opt_options\n * @constructor\n * @implements {EventTarget}\n */\nfunction Worker(scriptURL, opt_options) {}\n\n/** @override */\nWorker.prototype.addEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nWorker.prototype.removeEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nWorker.prototype.dispatchEvent = function(evt) {};\n\n/**\n * Stops the worker process\n * @return {undefined}\n */\nWorker.prototype.terminate = function() {};\n\n/**\n * Posts a message to the worker thread.\n * @param {*} message\n * @param {Array=} opt_transfer\n * @return {undefined}\n */\nWorker.prototype.postMessage = function(message, opt_transfer) {};\n\n/**\n * Posts a message to the worker thread.\n * @param {*} message\n * @param {Array=} opt_transfer\n * @return {undefined}\n */\nWorker.prototype.webkitPostMessage = function(message, opt_transfer) {};\n\n/**\n * Sent when the worker thread posts a message to its creator.\n * @type {?function(!MessageEvent<*>): void}\n */\nWorker.prototype.onmessage;\n\n/**\n * Sent when the worker thread encounters an error.\n * @type {?function(!ErrorEvent): void}\n */\nWorker.prototype.onerror;\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @record\n */\nfunction WorkerOptions() {}\n\n/**\n * Defines a name for the new global environment of the worker, primarily for\n * debugging purposes.\n * @type {string|undefined}\n */\nWorkerOptions.prototype.name;\n\n/**\n * 'classic' or 'module'. Default: 'classic'.\n * Specifying 'module' ensures the worker environment supports JavaScript\n * modules.\n * @type {string|undefined}\n */\nWorkerOptions.prototype.type;\n\n// WorkerOptions.prototype.credentials is defined in fetchapi.js.\n// if type = 'module', it specifies how scriptURL is fetched.\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @param {string} scriptURL The URL of the script to run in the SharedWorker.\n * @param {string=} opt_name A name that can later be used to obtain a\n *     reference to the same SharedWorker.\n * @constructor\n * @implements {EventTarget}\n */\nfunction SharedWorker(scriptURL, opt_name) {}\n\n/** @override */\nSharedWorker.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nSharedWorker.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nSharedWorker.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @type {!MessagePort}\n */\nSharedWorker.prototype.port;\n\n/**\n * Called on network errors for loading the initial script.\n * @type {?function(!ErrorEvent): void}\n */\nSharedWorker.prototype.onerror;\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @see http://www.w3.org/TR/url-1/#dom-urlutilsreadonly\n * @interface\n */\nfunction WorkerLocation() {}\n\n/** @type {string} */\nWorkerLocation.prototype.href;\n\n/** @type {string} */\nWorkerLocation.prototype.origin;\n\n/** @type {string} */\nWorkerLocation.prototype.protocol;\n\n/** @type {string} */\nWorkerLocation.prototype.host;\n\n/** @type {string} */\nWorkerLocation.prototype.hostname;\n\n/** @type {string} */\nWorkerLocation.prototype.port;\n\n/** @type {string} */\nWorkerLocation.prototype.pathname;\n\n/** @type {string} */\nWorkerLocation.prototype.search;\n\n/** @type {string} */\nWorkerLocation.prototype.hash;\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @interface\n * @extends {EventTarget}\n */\nfunction WorkerGlobalScope() {}\n\n/** @type {!WorkerGlobalScope} */\nWorkerGlobalScope.prototype.self;\n\n/** @type {!WorkerLocation} */\nWorkerGlobalScope.prototype.location;\n\n/**\n * Closes the worker represented by this WorkerGlobalScope.\n * @return {undefined}\n */\nWorkerGlobalScope.prototype.close = function() {};\n\n/**\n * Sent when the worker encounters an error.\n * @type {?function(string, string, number, number, !Error): void}\n */\nWorkerGlobalScope.prototype.onerror;\n\n/**\n * Sent when the worker goes offline.\n * @type {?function(!Event): void}\n */\nWorkerGlobalScope.prototype.onoffline;\n\n/**\n * Sent when the worker goes online.\n * @type {?function(!Event): void}\n */\nWorkerGlobalScope.prototype.ononline;\n\n/** @type {!WorkerPerformance} */\nWorkerGlobalScope.prototype.performance;\n\n/** @type {!WorkerNavigator} */\nWorkerGlobalScope.prototype.navigator;\n\n/**\n * Worker postMessage method.\n * @param {*} message\n * @param {(!Array)=} transfer\n * @return {void}\n */\nWorkerGlobalScope.prototype.postMessage = function(message, transfer) {};\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @interface\n * @extends {WorkerGlobalScope}\n */\nfunction DedicatedWorkerGlobalScope() {}\n\n/**\n * Posts a message to creator of this worker.\n * @param {*} message\n * @param {Array=} opt_transfer\n * @return {undefined}\n */\nDedicatedWorkerGlobalScope.prototype.postMessage =\n    function(message, opt_transfer) {};\n\n/**\n * Posts a message to creator of this worker.\n * @param {*} message\n * @param {Array=} opt_transfer\n * @return {undefined}\n */\nDedicatedWorkerGlobalScope.prototype.webkitPostMessage =\n    function(message, opt_transfer) {};\n\n/**\n * Sent when the creator posts a message to this worker.\n * @type {?function(!MessageEvent<*>): void}\n */\nDedicatedWorkerGlobalScope.prototype.onmessage;\n\n/**\n * @see http://dev.w3.org/html5/workers/\n * @interface\n * @extends {WorkerGlobalScope}\n */\nfunction SharedWorkerGlobalScope() {}\n\n/** @type {string} */\nSharedWorkerGlobalScope.prototype.name;\n\n/**\n * Sent when a connection to this worker is opened.\n * @type {?function(!Event)}\n */\nSharedWorkerGlobalScope.prototype.onconnect;\n\n/** @type {!Array|undefined} */\nHTMLElement.observedAttributes;\n\n/**\n * @param {!Document} oldDocument\n * @param {!Document} newDocument\n */\nHTMLElement.prototype.adoptedCallback = function(oldDocument, newDocument) {};\n\n/**\n * @param {!{mode: string}} options\n * @return {!ShadowRoot}\n */\nHTMLElement.prototype.attachShadow = function(options) {};\n\n/**\n * @param {string} attributeName\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\nHTMLElement.prototype.attributeChangedCallback = function(attributeName, oldValue, newValue, namespace) {};\n\n/** @type {function()|undefined} */\nHTMLElement.prototype.connectedCallback;\n\n/** @type {Element} */\nHTMLElement.prototype.contextMenu;\n\n/** @type {function()|undefined} */\nHTMLElement.prototype.disconnectedCallback;\n\n/** @type {boolean} */\nHTMLElement.prototype.draggable;\n\n/**\n * This is actually a DOMSettableTokenList property. However since that\n * interface isn't currently defined and no known browsers implement this\n * feature, just define the property for now.\n *\n * @const {Object}\n */\nHTMLElement.prototype.dropzone;\n\n/** @type {boolean} */\nHTMLElement.prototype.hidden;\n\n/** @type {boolean} */\nHTMLElement.prototype.spellcheck;\n\n/**\n * @see https://dom.spec.whatwg.org/#dictdef-getrootnodeoptions\n * @typedef {{\n *   composed: boolean\n * }}\n */\nvar GetRootNodeOptions;\n\n/**\n * @see https://dom.spec.whatwg.org/#dom-node-getrootnode\n * @param {GetRootNodeOptions=} opt_options\n * @return {!Node}\n */\nNode.prototype.getRootNode = function(opt_options) {};\n\n/**\n * @see http://www.w3.org/TR/components-intro/\n * @return {!ShadowRoot}\n */\nHTMLElement.prototype.createShadowRoot;\n\n/**\n * @see http://www.w3.org/TR/components-intro/\n * @return {!ShadowRoot}\n */\nHTMLElement.prototype.webkitCreateShadowRoot;\n\n/**\n * @see http://www.w3.org/TR/shadow-dom/\n * @type {ShadowRoot}\n */\nHTMLElement.prototype.shadowRoot;\n\n/**\n * @see http://www.w3.org/TR/shadow-dom/\n * @return {!NodeList}\n */\nHTMLElement.prototype.getDestinationInsertionPoints = function() {};\n\n/**\n * @see http://www.w3.org/TR/components-intro/\n * @type {function()}\n */\nHTMLElement.prototype.createdCallback;\n\n/**\n * @see http://w3c.github.io/webcomponents/explainer/#lifecycle-callbacks\n * @type {function()}\n */\nHTMLElement.prototype.attachedCallback;\n\n/**\n * @see http://w3c.github.io/webcomponents/explainer/#lifecycle-callbacks\n * @type {function()}\n */\nHTMLElement.prototype.detachedCallback;\n\n/**\n * Cryptographic nonce used by Content Security Policy.\n * @see https://html.spec.whatwg.org/multipage/dom.html#elements-in-the-dom:noncedelement\n * @type {?string}\n */\nHTMLElement.prototype.nonce;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.download;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.hash;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.host;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.hostname;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.pathname;\n\n/**\n * The 'ping' attribute is known to be supported in recent versions (as of\n * mid-2014) of Chrome, Safari, and Firefox, and is not supported in any\n * current version of Internet Explorer.\n *\n * @type {string}\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#hyperlink-auditing\n */\nHTMLAnchorElement.prototype.ping;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.port;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.protocol;\n\n/** @type {!DOMTokenList} */\nHTMLAnchorElement.prototype.relList;\n\n/** @type {string} */\nHTMLAnchorElement.prototype.search;\n\n/** @type {string} */\nHTMLAreaElement.prototype.download;\n\n/**\n * @type {string}\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#hyperlink-auditing\n */\nHTMLAreaElement.prototype.ping;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/html-markup/iframe.html#iframe.attrs.srcdoc\n */\nHTMLIFrameElement.prototype.srcdoc;\n\n/**\n * @type {?DOMTokenList}\n * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-iframe-element.html#attr-iframe-sandbox\n */\nHTMLIFrameElement.prototype.sandbox;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-allow\n */\nHTMLIFrameElement.prototype.allow;\n\n/**\n * @type {Window}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/contentWindow\n */\nHTMLIFrameElement.prototype.contentWindow;\n\n/** @type {string} */\nHTMLInputElement.prototype.autocomplete;\n\n/** @type {string} */\nHTMLInputElement.prototype.dirname;\n\n/** @type {FileList} */\nHTMLInputElement.prototype.files;\n\n/**\n * @type {boolean}\n * @see https://www.w3.org/TR/html5/forms.html#dom-input-indeterminate\n */\nHTMLInputElement.prototype.indeterminate;\n\n/** @type {string} */\nHTMLInputElement.prototype.list;\n\n/** @implicitCast @type {string} */\nHTMLInputElement.prototype.max;\n\n/** @implicitCast @type {string} */\nHTMLInputElement.prototype.min;\n\n/** @type {string} */\nHTMLInputElement.prototype.pattern;\n\n/** @type {boolean} */\nHTMLInputElement.prototype.multiple;\n\n/** @type {string} */\nHTMLInputElement.prototype.placeholder;\n\n/** @type {boolean} */\nHTMLInputElement.prototype.required;\n\n/** @implicitCast @type {string} */\nHTMLInputElement.prototype.step;\n\n/** @type {Date} */\nHTMLInputElement.prototype.valueAsDate;\n\n/** @type {number} */\nHTMLInputElement.prototype.valueAsNumber;\n\n/**\n * Changes the form control's value by the value given in the step attribute\n * multiplied by opt_n.\n * @param {number=} opt_n step multiplier.  Defaults to 1.\n * @return {undefined}\n */\nHTMLInputElement.prototype.stepDown = function(opt_n) {};\n\n/**\n * Changes the form control's value by the value given in the step attribute\n * multiplied by opt_n.\n * @param {number=} opt_n step multiplier.  Defaults to 1.\n * @return {undefined}\n */\nHTMLInputElement.prototype.stepUp = function(opt_n) {};\n\n\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement\n */\nfunction HTMLMediaElement() {}\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_empty\n * @const {number}\n */\nHTMLMediaElement.NETWORK_EMPTY;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_empty\n * @const {number}\n */\nHTMLMediaElement.prototype.NETWORK_EMPTY;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_idle\n * @const {number}\n */\nHTMLMediaElement.NETWORK_IDLE;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_idle\n * @const {number}\n */\nHTMLMediaElement.prototype.NETWORK_IDLE;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_loading\n * @const {number}\n */\nHTMLMediaElement.NETWORK_LOADING;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_loading\n * @const {number}\n */\nHTMLMediaElement.prototype.NETWORK_LOADING;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_no_source\n * @const {number}\n */\nHTMLMediaElement.NETWORK_NO_SOURCE;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-network_no_source\n * @const {number}\n */\nHTMLMediaElement.prototype.NETWORK_NO_SOURCE;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_nothing\n * @const {number}\n */\nHTMLMediaElement.HAVE_NOTHING;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_nothing\n * @const {number}\n */\nHTMLMediaElement.prototype.HAVE_NOTHING;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_metadata\n * @const {number}\n */\nHTMLMediaElement.HAVE_METADATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_metadata\n * @const {number}\n */\nHTMLMediaElement.prototype.HAVE_METADATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_current_data\n * @const {number}\n */\nHTMLMediaElement.HAVE_CURRENT_DATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_current_data\n * @const {number}\n */\nHTMLMediaElement.prototype.HAVE_CURRENT_DATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_future_data\n * @const {number}\n */\nHTMLMediaElement.HAVE_FUTURE_DATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_future_data\n * @const {number}\n */\nHTMLMediaElement.prototype.HAVE_FUTURE_DATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_enough_data\n * @const {number}\n */\nHTMLMediaElement.HAVE_ENOUGH_DATA;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-have_enough_data\n * @const {number}\n */\nHTMLMediaElement.prototype.HAVE_ENOUGH_DATA;\n\n/** @type {MediaError} */\nHTMLMediaElement.prototype.error;\n\n/** @type {string} @implicitCast */\nHTMLMediaElement.prototype.src;\n\n/** @type {string} */\nHTMLMediaElement.prototype.currentSrc;\n\n/** @type {number} */\nHTMLMediaElement.prototype.networkState;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.autobuffer;\n\n/** @type {!TimeRanges} */\nHTMLMediaElement.prototype.buffered;\n\n/** @type {?MediaStream} */\nHTMLMediaElement.prototype.srcObject;\n\n/**\n * Loads the media element.\n * @return {undefined}\n */\nHTMLMediaElement.prototype.load = function() {};\n\n/**\n * @param {string} type Type of the element in question in question.\n * @return {string} Whether it can play the type.\n * @nosideeffects\n */\nHTMLMediaElement.prototype.canPlayType = function(type) {};\n\n/** Event handlers */\n\n/** @type {?function(Event)} */\nHTMLMediaElement.prototype.onabort;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.oncanplay;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.oncanplaythrough;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.ondurationchange;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onemptied;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onended;\n\n/** @type {?function(Event)} */\nHTMLMediaElement.prototype.onerror;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onloadeddata;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onloadedmetadata;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onloadstart;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onpause;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onplay;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onplaying;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onprogress;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onratechange;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onseeked;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onseeking;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onstalled;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onsuspend;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.ontimeupdate;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onvolumechange;\n\n/** @type {?function(!Event)} */\nHTMLMediaElement.prototype.onwaiting;\n\n/** @type {?function(Event)} */\nHTMLImageElement.prototype.onload;\n\n/** @type {?function(Event)} */\nHTMLImageElement.prototype.onerror;\n\n/** @type {string} */\nHTMLMediaElement.prototype.preload;\n\n/** @type {number} */\nHTMLMediaElement.prototype.readyState;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.seeking;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/media.html#dom-media-crossorigin\n */\nHTMLMediaElement.prototype.crossOrigin;\n\n/**\n * The current time, in seconds.\n * @type {number}\n */\nHTMLMediaElement.prototype.currentTime;\n\n/**\n * The absolute timeline offset.\n * @return {!Date}\n */\nHTMLMediaElement.prototype.getStartDate = function() {};\n\n/**\n * The length of the media in seconds.\n * @type {number}\n */\nHTMLMediaElement.prototype.duration;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.paused;\n\n/** @type {number} */\nHTMLMediaElement.prototype.defaultPlaybackRate;\n\n/** @type {number} */\nHTMLMediaElement.prototype.playbackRate;\n\n/** @type {TimeRanges} */\nHTMLMediaElement.prototype.played;\n\n/** @type {TimeRanges} */\nHTMLMediaElement.prototype.seekable;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.ended;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.autoplay;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.loop;\n\n/**\n * Starts playing the media.\n * @return {?Promise} This is a *nullable* Promise on purpose unlike\n *     the HTML5 spec because supported older browsers (incl. Smart TVs) don't\n *     return a Promise.\n */\nHTMLMediaElement.prototype.play = function() {};\n\n/**\n * Pauses the media.\n * @return {undefined}\n */\nHTMLMediaElement.prototype.pause = function() {};\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.controls;\n\n/**\n * The audio volume, from 0.0 (silent) to 1.0 (loudest).\n * @type {number}\n */\nHTMLMediaElement.prototype.volume;\n\n/** @type {boolean} */\nHTMLMediaElement.prototype.muted;\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-addtexttrack\n * @param {string} kind Kind of the text track.\n * @param {string=} opt_label Label of the text track.\n * @param {string=} opt_language Language of the text track.\n * @return {!TextTrack} TextTrack object added to the media element.\n */\nHTMLMediaElement.prototype.addTextTrack =\n    function(kind, opt_label, opt_language) {};\n\n/** @type {!TextTrackList} */\nHTMLMediaElement.prototype.textTracks;\n\n/**\n * The ID of the audio device through which output is being delivered, or an\n * empty string if using the default device.\n *\n * Implemented as a draft spec in Chrome 49+.\n *\n * @see https://w3c.github.io/mediacapture-output/#htmlmediaelement-extensions\n * @type {string}\n */\nHTMLMediaElement.prototype.sinkId;\n\n/**\n * Sets the audio device through which output should be delivered.\n *\n * Implemented as a draft spec in Chrome 49+.\n *\n * @param {string} sinkId The ID of the audio output device, or empty string\n * for default device.\n *\n * @see https://w3c.github.io/mediacapture-output/#htmlmediaelement-extensions\n * @return {!Promise}\n */\nHTMLMediaElement.prototype.setSinkId = function(sinkId) {};\n\n\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see https://html.spec.whatwg.org/multipage/dom.html#htmlunknownelement\n * @see https://html.spec.whatwg.org/multipage/scripting.html#customized-built-in-element-restrictions\n * @see https://w3c.github.io/webcomponents/spec/custom/#custom-elements-api\n */\nfunction HTMLUnknownElement() {}\n\n\n\n/**\n * @see http://www.w3.org/TR/shadow-dom/\n * @return {!NodeList}\n */\nText.prototype.getDestinationInsertionPoints = function() {};\n\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttracklist\n * @constructor\n * @implements {IArrayLike}\n */\nfunction TextTrackList() {}\n\n/** @type {number} */\nTextTrackList.prototype.length;\n\n/**\n * @param {string} id\n * @return {TextTrack}\n */\nTextTrackList.prototype.getTrackById = function(id) {};\n\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrack\n * @constructor\n * @implements {EventTarget}\n */\nfunction TextTrack() {}\n\n/**\n * @param {TextTrackCue} cue\n * @return {undefined}\n */\nTextTrack.prototype.addCue = function(cue) {};\n\n/**\n * @param {TextTrackCue} cue\n * @return {undefined}\n */\nTextTrack.prototype.removeCue = function(cue) {};\n\n/**\n * @const {TextTrackCueList}\n */\nTextTrack.prototype.activeCues;\n\n/**\n * @const {TextTrackCueList}\n */\nTextTrack.prototype.cues;\n\n/**\n * @type {string}\n */\nTextTrack.prototype.mode;\n\n/** @override */\nTextTrack.prototype.addEventListener = function(\n    type, listener, opt_useCapture) {};\n\n/** @override */\nTextTrack.prototype.dispatchEvent = function(evt) {};\n\n/** @override */\nTextTrack.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcuelist\n * @constructor\n * @implements {IArrayLike}\n */\nfunction TextTrackCueList() {}\n\n/** @const {number} */\nTextTrackCueList.prototype.length;\n\n/**\n * @param {string} id\n * @return {TextTrackCue}\n */\nTextTrackCueList.prototype.getCueById = function(id) {};\n\n\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcue\n * @constructor\n * @param {number} startTime\n * @param {number} endTime\n * @param {string} text\n */\nfunction TextTrackCue(startTime, endTime, text) {}\n\n/** @type {string} */\nTextTrackCue.prototype.id;\n\n/** @type {number} */\nTextTrackCue.prototype.startTime;\n\n/** @type {number} */\nTextTrackCue.prototype.endTime;\n\n/** @type {string} */\nTextTrackCue.prototype.text;\n\n\n\n/**\n * @see https://w3c.github.io/webvtt/#vttregion\n * @constructor\n */\nfunction VTTRegion() {}\n\n/** @type {string} */\nVTTRegion.prototype.id;\n\n/** @type {number} */\nVTTRegion.prototype.width;\n\n/** @type {number} */\nVTTRegion.prototype.lines;\n\n/** @type {number} */\nVTTRegion.prototype.regionAnchorX;\n\n/** @type {number} */\nVTTRegion.prototype.regionAnchorY;\n\n/** @type {number} */\nVTTRegion.prototype.viewportAnchorX;\n\n/** @type {number} */\nVTTRegion.prototype.viewportAnchorY;\n\n/**\n * @see https://w3c.github.io/webvtt/#enumdef-scrollsetting\n * @type {string}\n */\nVTTRegion.prototype.scroll;\n\n\n\n/**\n * @see http://dev.w3.org/html5/webvtt/#the-vttcue-interface\n * @constructor\n * @extends {TextTrackCue}\n * @param {number} startTime\n * @param {number} endTime\n * @param {string} text\n */\nfunction VTTCue(startTime, endTime, text) {}\n\n/** @type {?VTTRegion} */\nVTTCue.prototype.region;\n\n/**\n * @see https://w3c.github.io/webvtt/#enumdef-directionsetting\n * @type {string}\n */\nVTTCue.prototype.vertical;\n\n/** @type {boolean} */\nVTTCue.prototype.snapToLines;\n\n/** @type {(number|string)} */\nVTTCue.prototype.line;\n\n/**\n * @see https://w3c.github.io/webvtt/#enumdef-linealignsetting\n * @type {string}\n */\nVTTCue.prototype.lineAlign;\n\n/** @type {(number|string)} */\nVTTCue.prototype.position;\n\n/**\n * @see https://w3c.github.io/webvtt/#enumdef-positionalignsetting\n * @type {string}\n */\nVTTCue.prototype.positionAlign;\n\n/** @type {number} */\nVTTCue.prototype.size;\n\n/**\n * @see https://w3c.github.io/webvtt/#enumdef-alignsetting\n * @type {string}\n */\nVTTCue.prototype.align;\n\n/** @type {string} */\nVTTCue.prototype.text;\n\n/** @return {!DocumentFragment} */\nVTTCue.prototype.getCueAsHTML = function() {};\n\n\n/**\n * @constructor\n * @extends {HTMLMediaElement}\n */\nfunction HTMLAudioElement() {}\n\n/**\n * @constructor\n * @extends {HTMLMediaElement}\n * The webkit-prefixed attributes are defined in\n * https://cs.chromium.org/chromium/src/third_party/WebKit/Source/core/html/media/HTMLMediaElement.idl\n */\nfunction HTMLVideoElement() {}\n\n/**\n * Starts displaying the video in full screen mode.\n * @return {undefined}\n */\nHTMLVideoElement.prototype.webkitEnterFullscreen = function() {};\n\n/**\n * Starts displaying the video in full screen mode.\n * @return {undefined}\n */\nHTMLVideoElement.prototype.webkitEnterFullScreen = function() {};\n\n/**\n * Stops displaying the video in full screen mode.\n * @return {undefined}\n */\nHTMLVideoElement.prototype.webkitExitFullscreen = function() {};\n\n/**\n * Stops displaying the video in full screen mode.\n * @return {undefined}\n */\nHTMLVideoElement.prototype.webkitExitFullScreen = function() {};\n\n/** @type {number} */\nHTMLVideoElement.prototype.width;\n\n/** @type {number} */\nHTMLVideoElement.prototype.height;\n\n/** @type {number} */\nHTMLVideoElement.prototype.videoWidth;\n\n/** @type {number} */\nHTMLVideoElement.prototype.videoHeight;\n\n/** @type {string} */\nHTMLVideoElement.prototype.poster;\n\n/** @type {boolean} */\nHTMLVideoElement.prototype.webkitSupportsFullscreen;\n\n/** @type {boolean} */\nHTMLVideoElement.prototype.webkitDisplayingFullscreen;\n\n/** @type {number} */\nHTMLVideoElement.prototype.webkitDecodedFrameCount;\n\n/** @type {number} */\nHTMLVideoElement.prototype.webkitDroppedFrameCount;\n\n/**\n * @typedef {{\n *    creationTime: number,\n *    totalVideoFrames: number,\n *    droppedVideoFrames: number,\n *    corruptedVideoFrames: number,\n *    totalFrameDelay: number\n * }}\n */\nvar VideoPlaybackQuality;\n\n/**\n * @see https://w3c.github.io/media-source/#htmlvideoelement-extensions\n * @return {!VideoPlaybackQuality} Stats about the current playback.\n */\nHTMLVideoElement.prototype.getVideoPlaybackQuality = function() {};\n\n\n/**\n * @constructor\n * @see https://html.spec.whatwg.org/multipage/media.html#error-codes\n */\nfunction MediaError() {}\n\n/** @type {number} */\nMediaError.prototype.code;\n\n/** @type {string} */\nMediaError.prototype.message;\n\n/**\n * The fetching process for the media resource was aborted by the user agent at\n * the user's request.\n * @const {number}\n */\nMediaError.MEDIA_ERR_ABORTED;\n\n/**\n * A network error of some description caused the user agent to stop fetching\n * the media resource, after the resource was established to be usable.\n * @const {number}\n */\nMediaError.MEDIA_ERR_NETWORK;\n\n/**\n * An error of some description occurred while decoding the media resource,\n * after the resource was established to be usable.\n * @const {number}\n */\nMediaError.MEDIA_ERR_DECODE;\n\n/**\n * The media resource indicated by the src attribute was not suitable.\n * @const {number}\n */\nMediaError.MEDIA_ERR_SRC_NOT_SUPPORTED;\n\n// HTML5 MessageChannel\n/**\n * @see http://dev.w3.org/html5/spec/comms.html#messagechannel\n * @constructor\n */\nfunction MessageChannel() {}\n\n/**\n * Returns the first port.\n * @type {!MessagePort}\n */\nMessageChannel.prototype.port1;\n\n/**\n * Returns the second port.\n * @type {!MessagePort}\n */\nMessageChannel.prototype.port2;\n\n// HTML5 MessagePort\n/**\n * @see http://dev.w3.org/html5/spec/comms.html#messageport\n * @constructor\n * @implements {EventTarget}\n * @implements {Transferable}\n */\nfunction MessagePort() {}\n\n/** @override */\nMessagePort.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/** @override */\nMessagePort.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nMessagePort.prototype.dispatchEvent = function(evt) {};\n\n\n/**\n * Posts a message through the channel, optionally with the given\n * Array of Transferables.\n * @param {*} message\n * @param {Array=} opt_transfer\n * @return {undefined}\n */\nMessagePort.prototype.postMessage = function(message, opt_transfer) {\n};\n\n/**\n * Begins dispatching messages received on the port.\n * @return {undefined}\n */\nMessagePort.prototype.start = function() {};\n\n/**\n * Disconnects the port, so that it is no longer active.\n * @return {undefined}\n */\nMessagePort.prototype.close = function() {};\n\n/**\n * TODO(blickly): Change this to MessageEvent<*> and add casts as needed\n * @type {?function(!MessageEvent): void}\n */\nMessagePort.prototype.onmessage;\n\n// HTML5 MessageEvent class\n/**\n * @typedef {Window|MessagePort|ServiceWorker}\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageeventsource\n */\nvar MessageEventSource;\n\n\n/**\n * @record\n * @extends {EventInit}\n * @template T\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageeventinit\n */\nfunction MessageEventInit() {}\n\n/** @type {T|undefined} */\nMessageEventInit.prototype.data;\n\n/** @type {(string|undefined)} */\nMessageEventInit.prototype.origin;\n\n/** @type {(string|undefined)} */\nMessageEventInit.prototype.lastEventId;\n\n/** @type {(?MessageEventSource|undefined)} */\nMessageEventInit.prototype.source;\n\n/** @type {(!Array|undefined)} */\nMessageEventInit.prototype.ports;\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {MessageEventInit=} opt_eventInitDict\n * @template T\n */\nfunction MessageEvent(type, opt_eventInitDict) {}\n\n/**\n * The data payload of the message.\n * @type {T}\n */\nMessageEvent.prototype.data;\n\n/**\n * The origin of the message, for server-sent events and cross-document\n * messaging.\n * @type {string}\n */\nMessageEvent.prototype.origin;\n\n/**\n * The last event ID, for server-sent events.\n * @type {string}\n */\nMessageEvent.prototype.lastEventId;\n\n/**\n * The window that dispatched the event.\n * @type {Window}\n */\nMessageEvent.prototype.source;\n\n/**\n * The Array of MessagePorts sent with the message, for cross-document\n * messaging and channel messaging.\n * @type {!Array}\n */\nMessageEvent.prototype.ports;\n\n/**\n * Initializes the event in a manner analogous to the similarly-named methods in\n * the DOM Events interfaces.\n * @param {string} typeArg\n * @param {boolean=} canBubbleArg\n * @param {boolean=} cancelableArg\n * @param {T=} dataArg\n * @param {string=} originArg\n * @param {string=} lastEventIdArg\n * @param {?MessageEventSource=} sourceArg\n * @param {!Array=} portsArg\n * @return {undefined}\n */\nMessageEvent.prototype.initMessageEvent = function(typeArg, canBubbleArg,\n    cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, portsArg) {};\n\n/**\n * Initializes the event in a manner analogous to the similarly-named methods in\n * the DOM Events interfaces.\n * @param {string} namespaceURI\n * @param {string=} typeArg\n * @param {boolean=} canBubbleArg\n * @param {boolean=} cancelableArg\n * @param {T=} dataArg\n * @param {string=} originArg\n * @param {string=} lastEventIdArg\n * @param {?MessageEventSource=} sourceArg\n * @param {!Array=} portsArg\n * @return {undefined}\n */\nMessageEvent.prototype.initMessageEventNS = function(namespaceURI, typeArg,\n    canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg,\n    portsArg) {};\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://html.spec.whatwg.org/multipage/web-sockets.html#the-closeevent-interface\n */\nfunction CloseEventInit() {}\n\n/**\n * @type {undefined|boolean}\n */\nCloseEventInit.prototype.wasClean;\n\n/**\n * @type {undefined|number}\n */\nCloseEventInit.prototype.code;\n\n/**\n * @type {undefined|string}\n */\nCloseEventInit.prototype.reason;\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {!CloseEventInit=} opt_init\n */\nvar CloseEvent = function(type, opt_init) {};\n\n/**\n * @type {boolean}\n */\nCloseEvent.prototype.wasClean;\n\n/**\n * @type {number}\n */\nCloseEvent.prototype.code;\n\n/**\n * @type {string}\n */\nCloseEvent.prototype.reason;\n\n/**\n * HTML5 BroadcastChannel class.\n * @param {string} channelName\n * @see https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n * @see https://html.spec.whatwg.org/multipage/comms.html#dom-broadcastchannel\n * @implements {EventTarget}\n * @constructor\n */\nfunction BroadcastChannel(channelName) {}\n\n/**\n * Sends the message, of any type of object, to each BroadcastChannel object\n * listening to the same channel.\n * @param {*} message\n */\nBroadcastChannel.prototype.postMessage = function(message) {};\n\n/**\n * Closes the channel object, indicating it won't get any new messages, and\n * allowing it to be, eventually, garbage collected.\n * @return {void}\n */\nBroadcastChannel.prototype.close = function() {};\n\n/** @override */\nBroadcastChannel.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nBroadcastChannel.prototype.dispatchEvent = function(evt) {};\n\n/** @override */\nBroadcastChannel.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/**\n * An EventHandler property that specifies the function to execute when a\n * message event is fired on this object.\n * @type {?function(!MessageEvent<*>)}\n */\nBroadcastChannel.prototype.onmessage;\n\n/**\n * The name of the channel.\n * @type {string}\n */\nBroadcastChannel.prototype.name;\n\n/**\n * HTML5 DataTransfer class.\n *\n * @see http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html\n * @see http://developers.whatwg.org/dnd.html#datatransferitem\n * @constructor\n */\nfunction DataTransfer() {}\n\n/** @type {string} */\nDataTransfer.prototype.dropEffect;\n\n/** @type {string} */\nDataTransfer.prototype.effectAllowed;\n\n/** @type {!Array} */\nDataTransfer.prototype.types;\n\n/** @type {!FileList} */\nDataTransfer.prototype.files;\n\n/**\n * @param {string=} opt_format Format for which to remove data.\n * @return {undefined}\n */\nDataTransfer.prototype.clearData = function(opt_format) {};\n\n/**\n * @param {string} format Format for which to set data.\n * @param {string} data Data to add.\n * @return {boolean}\n */\nDataTransfer.prototype.setData = function(format, data) {};\n\n/**\n * @param {string} format Format for which to set data.\n * @return {string} Data for the given format.\n */\nDataTransfer.prototype.getData = function(format) { return ''; };\n\n/**\n * @param {HTMLElement} img The image to use when dragging.\n * @param {number} x Horizontal position of the cursor.\n * @param {number} y Vertical position of the cursor.\n * @return {undefined}\n */\nDataTransfer.prototype.setDragImage = function(img, x, y) {};\n\n/**\n * @param {HTMLElement} elem Element to receive drag result events.\n * @return {undefined}\n */\nDataTransfer.prototype.addElement = function(elem) {};\n\n/**\n * Addition for accessing clipboard file data that are part of the proposed\n * HTML5 spec.\n * @type {DataTransfer}\n */\nMouseEvent.prototype.dataTransfer;\n\n/**\n * @record\n * @extends {MouseEventInit}\n * @see https://w3c.github.io/uievents/#idl-wheeleventinit\n */\nfunction WheelEventInit() {}\n\n/** @type {undefined|number} */\nWheelEventInit.prototype.deltaX;\n\n/** @type {undefined|number} */\nWheelEventInit.prototype.deltaY;\n\n/** @type {undefined|number} */\nWheelEventInit.prototype.deltaZ;\n\n/** @type {undefined|number} */\nWheelEventInit.prototype.deltaMode;\n\n/**\n * @param {string} type\n * @param {WheelEventInit=} opt_eventInitDict\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#interface-WheelEvent\n * @constructor\n * @extends {MouseEvent}\n */\nfunction WheelEvent(type, opt_eventInitDict) {}\n\n/** @const {number} */\nWheelEvent.DOM_DELTA_PIXEL;\n\n/** @const {number} */\nWheelEvent.DOM_DELTA_LINE;\n\n/** @const {number} */\nWheelEvent.DOM_DELTA_PAGE;\n\n/** @const {number} */\nWheelEvent.prototype.deltaX;\n\n/** @const {number} */\nWheelEvent.prototype.deltaY;\n\n/** @const {number} */\nWheelEvent.prototype.deltaZ;\n\n/** @const {number} */\nWheelEvent.prototype.deltaMode;\n\n/**\n * HTML5 DataTransferItem class.\n *\n * @see http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html\n * @see http://developers.whatwg.org/dnd.html#datatransferitem\n * @constructor\n */\nfunction DataTransferItem() {}\n\n/** @type {string} */\nDataTransferItem.prototype.kind;\n\n/** @type {string} */\nDataTransferItem.prototype.type;\n\n/**\n * @param {function(string)} callback\n * @return {undefined}\n */\nDataTransferItem.prototype.getAsString = function(callback) {};\n\n/**\n * @return {?File} The file corresponding to this item, or null.\n * @nosideeffects\n */\nDataTransferItem.prototype.getAsFile = function() { return null; };\n\n/**\n * HTML5 DataTransferItemList class. There are some discrepancies in the docs\n * on the whatwg.org site. When in doubt, these prototypes match what is\n * implemented as of Chrome 30.\n *\n * @see http://www.w3.org/TR/2011/WD-html5-20110113/dnd.html\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html\n * @see http://developers.whatwg.org/dnd.html#datatransferitem\n * @constructor\n * @implements {IArrayLike}\n */\nfunction DataTransferItemList() {}\n\n/** @type {number} */\nDataTransferItemList.prototype.length;\n\n/**\n * @param {number} i File to return from the list.\n * @return {DataTransferItem} The ith DataTransferItem in the list, or null.\n * @nosideeffects\n */\nDataTransferItemList.prototype.item = function(i) { return null; };\n\n/**\n * Adds an item to the list.\n * @param {string|!File} data Data for the item being added.\n * @param {string=} opt_type Mime type of the item being added. MUST be present\n *     if the {@code data} parameter is a string.\n * @return {DataTransferItem}\n */\nDataTransferItemList.prototype.add = function(data, opt_type) {};\n\n/**\n * Removes an item from the list.\n * @param {number} i File to remove from the list.\n * @return {undefined}\n */\nDataTransferItemList.prototype.remove = function(i) {};\n\n/**\n * Removes all items from the list.\n * @return {undefined}\n */\nDataTransferItemList.prototype.clear = function() {};\n\n/** @type {!DataTransferItemList} */\nDataTransfer.prototype.items;\n\n/**\n * @record\n * @extends {MouseEventInit}\n * @see http://w3c.github.io/html/editing.html#dictdef-drageventinit\n */\nfunction DragEventInit() {}\n\n/** @type {undefined|?DataTransfer} */\nDragEventInit.prototype.dataTransfer;\n\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dragevent-interface\n * @constructor\n * @extends {MouseEvent}\n * @param {string} type\n * @param {DragEventInit=} opt_eventInitDict\n */\nfunction DragEvent(type, opt_eventInitDict) {}\n\n/** @type {DataTransfer} */\nDragEvent.prototype.dataTransfer;\n\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/progress-events/#progresseventinit\n */\nfunction ProgressEventInit() {}\n\n/** @type {undefined|boolean} */\nProgressEventInit.prototype.lengthComputable;\n\n/** @type {undefined|number} */\nProgressEventInit.prototype.loaded;\n\n/** @type {undefined|number} */\nProgressEventInit.prototype.total;\n\n/**\n * @constructor\n * @template TARGET\n * @param {string} type\n * @param {ProgressEventInit=} opt_progressEventInitDict\n * @extends {Event}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent\n */\nfunction ProgressEvent(type, opt_progressEventInitDict) {}\n\n/**\n * @override\n * @type {TARGET}\n */\nProgressEvent.prototype.target;\n\n/** @type {number} */\nProgressEvent.prototype.total;\n\n/** @type {number} */\nProgressEvent.prototype.loaded;\n\n/** @type {boolean} */\nProgressEvent.prototype.lengthComputable;\n\n\n/**\n * @constructor\n */\nfunction TimeRanges() {}\n\n/** @type {number} */\nTimeRanges.prototype.length;\n\n/**\n * @param {number} index The index.\n * @return {number} The start time of the range at index.\n * @throws {DOMException}\n */\nTimeRanges.prototype.start = function(index) { return 0; };\n\n/**\n * @param {number} index The index.\n * @return {number} The end time of the range at index.\n * @throws {DOMException}\n */\nTimeRanges.prototype.end = function(index) { return 0; };\n\n\n// HTML5 Web Socket class\n/**\n * @see https://html.spec.whatwg.org/multipage/web-sockets.html\n * @constructor\n * @param {string} url\n * @param {(string|!Array)=} opt_protocol\n * @implements {EventTarget}\n */\nfunction WebSocket(url, opt_protocol) {}\n\n/**\n * The connection has not yet been established.\n * @const {number}\n */\nWebSocket.CONNECTING;\n\n/**\n * The connection has not yet been established.\n * @const {number}\n */\nWebSocket.prototype.CONNECTING;\n\n/**\n * The WebSocket connection is established and communication is possible.\n * @const {number}\n */\nWebSocket.OPEN;\n\n/**\n * The WebSocket connection is established and communication is possible.\n * @const {number}\n */\nWebSocket.prototype.OPEN;\n\n/**\n * The connection is going through the closing handshake, or the close() method has been invoked.\n * @const {number}\n */\nWebSocket.CLOSING;\n\n/**\n * The connection is going through the closing handshake, or the close() method has been invoked.\n * @const {number}\n */\nWebSocket.prototype.CLOSING;\n\n/**\n * The connection has been closed or could not be opened.\n * @const {number}\n */\nWebSocket.CLOSED;\n\n/**\n * The connection has been closed or could not be opened.\n * @const {number}\n */\nWebSocket.prototype.CLOSED;\n\n/** @override */\nWebSocket.prototype.addEventListener = function(type, listener, opt_options) {};\n\n/** @override */\nWebSocket.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nWebSocket.prototype.dispatchEvent = function(evt) {};\n\n/**\n * Returns the URL value that was passed to the constructor.\n * @type {string}\n */\nWebSocket.prototype.url;\n\n/**\n * Represents the state of the connection.\n * @type {number}\n */\nWebSocket.prototype.readyState;\n\n/**\n * Returns the number of bytes that have been queued but not yet sent.\n * @type {number}\n */\nWebSocket.prototype.bufferedAmount;\n\n/**\n * An event handler called on error event.\n * @type {?function(!Event): void}\n */\nWebSocket.prototype.onerror;\n\n/**\n * An event handler called on open event.\n * @type {?function(!Event): void}\n */\nWebSocket.prototype.onopen;\n\n/**\n * An event handler called on message event.\n * @type {?function(!MessageEvent): void}\n */\nWebSocket.prototype.onmessage;\n\n/**\n * An event handler called on close event.\n * @type {?function(!CloseEvent): void}\n */\nWebSocket.prototype.onclose;\n\n/**\n * Transmits data using the connection.\n * @param {string|!ArrayBuffer|!ArrayBufferView|!Blob} data\n * @return {void}\n */\nWebSocket.prototype.send = function(data) {};\n\n/**\n * Closes the Web Socket connection or connection attempt, if any.\n * @param {number=} opt_code\n * @param {string=} opt_reason\n * @return {undefined}\n */\nWebSocket.prototype.close = function(opt_code, opt_reason) {};\n\n/**\n * @type {string} Sets the type of data (blob or arraybuffer) for binary data.\n */\nWebSocket.prototype.binaryType;\n\n// HTML5 History\n/**\n * @constructor\n * @see http://w3c.github.io/html/browsers.html#the-history-interface\n */\nfunction History() {}\n\n/**\n * Goes back one step in the joint session history.\n * If there is no previous page, does nothing.\n *\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-history-back\n *\n * @return {undefined}\n */\nHistory.prototype.back = function() {};\n\n/**\n * Goes forward one step in the joint session history.\n * If there is no next page, does nothing.\n *\n * @return {undefined}\n */\nHistory.prototype.forward = function() {};\n\n/**\n * The number of entries in the joint session history.\n *\n * @type {number}\n */\nHistory.prototype.length;\n\n/**\n * Goes back or forward the specified number of steps in the joint session\n * history. A zero delta will reload the current page. If the delta is out of\n * range, does nothing.\n *\n * @param {number} delta The number of entries to go back.\n * @return {undefined}\n */\nHistory.prototype.go = function(delta) {};\n\n/**\n * Pushes a new state into the session history.\n * @see http://www.w3.org/TR/html5/history.html#the-history-interface\n * @param {*} data New state.\n * @param {string} title The title for a new session history entry.\n * @param {string=} opt_url The URL for a new session history entry.\n * @return {undefined}\n */\nHistory.prototype.pushState = function(data, title, opt_url) {};\n\n/**\n * Replaces the current state in the session history.\n * @see http://www.w3.org/TR/html5/history.html#the-history-interface\n * @param {*} data New state.\n * @param {string} title The title for a session history entry.\n * @param {string=} opt_url The URL for a new session history entry.\n * @return {undefined}\n */\nHistory.prototype.replaceState = function(data, title, opt_url) {};\n\n/**\n * Pending state object.\n * @see https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#Reading_the_current_state\n * @type {*}\n */\nHistory.prototype.state;\n\n/**\n * Allows web applications to explicitly set default scroll restoration behavior\n * on history navigation. This property can be either auto or manual.\n *\n * Non-standard. Only supported in Chrome 46+.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/History\n * @see https://majido.github.io/scroll-restoration-proposal/history-based-api.html\n * @type {string}\n */\nHistory.prototype.scrollRestoration;\n\n/**\n * Add history property to Window.\n *\n * @type {!History}\n */\nWindow.prototype.history;\n\n/**\n * @constructor\n * @see https://html.spec.whatwg.org/multipage/history.html#the-location-interface\n */\nfunction Location() {}\n\n/**\n * Returns the Location object's URL. Can be set, to navigate to the given URL.\n * @implicitCast\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-href\n */\nLocation.prototype.href;\n\n/**\n * Returns the Location object's URL's origin.\n * @const {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-origin\n */\nLocation.prototype.origin;\n\n/**\n * Returns the Location object's URL's scheme. Can be set, to navigate to the\n * same URL with a changed scheme.\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-protocol\n */\nLocation.prototype.protocol;\n\n/**\n * Returns the Location object's URL's host and port (if different from the\n * default port for the scheme). Can be set, to navigate to the same URL with\n * a changed host and port.\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-host\n */\nLocation.prototype.host;\n\n/**\n * Returns the Location object's URL's host. Can be set, to navigate to the\n * same URL with a changed host.\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-hostname\n */\nLocation.prototype.hostname;\n\n/**\n * Returns the Location object's URL's port. Can be set, to navigate to the\n * same URL with a changed port.\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#the-location-interface:dom-location-port\n */\nLocation.prototype.port;\n\n/**\n * Returns the Location object's URL's path. Can be set, to navigate to the\n * same URL with a changed path.\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-pathname\n */\nLocation.prototype.pathname;\n\n/**\n * Returns the Location object's URL's query (includes leading \"?\" if\n * non-empty). Can be set, to navigate to the same URL with a changed query\n * (ignores leading \"?\").\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-search\n */\nLocation.prototype.search;\n\n/**\n * Returns the Location object's URL's fragment (includes leading \"#\" if\n * non-empty). Can be set, to navigate to the same URL with a changed fragment\n * (ignores leading \"#\").\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-hash\n */\nLocation.prototype.hash;\n\n/**\n * Navigates to the given page.\n * @param {string} url\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-assign\n */\nLocation.prototype.assign = function(url) {};\n\n/**\n * Removes the current page from the session history and navigates to the given\n * page.\n * @param {string} url\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-replace\n */\nLocation.prototype.replace = function(url) {};\n\n/**\n * Reloads the current page.\n * @param {boolean=} forceReload If true, reloads the page from\n *     the server. Defaults to false.\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-reload\n */\nLocation.prototype.reload = function(forceReload) {};\n\n/**\n * Returns a DOMStringList object listing the origins of the ancestor browsing\n * contexts, from the parent browsing context to the top-level browsing\n * context.\n * @type {DOMStringList}\n * @see https://html.spec.whatwg.org/multipage/history.html#dom-location-ancestororigins\n */\nLocation.prototype.ancestorOrigins;\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/#popstateevent\n * @constructor\n * @extends {Event}\n *\n * @param {string} type\n * @param {{state: *}=} opt_eventInitDict\n */\nfunction PopStateEvent(type, opt_eventInitDict) {}\n\n/**\n * @type {*}\n */\nPopStateEvent.prototype.state;\n\n/**\n * Initializes the event after it has been created with document.createEvent\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {*} stateArg\n * @return {undefined}\n */\nPopStateEvent.prototype.initPopStateEvent = function(typeArg, canBubbleArg,\n    cancelableArg, stateArg) {};\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/#hashchangeevent\n * @constructor\n * @extends {Event}\n *\n * @param {string} type\n * @param {{oldURL: string, newURL: string}=} opt_eventInitDict\n */\nfunction HashChangeEvent(type, opt_eventInitDict) {}\n\n/** @type {string} */\nHashChangeEvent.prototype.oldURL;\n\n/** @type {string} */\nHashChangeEvent.prototype.newURL;\n\n/**\n * Initializes the event after it has been created with document.createEvent\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {string} oldURLArg\n * @param {string} newURLArg\n * @return {undefined}\n */\nHashChangeEvent.prototype.initHashChangeEvent = function(typeArg, canBubbleArg,\n    cancelableArg, oldURLArg, newURLArg) {};\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/#pagetransitionevent\n * @constructor\n * @extends {Event}\n *\n * @param {string} type\n * @param {{persisted: boolean}=} opt_eventInitDict\n */\nfunction PageTransitionEvent(type, opt_eventInitDict) {}\n\n/** @type {boolean} */\nPageTransitionEvent.prototype.persisted;\n\n/**\n * Initializes the event after it has been created with document.createEvent\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {*} persistedArg\n * @return {undefined}\n */\nPageTransitionEvent.prototype.initPageTransitionEvent = function(typeArg,\n    canBubbleArg, cancelableArg, persistedArg) {};\n\n/**\n * @constructor\n * @implements {IArrayLike}\n */\nfunction FileList() {}\n\n/** @type {number} */\nFileList.prototype.length;\n\n/**\n * @param {number} i File to return from the list.\n * @return {File} The ith file in the list.\n * @nosideeffects\n */\nFileList.prototype.item = function(i) { return null; };\n\n/**\n * @type {boolean}\n * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#withcredentials\n */\nXMLHttpRequest.prototype.withCredentials;\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://xhr.spec.whatwg.org/#handler-xhr-onloadstart\n */\nXMLHttpRequest.prototype.onloadstart;\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#handler-xhr-onprogress\n */\nXMLHttpRequest.prototype.onprogress;\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://xhr.spec.whatwg.org/#handler-xhr-onabort\n */\nXMLHttpRequest.prototype.onabort;\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://xhr.spec.whatwg.org/#handler-xhr-onload\n */\nXMLHttpRequest.prototype.onload;\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://xhr.spec.whatwg.org/#handler-xhr-ontimeout\n */\nXMLHttpRequest.prototype.ontimeout;\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://xhr.spec.whatwg.org/#handler-xhr-onloadend\n */\nXMLHttpRequest.prototype.onloadend;\n\n/**\n * @type {XMLHttpRequestUpload}\n * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#the-upload-attribute\n */\nXMLHttpRequest.prototype.upload;\n\n/**\n * @param {string} mimeType The mime type to override with.\n * @return {undefined}\n */\nXMLHttpRequest.prototype.overrideMimeType = function(mimeType) {};\n\n/**\n * @type {string}\n * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#the-responsetype-attribute\n */\nXMLHttpRequest.prototype.responseType;\n\n/**\n * @type {?(ArrayBuffer|Blob|Document|Object|string)}\n * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#the-response-attribute\n */\nXMLHttpRequest.prototype.response;\n\n/**\n * Trust Tokens operation (issuance, signing, and redemption) is specified via\n * an instance of the following parameters struct, provided via Fetch, XHR, or\n * the iframe tag.\n * @typedef {{\n *     type: string,\n *     issuer: string,\n *     refreshPolicy: string,\n *     signRequestData: string,\n *     includeTimestampHeader: boolean,\n *     additionalSignedHeaders: !Array\n *   }}\n * @see https://docs.google.com/document/d/1qUjtKgA7nMv9YGMhi0xWKEojkSITKzGLdIcZgoz6ZkI\n */\nvar TrustTokenAttributeType;\n\n/**\n * @type {?function(!TrustTokenAttributeType): void}\n * @see https://docs.google.com/document/d/1qUjtKgA7nMv9YGMhi0xWKEojkSITKzGLdIcZgoz6ZkI.\n */\nXMLHttpRequest.prototype.setTrustToken;\n\n/**\n * @type {ArrayBuffer}\n * Implemented as a draft spec in Firefox 4 as the way to get a requested array\n * buffer from an XMLHttpRequest.\n * @see https://developer.mozilla.org/En/Using_XMLHttpRequest#Receiving_binary_data_using_JavaScript_typed_arrays\n *\n * This property is not used anymore and should be removed.\n * @see https://github.com/google/closure-compiler/pull/1389\n */\nXMLHttpRequest.prototype.mozResponseArrayBuffer;\n\n/**\n * XMLHttpRequestEventTarget defines events for checking the status of a data\n * transfer between a client and a server. This should be a common base class\n * for XMLHttpRequest and XMLHttpRequestUpload.\n *\n * @constructor\n * @implements {EventTarget}\n */\nfunction XMLHttpRequestEventTarget() {}\n\n/** @override */\nXMLHttpRequestEventTarget.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nXMLHttpRequestEventTarget.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nXMLHttpRequestEventTarget.prototype.dispatchEvent = function(evt) {};\n\n/**\n * An event target to track the status of an upload.\n *\n * @constructor\n * @extends {XMLHttpRequestEventTarget}\n */\nfunction XMLHttpRequestUpload() {}\n\n/**\n * @type {?function(!ProgressEvent): void}\n * @see https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#handler-xhr-onprogress\n */\nXMLHttpRequestUpload.prototype.onprogress;\n\n/**\n * @param {number=} opt_width\n * @param {number=} opt_height\n * @constructor\n * @extends {HTMLImageElement}\n */\nfunction Image(opt_width, opt_height) {}\n\n\n/**\n * Dataset collection.\n * This is really a DOMStringMap but it behaves close enough to an object to\n * pass as an object.\n * @const {!Object}\n */\nHTMLElement.prototype.dataset;\n\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see https://dom.spec.whatwg.org/#interface-domtokenlist\n */\nfunction DOMTokenList() {}\n\n/**\n * Returns the number of CSS classes applied to this Element.\n * @type {number}\n */\nDOMTokenList.prototype.length;\n\n/**\n * Returns the string value applied to this Element.\n * @type {string|undefined}\n */\nDOMTokenList.prototype.value;\n\n/**\n * @param {number} index The index of the item to return.\n * @return {string} The CSS class at the specified index.\n * @nosideeffects\n */\nDOMTokenList.prototype.item = function(index) {};\n\n/**\n * @param {string} token The CSS class to check for.\n * @return {boolean} Whether the CSS class has been applied to the Element.\n * @nosideeffects\n */\nDOMTokenList.prototype.contains = function(token) {};\n\n/**\n * @param {...string} var_args The CSS class(es) to add to this element.\n * @return {undefined}\n */\nDOMTokenList.prototype.add = function(var_args) {};\n\n/**\n * @param {...string} var_args The CSS class(es) to remove from this element.\n * @return {undefined}\n */\nDOMTokenList.prototype.remove = function(var_args) {};\n\n/**\n * Replaces token with newToken.\n * @param {string} token The CSS class to replace.\n * @param {string} newToken The new CSS class to use.\n * @return {undefined}\n */\nDOMTokenList.prototype.replace = function(token, newToken) {};\n\n/**\n * @param {string} token The token to query for.\n * @return {boolean} Whether the token was found.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/supports\n * @nosideeffects\n */\nDOMTokenList.prototype.supports = function(token) {};\n\n/**\n * @param {string} token The CSS class to toggle from this element.\n * @param {boolean=} opt_force True to add the class whether it exists\n *     or not. False to remove the class whether it exists or not.\n *     This argument is not supported on IE 10 and below, according to\n *     the MDN page linked below.\n * @return {boolean} False if the token was removed; True otherwise.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element.classList\n */\nDOMTokenList.prototype.toggle = function(token, opt_force) {};\n\n/**\n * @return {string} A stringified representation of CSS classes.\n * @nosideeffects\n * @override\n */\nDOMTokenList.prototype.toString = function() {};\n\n/**\n * @return {!IteratorIterable} An iterator to go through all values of\n *     the key/value pairs contained in this object.\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList/values\n */\nDOMTokenList.prototype.values = function() {};\n\n/**\n * A better interface to CSS classes than className.\n * @const {!DOMTokenList}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/classList\n */\nElement.prototype.classList;\n\n/**\n * Constraint Validation API properties and methods\n * @see http://www.w3.org/TR/2009/WD-html5-20090423/forms.html#the-constraint-validation-api\n */\n\n/** @return {boolean} */\nHTMLFormElement.prototype.checkValidity = function() {};\n\n/** @return {boolean} */\nHTMLFormElement.prototype.reportValidity = function() {};\n\n/** @type {boolean} */\nHTMLFormElement.prototype.noValidate;\n\n/** @constructor */\nfunction ValidityState() {}\n\n/** @type {boolean} */\nValidityState.prototype.badInput;\n\n/** @type {boolean} */\nValidityState.prototype.customError;\n\n/** @type {boolean} */\nValidityState.prototype.patternMismatch;\n\n/** @type {boolean} */\nValidityState.prototype.rangeOverflow;\n\n/** @type {boolean} */\nValidityState.prototype.rangeUnderflow;\n\n/** @type {boolean} */\nValidityState.prototype.stepMismatch;\n\n/** @type {boolean} */\nValidityState.prototype.typeMismatch;\n\n/** @type {boolean} */\nValidityState.prototype.tooLong;\n\n/** @type {boolean} */\nValidityState.prototype.tooShort;\n\n/** @type {boolean} */\nValidityState.prototype.valid;\n\n/** @type {boolean} */\nValidityState.prototype.valueMissing;\n\n\n/** @type {boolean} */\nHTMLButtonElement.prototype.autofocus;\n\n/**\n * Can return null when hidden.\n * See https://html.spec.whatwg.org/multipage/forms.html#dom-lfe-labels\n * @const {?NodeList}\n */\nHTMLButtonElement.prototype.labels;\n\n/** @type {string} */\nHTMLButtonElement.prototype.validationMessage;\n\n/**\n * @const {ValidityState}\n */\nHTMLButtonElement.prototype.validity;\n\n/** @type {boolean} */\nHTMLButtonElement.prototype.willValidate;\n\n/** @return {boolean} */\nHTMLButtonElement.prototype.checkValidity = function() {};\n\n/** @return {boolean} */\nHTMLButtonElement.prototype.reportValidity = function() {};\n\n/**\n * @param {string} message\n * @return {undefined}\n */\nHTMLButtonElement.prototype.setCustomValidity = function(message) {};\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formaction\n */\nHTMLButtonElement.prototype.formAction;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formenctype\n */\nHTMLButtonElement.prototype.formEnctype;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formmethod\n */\nHTMLButtonElement.prototype.formMethod;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formtarget\n */\nHTMLButtonElement.prototype.formTarget;\n\n/** @type {boolean} */\nHTMLInputElement.prototype.autofocus;\n\n/** @type {boolean} */\nHTMLInputElement.prototype.formNoValidate;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formaction\n */\nHTMLInputElement.prototype.formAction;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formenctype\n */\nHTMLInputElement.prototype.formEnctype;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formmethod\n */\nHTMLInputElement.prototype.formMethod;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/forms.html#attr-fs-formtarget\n */\nHTMLInputElement.prototype.formTarget;\n\n/**\n * Can return null when hidden.\n * See https://html.spec.whatwg.org/multipage/forms.html#dom-lfe-labels\n * @const {?NodeList}\n */\nHTMLInputElement.prototype.labels;\n\n/** @type {string} */\nHTMLInputElement.prototype.validationMessage;\n\n/**\n * @type {number}\n * @implicitCast\n */\nHTMLInputElement.prototype.selectionStart;\n\n/**\n * @type {number}\n * @implicitCast\n */\nHTMLInputElement.prototype.selectionEnd;\n\n/** @type {string} */\nHTMLInputElement.prototype.selectionDirection;\n\n/**\n * @param {number} start\n * @param {number} end\n * @param {string=} direction\n * @see https://html.spec.whatwg.org/#dom-textarea/input-setselectionrange\n * @return {undefined}\n */\nHTMLInputElement.prototype.setSelectionRange = function(start, end, direction) {};\n\n/**\n * @const {ValidityState}\n */\nHTMLInputElement.prototype.validity;\n\n/** @type {boolean} */\nHTMLInputElement.prototype.willValidate;\n\n/** @return {boolean} */\nHTMLInputElement.prototype.checkValidity = function() {};\n\n/** @return {boolean} */\nHTMLInputElement.prototype.reportValidity = function() {};\n\n/**\n * @param {string} message\n * @return {undefined}\n */\nHTMLInputElement.prototype.setCustomValidity = function(message) {};\n\n/** @type {Element} */\nHTMLLabelElement.prototype.control;\n\n/** @type {boolean} */\nHTMLSelectElement.prototype.autofocus;\n\n/**\n * Can return null when hidden.\n * See https://html.spec.whatwg.org/multipage/forms.html#dom-lfe-labels\n * @const {?NodeList}\n */\nHTMLSelectElement.prototype.labels;\n\n/** @type {HTMLCollection} */\nHTMLSelectElement.prototype.selectedOptions;\n\n/** @type {string} */\nHTMLSelectElement.prototype.validationMessage;\n\n/**\n * @const {ValidityState}\n */\nHTMLSelectElement.prototype.validity;\n\n/** @type {boolean} */\nHTMLSelectElement.prototype.willValidate;\n\n/** @return {boolean} */\nHTMLSelectElement.prototype.checkValidity = function() {};\n\n/** @return {boolean} */\nHTMLSelectElement.prototype.reportValidity = function() {};\n\n/**\n * @param {string} message\n * @return {undefined}\n */\nHTMLSelectElement.prototype.setCustomValidity = function(message) {};\n\n/** @type {boolean} */\nHTMLTextAreaElement.prototype.autofocus;\n\n/**\n * Can return null when hidden.\n * See https://html.spec.whatwg.org/multipage/forms.html#dom-lfe-labels\n * @const {?NodeList}\n */\nHTMLTextAreaElement.prototype.labels;\n\n/** @type {number} */\nHTMLTextAreaElement.prototype.maxLength;\n\n/** @type {number} */\nHTMLTextAreaElement.prototype.minLength;\n\n/** @type {string} */\nHTMLTextAreaElement.prototype.placeholder;\n\n/** @type {number} */\nHTMLTextAreaElement.prototype.textLength;\n\n/** @type {string} */\nHTMLTextAreaElement.prototype.validationMessage;\n\n/**\n * @const {ValidityState}\n */\nHTMLTextAreaElement.prototype.validity;\n\n/** @type {boolean} */\nHTMLTextAreaElement.prototype.willValidate;\n\n/** @return {boolean} */\nHTMLTextAreaElement.prototype.checkValidity = function() {};\n\n/** @return {boolean} */\nHTMLTextAreaElement.prototype.reportValidity = function() {};\n\n/**\n * @param {string} message\n * @return {undefined}\n */\nHTMLTextAreaElement.prototype.setCustomValidity = function(message) {};\n\n/**\n * @constructor\n * @extends {HTMLElement}\n * @see http://www.w3.org/TR/html5/the-embed-element.html#htmlembedelement\n */\nfunction HTMLEmbedElement() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/dimension-attributes.html#dom-dim-width\n */\nHTMLEmbedElement.prototype.width;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/dimension-attributes.html#dom-dim-height\n */\nHTMLEmbedElement.prototype.height;\n\n/**\n * @type {string}\n * @implicitCast\n * @see http://www.w3.org/TR/html5/the-embed-element.html#dom-embed-src\n */\nHTMLEmbedElement.prototype.src;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/html5/the-embed-element.html#dom-embed-type\n */\nHTMLEmbedElement.prototype.type;\n\n// Fullscreen APIs.\n\n/**\n * @record\n * @see https://fullscreen.spec.whatwg.org/#dictdef-fullscreenoptions\n */\nfunction FullscreenOptions() {}\n\n/** @type {string} */\nFullscreenOptions.prototype.navigationUI;\n\n/**\n * @see https://fullscreen.spec.whatwg.org/#dom-element-requestfullscreen\n * @param {!FullscreenOptions=} options\n * @return {!Promise}\n */\nElement.prototype.requestFullscreen = function(options) {};\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/2012/WD-fullscreen-20120703/#dom-document-fullscreenenabled\n */\nDocument.prototype.fullscreenEnabled;\n\n/**\n * @type {Element}\n * @see http://www.w3.org/TR/2012/WD-fullscreen-20120703/#dom-document-fullscreenelement\n */\nDocument.prototype.fullscreenElement;\n\n/**\n * @see http://www.w3.org/TR/2012/WD-fullscreen-20120703/#dom-document-exitfullscreen\n * @return {undefined}\n */\nDocument.prototype.exitFullscreen = function() {};\n\n// Externs definitions of browser current implementations.\n// Firefox 10 implementation.\nElement.prototype.mozRequestFullScreen = function() {};\n\nElement.prototype.mozRequestFullScreenWithKeys = function() {};\n\n/** @type {boolean} */\nDocument.prototype.mozFullScreen;\n\nDocument.prototype.mozCancelFullScreen = function() {};\n\n/** @type {Element} */\nDocument.prototype.mozFullScreenElement;\n\n/** @type {boolean} */\nDocument.prototype.mozFullScreenEnabled;\n\n// Chrome 21 implementation.\n/**\n * The current fullscreen element for the document is set to this element.\n * Valid only for Webkit browsers.\n * @param {number=} opt_allowKeyboardInput Whether keyboard input is desired.\n *     Should use ALLOW_KEYBOARD_INPUT constant.\n * @return {undefined}\n */\nElement.prototype.webkitRequestFullScreen = function(opt_allowKeyboardInput) {};\n\n/**\n * The current fullscreen element for the document is set to this element.\n * Valid only for Webkit browsers.\n * @param {number=} opt_allowKeyboardInput Whether keyboard input is desired.\n *     Should use ALLOW_KEYBOARD_INPUT constant.\n * @return {undefined}\n */\nElement.prototype.webkitRequestFullscreen = function(opt_allowKeyboardInput) {};\n\n/** @type {boolean} */\nDocument.prototype.webkitIsFullScreen;\n\nDocument.prototype.webkitCancelFullScreen = function() {};\n\n/** @type {boolean} */\nDocument.prototype.webkitFullscreenEnabled;\n\n/** @type {Element} */\nDocument.prototype.webkitCurrentFullScreenElement;\n\n/** @type {Element} */\nDocument.prototype.webkitFullscreenElement;\n\n/** @type {boolean} */\nDocument.prototype.webkitFullScreenKeyboardInputAllowed;\n\n// IE 11 implementation.\n// http://msdn.microsoft.com/en-us/library/ie/dn265028(v=vs.85).aspx\n/** @return {void} */\nElement.prototype.msRequestFullscreen = function() {};\n\n/** @return {void} */\nDocument.prototype.msExitFullscreen = function() {};\n\n/** @type {boolean} */\nDocument.prototype.msFullscreenEnabled;\n\n/** @type {Element} */\nDocument.prototype.msFullscreenElement;\n\n/** @const {number} */\nElement.ALLOW_KEYBOARD_INPUT;\n\n/** @const {number} */\nElement.prototype.ALLOW_KEYBOARD_INPUT;\n\n\n/**\n * @typedef {{\n *   childList: (boolean|undefined),\n *   attributes: (boolean|undefined),\n *   characterData: (boolean|undefined),\n *   subtree: (boolean|undefined),\n *   attributeOldValue: (boolean|undefined),\n *   characterDataOldValue: (boolean|undefined),\n *   attributeFilter: (!Array|undefined)\n * }}\n */\nvar MutationObserverInit;\n\n\n/** @constructor */\nfunction MutationRecord() {}\n\n/** @type {string} */\nMutationRecord.prototype.type;\n\n/** @type {Node} */\nMutationRecord.prototype.target;\n\n/** @type {!NodeList} */\nMutationRecord.prototype.addedNodes;\n\n/** @type {!NodeList} */\nMutationRecord.prototype.removedNodes;\n\n/** @type {?Node} */\nMutationRecord.prototype.previousSibling;\n\n/** @type {?Node} */\nMutationRecord.prototype.nextSibling;\n\n/** @type {?string} */\nMutationRecord.prototype.attributeName;\n\n/** @type {?string} */\nMutationRecord.prototype.attributeNamespace;\n\n/** @type {?string} */\nMutationRecord.prototype.oldValue;\n\n\n/**\n * @see http://www.w3.org/TR/domcore/#mutation-observers\n * @param {function(!Array, !MutationObserver)} callback\n * @constructor\n */\nfunction MutationObserver(callback) {}\n\n/**\n * @param {Node} target\n * @param {MutationObserverInit=} options\n * @return {undefined}\n */\nMutationObserver.prototype.observe = function(target, options) {};\n\nMutationObserver.prototype.disconnect = function() {};\n\n/**\n * @return {!Array}\n */\nMutationObserver.prototype.takeRecords = function() {};\n\n/**\n * @type {function(new:MutationObserver, function(Array))}\n */\nWindow.prototype.WebKitMutationObserver;\n\n/**\n * @type {function(new:MutationObserver, function(Array))}\n */\nWindow.prototype.MozMutationObserver;\n\n\n/**\n * @see http://www.w3.org/TR/page-visibility/\n * @type {VisibilityState}\n */\nDocument.prototype.visibilityState;\n\n/**\n * @type {string}\n */\nDocument.prototype.mozVisibilityState;\n\n/**\n * @type {string}\n */\nDocument.prototype.webkitVisibilityState;\n\n/**\n * @type {string}\n */\nDocument.prototype.msVisibilityState;\n\n/**\n * @see http://www.w3.org/TR/page-visibility/\n * @type {boolean}\n */\nDocument.prototype.hidden;\n\n/**\n * @type {boolean}\n */\nDocument.prototype.mozHidden;\n\n/**\n * @type {boolean}\n */\nDocument.prototype.webkitHidden;\n\n/**\n * @type {boolean}\n */\nDocument.prototype.msHidden;\n\n/**\n * @see http://www.w3.org/TR/components-intro/\n * @see http://w3c.github.io/webcomponents/spec/custom/#extensions-to-document-interface-to-register\n * @param {string} type\n * @param {{extends: (string|undefined), prototype: (Object|undefined)}=}\n *     options\n * @return {function(new:Element, ...*)} a constructor for the new tag.\n * @deprecated document.registerElement() is deprecated in favor of\n *     customElements.define()\n */\nDocument.prototype.registerElement = function(type, options) {};\n\n/**\n * @see http://www.w3.org/TR/components-intro/\n * @see http://w3c.github.io/webcomponents/spec/custom/#extensions-to-document-interface-to-register\n * @param {string} type\n * @param {{extends: (string|undefined), prototype: (Object|undefined)}} options\n * @deprecated This method has been removed and will be removed soon from this file.\n */\nDocument.prototype.register = function(type, options) {};\n\n/**\n * @type {!FontFaceSet}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfacesource-fonts\n */\nDocument.prototype.fonts;\n\n\n/**\n * @type {?HTMLScriptElement}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript\n */\nDocument.prototype.currentScript;\n\n/**\n * Definition of ShadowRoot interface,\n * @see http://www.w3.org/TR/shadow-dom/#api-shadow-root\n * @constructor\n * @extends {DocumentFragment}\n */\nfunction ShadowRoot() {}\n\n/**\n * The host element that a ShadowRoot is attached to.\n * Note: this is not yet W3C standard but is undergoing development.\n * W3C feature tracking bug:\n * https://www.w3.org/Bugs/Public/show_bug.cgi?id=22399\n * Draft specification:\n * https://dvcs.w3.org/hg/webcomponents/raw-file/6743f1ace623/spec/shadow/index.html#shadow-root-object\n * @type {!Element}\n */\nShadowRoot.prototype.host;\n\n/**\n * @param {string} id id.\n * @return {HTMLElement}\n * @nosideeffects\n */\nShadowRoot.prototype.getElementById = function(id) {};\n\n\n/**\n * @return {Selection}\n * @nosideeffects\n */\nShadowRoot.prototype.getSelection = function() {};\n\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {Element}\n * @nosideeffects\n */\nShadowRoot.prototype.elementFromPoint = function(x, y) {};\n\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {!IArrayLike}\n * @nosideeffects\n */\nShadowRoot.prototype.elementsFromPoint = function(x, y) {};\n\n\n/**\n * @type {?Element}\n */\nShadowRoot.prototype.activeElement;\n\n\n/**\n * @type {string}\n */\nShadowRoot.prototype.mode;\n\n\n/**\n * @type {?ShadowRoot}\n * @deprecated\n */\nShadowRoot.prototype.olderShadowRoot;\n\n\n/**\n * @type {string}\n * @implicitCast\n */\nShadowRoot.prototype.innerHTML;\n\n\n/**\n * @type {!StyleSheetList}\n */\nShadowRoot.prototype.styleSheets;\n\n\n\n/**\n * @see http://www.w3.org/TR/shadow-dom/#the-content-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLContentElement() {}\n\n/**\n * @type {string}\n */\nHTMLContentElement.prototype.select;\n\n/**\n * @return {!NodeList}\n */\nHTMLContentElement.prototype.getDistributedNodes = function() {};\n\n\n/**\n * @see http://www.w3.org/TR/shadow-dom/#the-shadow-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLShadowElement() {}\n\n/**\n * @return {!NodeList}\n */\nHTMLShadowElement.prototype.getDistributedNodes = function() {};\n\n\n/**\n * @see http://www.w3.org/TR/html5/webappapis.html#the-errorevent-interface\n *\n * @constructor\n * @extends {Event}\n *\n * @param {string} type\n * @param {ErrorEventInit=} opt_eventInitDict\n */\nfunction ErrorEvent(type, opt_eventInitDict) {}\n\n/** @const {string} */\nErrorEvent.prototype.message;\n\n/** @const {string} */\nErrorEvent.prototype.filename;\n\n/** @const {number} */\nErrorEvent.prototype.lineno;\n\n/** @const {number} */\nErrorEvent.prototype.colno;\n\n/** @const {*} */\nErrorEvent.prototype.error;\n\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/html5/webappapis.html#erroreventinit\n */\nfunction ErrorEventInit() {}\n\n/** @type {undefined|string} */\nErrorEventInit.prototype.message;\n\n/** @type {undefined|string} */\nErrorEventInit.prototype.filename;\n\n/** @type {undefined|number} */\nErrorEventInit.prototype.lineno;\n\n/** @type {undefined|number} */\nErrorEventInit.prototype.colno;\n\n/** @type {*} */\nErrorEventInit.prototype.error;\n\n\n/**\n * @see http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument\n * @param {string=} opt_title A title to give the new HTML document\n * @return {!HTMLDocument}\n */\nDOMImplementation.prototype.createHTMLDocument = function(opt_title) {};\n\n\n\n/**\n * @constructor\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element\n * @extends {HTMLElement}\n */\nfunction HTMLPictureElement() {}\n\n/**\n * @constructor\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element\n * @extends {HTMLElement}\n */\nfunction HTMLSourceElement() {}\n\n/** @type {string} */\nHTMLSourceElement.prototype.media;\n\n/** @type {string} */\nHTMLSourceElement.prototype.sizes;\n\n/** @type {string} @implicitCast */\nHTMLSourceElement.prototype.src;\n\n/** @type {string} */\nHTMLSourceElement.prototype.srcset;\n\n/** @type {string} */\nHTMLSourceElement.prototype.type;\n\n/** @type {string} */\nHTMLImageElement.prototype.sizes;\n\n/** @type {string} */\nHTMLImageElement.prototype.srcset;\n\n\n/**\n * 4.11 Interactive elements\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html\n */\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#the-details-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLDetailsElement() {}\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-details-open\n * @type {boolean}\n */\nHTMLDetailsElement.prototype.open;\n\n\n// As of 2/20/2015,  has no special web IDL interface nor global\n// constructor (i.e. HTMLSummaryElement).\n\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menu-type\n * @type {string}\n */\nHTMLMenuElement.prototype.type;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menu-label\n * @type {string}\n */\nHTMLMenuElement.prototype.label;\n\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#the-menuitem-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLMenuItemElement() {}\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-type\n * @type {string}\n */\nHTMLMenuItemElement.prototype.type;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-label\n * @type {string}\n */\nHTMLMenuItemElement.prototype.label;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-icon\n * @type {string}\n */\nHTMLMenuItemElement.prototype.icon;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-disabled\n * @type {boolean}\n */\nHTMLMenuItemElement.prototype.disabled;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-checked\n * @type {boolean}\n */\nHTMLMenuItemElement.prototype.checked;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-radiogroup\n * @type {string}\n */\nHTMLMenuItemElement.prototype.radiogroup;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-menuitem-default\n * @type {boolean}\n */\nHTMLMenuItemElement.prototype.default;\n\n// TODO(dbeam): add HTMLMenuItemElement.prototype.command if it's implemented.\n\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#relatedevent\n * @param {string} type\n * @param {{relatedTarget: (EventTarget|undefined)}=} opt_eventInitDict\n * @constructor\n * @extends {Event}\n */\nfunction RelatedEvent(type, opt_eventInitDict) {}\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-relatedevent-relatedtarget\n * @type {EventTarget|undefined}\n */\nRelatedEvent.prototype.relatedTarget;\n\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#the-dialog-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLDialogElement() {}\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-dialog-open\n * @type {boolean}\n */\nHTMLDialogElement.prototype.open;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-dialog-returnvalue\n * @type {string}\n */\nHTMLDialogElement.prototype.returnValue;\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-dialog-show\n * @param {(MouseEvent|Element)=} opt_anchor\n * @return {undefined}\n */\nHTMLDialogElement.prototype.show = function(opt_anchor) {};\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-dialog-showmodal\n * @param {(MouseEvent|Element)=} opt_anchor\n * @return {undefined}\n */\nHTMLDialogElement.prototype.showModal = function(opt_anchor) {};\n\n/**\n * @see http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#dom-dialog-close\n * @param {string=} opt_returnValue\n * @return {undefined}\n */\nHTMLDialogElement.prototype.close = function(opt_returnValue) {};\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/scripting.html#the-template-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLTemplateElement() {}\n\n/**\n * @see https://html.spec.whatwg.org/multipage/scripting.html#the-template-element\n * @type {!DocumentFragment}\n */\nHTMLTemplateElement.prototype.content;\n\n\n/**\n * @type {?Document}\n * @see w3c_dom2.js\n * @see http://www.w3.org/TR/html-imports/#interface-import\n */\nHTMLLinkElement.prototype.import;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/#attr-link-as\n * @see https://w3c.github.io/preload/#as-attribute\n */\nHTMLLinkElement.prototype.as;\n\n/**\n * @see https://html.spec.whatwg.org/#attr-link-crossorigin\n * @type {string}\n */\nHTMLLinkElement.prototype.crossOrigin;\n\n\n/**\n * @return {boolean}\n * @see https://www.w3.org/TR/html5/forms.html#dom-fieldset-elements\n */\nHTMLFieldSetElement.prototype.checkValidity = function() {};\n\n/**\n * @type {HTMLCollection}\n * @see https://www.w3.org/TR/html5/forms.html#dom-fieldset-elements\n */\nHTMLFieldSetElement.prototype.elements;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/forms.html#the-fieldset-element\n */\nHTMLFieldSetElement.prototype.name;\n\n/**\n * @param {string} message\n * @see https://www.w3.org/TR/html5/forms.html#dom-fieldset-elements\n * @return {undefined}\n */\nHTMLFieldSetElement.prototype.setCustomValidity = function(message) {};\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/forms.html#dom-fieldset-type\n */\nHTMLFieldSetElement.prototype.type;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/forms.html#the-fieldset-element\n */\nHTMLFieldSetElement.prototype.validationMessage;\n\n/**\n * @type {ValidityState}\n * @see https://www.w3.org/TR/html5/forms.html#the-fieldset-element\n */\nHTMLFieldSetElement.prototype.validity;\n\n/**\n * @type {boolean}\n * @see https://www.w3.org/TR/html5/forms.html#the-fieldset-element\n */\nHTMLFieldSetElement.prototype.willValidate;\n\n/**\n * @constructor\n * @extends {NodeList}\n * @template T\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#radionodelist\n */\nfunction RadioNodeList() {}\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#radionodelist\n */\nRadioNodeList.prototype.value;\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/forms.html#the-datalist-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLDataListElement() {}\n\n\n/** @type {HTMLCollection} */\nHTMLDataListElement.prototype.options;\n\n\n/**\n * @return {boolean}\n * @see https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element\n */\nHTMLObjectElement.prototype.checkValidity;\n\n/**\n * @param {string} message\n * @see https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element\n * @return {undefined}\n */\nHTMLObjectElement.prototype.setCustomValidity;\n\n/**\n * @type {string}\n * @see https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element\n */\nHTMLObjectElement.prototype.validationMessage;\n\n/**\n * @type {!ValidityState}\n * @see https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element\n */\nHTMLObjectElement.prototype.validity;\n\n/**\n * @type {boolean}\n * @see https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element\n */\nHTMLObjectElement.prototype.willValidate;\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/forms.html#the-output-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLOutputElement() {}\n\n/**\n * @const {!DOMTokenList}\n */\nHTMLOutputElement.prototype.htmlFor;\n\n/**\n * @type {HTMLFormElement}\n */\nHTMLOutputElement.prototype.form;\n\n/**\n * @type {string}\n */\nHTMLOutputElement.prototype.name;\n\n/**\n * @const {string}\n */\nHTMLOutputElement.prototype.type;\n\n/**\n * @type {string}\n */\nHTMLOutputElement.prototype.defaultValue;\n\n/**\n * @type {string}\n */\nHTMLOutputElement.prototype.value;\n\n/**\n * @const {?NodeList}\n */\nHTMLOutputElement.prototype.labels;\n\n/** @type {string} */\nHTMLOutputElement.prototype.validationMessage;\n\n/**\n * @const {ValidityState}\n */\nHTMLOutputElement.prototype.validity;\n\n/** @type {boolean} */\nHTMLOutputElement.prototype.willValidate;\n\n/** @return {boolean} */\nHTMLOutputElement.prototype.checkValidity = function() {};\n\n/** @return {boolean} */\nHTMLOutputElement.prototype.reportValidity = function() {};\n\n/** @param {string} message */\nHTMLOutputElement.prototype.setCustomValidity = function(message) {};\n\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/forms.html#the-progress-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLProgressElement() {}\n\n\n/** @type {number} */\nHTMLProgressElement.prototype.value;\n\n\n/** @type {number} */\nHTMLProgressElement.prototype.max;\n\n\n/** @type {number} */\nHTMLProgressElement.prototype.position;\n\n\n/** @type {?NodeList} */\nHTMLProgressElement.prototype.labels;\n\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#the-track-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLTrackElement() {}\n\n\n/** @type {string} */\nHTMLTrackElement.prototype.kind;\n\n\n/** @type {string} @implicitCast */\nHTMLTrackElement.prototype.src;\n\n\n/** @type {string} */\nHTMLTrackElement.prototype.srclang;\n\n\n/** @type {string} */\nHTMLTrackElement.prototype.label;\n\n\n/** @type {boolean} */\nHTMLTrackElement.prototype.default;\n\n\n/** @const {number} */\nHTMLTrackElement.prototype.readyState;\n\n\n/** @const {!TextTrack} */\nHTMLTrackElement.prototype.track;\n\n\n\n/**\n * @see https://html.spec.whatwg.org/multipage/forms.html#the-meter-element\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLMeterElement() {}\n\n\n/** @type {number} */\nHTMLMeterElement.prototype.value;\n\n\n/** @type {number} */\nHTMLMeterElement.prototype.min;\n\n\n/** @type {number} */\nHTMLMeterElement.prototype.max;\n\n\n/** @type {number} */\nHTMLMeterElement.prototype.low;\n\n\n/** @type {number} */\nHTMLMeterElement.prototype.high;\n\n\n/** @type {number} */\nHTMLMeterElement.prototype.optimum;\n\n\n/** @type {?NodeList} */\nHTMLMeterElement.prototype.labels;\n\n\n/**\n * @interface\n * @see https://storage.spec.whatwg.org/#api\n */\nfunction NavigatorStorage() {};\n\n/**\n * @type {!StorageManager}\n */\nNavigatorStorage.prototype.storage;\n\n/**\n * @constructor\n * @implements NavigatorStorage\n * @see https://www.w3.org/TR/html5/webappapis.html#navigator\n */\nfunction Navigator() {}\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appcodename\n */\nNavigator.prototype.appCodeName;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appname\n */\nNavigator.prototype.appName;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appversion\n */\nNavigator.prototype.appVersion;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-platform\n */\nNavigator.prototype.platform;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-product\n */\nNavigator.prototype.product;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-useragent\n */\nNavigator.prototype.userAgent;\n\n/**\n * @return {boolean}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-taintenabled\n */\nNavigator.prototype.taintEnabled = function() {};\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-language\n */\nNavigator.prototype.language;\n\n/**\n * @type {boolean}\n * @see https://www.w3.org/TR/html5/browsers.html#navigatoronline\n */\nNavigator.prototype.onLine;\n\n/**\n * @type {boolean}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-cookieenabled\n */\nNavigator.prototype.cookieEnabled;\n\n/**\n * @param {string} scheme\n * @param {string} url\n * @param {string} title\n * @return {undefined}\n */\nNavigator.prototype.registerProtocolHandler = function(scheme, url, title) {}\n\n/**\n * @param {string} mimeType\n * @param {string} url\n * @param {string} title\n * @return {undefined}\n */\nNavigator.prototype.registerContentHandler = function(mimeType, url, title) {}\n\n/**\n * @param {string} scheme\n * @param {string} url\n * @return {undefined}\n */\nNavigator.prototype.unregisterProtocolHandler = function(scheme, url) {}\n\n/**\n * @param {string} mimeType\n * @param {string} url\n * @return {undefined}\n */\nNavigator.prototype.unregisterContentHandler = function(mimeType, url) {}\n\n/**\n * @type {!MimeTypeArray}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-mimetypes\n */\nNavigator.prototype.mimeTypes;\n\n/**\n * @type {!PluginArray}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-plugins\n */\nNavigator.prototype.plugins;\n\n/**\n * @return {boolean}\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-navigator-javaenabled\n * @nosideeffects\n */\nNavigator.prototype.javaEnabled = function() {};\n\n/**\n * @type {number}\n * @see https://developers.google.com/web/updates/2017/12/device-memory\n * https://github.com/w3c/device-memory\n */\nNavigator.prototype.deviceMemory;\n\n/**\n * @type {!StorageManager}\n * @see https://storage.spec.whatwg.org\n */\nNavigator.prototype.storage;\n\n/**\n * @param {!ShareData=} data\n * @return {!Promise}\n * @see https://wicg.github.io/web-share/#share-method\n */\nNavigator.prototype.share = function(data) {};\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/NavigatorConcurrentHardware/hardwareConcurrency\n */\nNavigator.prototype.hardwareConcurrency;\n\n/**\n * @constructor\n * @implements NavigatorStorage\n * @see https://html.spec.whatwg.org/multipage/workers.html#the-workernavigator-object\n */\nfunction WorkerNavigator() {}\n\n/**\n * @type {number}\n * @see https://developers.google.com/web/updates/2017/12/device-memory\n * https://github.com/w3c/device-memory\n */\nWorkerNavigator.prototype.deviceMemory;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/NavigatorConcurrentHardware/hardwareConcurrency\n */\nWorkerNavigator.prototype.hardwareConcurrency;\n\n/**\n * @type {!StorageManager}\n * @see https://storage.spec.whatwg.org\n */\nWorkerNavigator.prototype.storage;\n\n/**\n * @record\n * @see https://wicg.github.io/web-share/#sharedata-dictionary\n */\nfunction ShareData() {}\n\n/** @type {string|undefined} */\nShareData.prototype.title;\n\n/** @type {string|undefined} */\nShareData.prototype.text;\n\n/** @type {string|undefined} */\nShareData.prototype.url;\n\n/**\n * @constructor\n * @implements {IObject<(string|number),!Plugin>}\n * @implements {IArrayLike}\n * @see https://www.w3.org/TR/html5/webappapis.html#pluginarray\n */\nfunction PluginArray() {}\n\n/** @type {number} */\nPluginArray.prototype.length;\n\n/**\n * @param {number} index\n * @return {Plugin}\n */\nPluginArray.prototype.item = function(index) {};\n\n/**\n * @param {string} name\n * @return {Plugin}\n */\nPluginArray.prototype.namedItem = function(name) {};\n\n/**\n * @param {boolean=} reloadDocuments\n * @return {undefined}\n */\nPluginArray.prototype.refresh = function(reloadDocuments) {};\n\n/**\n * @constructor\n * @implements {IObject<(string|number),!MimeType>}\n * @implements {IArrayLike}\n * @see https://www.w3.org/TR/html5/webappapis.html#mimetypearray\n */\nfunction MimeTypeArray() {}\n\n/**\n * @param {number} index\n * @return {MimeType}\n */\nMimeTypeArray.prototype.item = function(index) {};\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/en/DOM/window.navigator.mimeTypes\n */\nMimeTypeArray.prototype.length;\n\n/**\n * @param {string} name\n * @return {MimeType}\n */\nMimeTypeArray.prototype.namedItem = function(name) {};\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/html5/webappapis.html#mimetype\n */\nfunction MimeType() {}\n\n/** @type {string} */\nMimeType.prototype.description;\n\n/** @type {Plugin} */\nMimeType.prototype.enabledPlugin;\n\n/** @type {string} */\nMimeType.prototype.suffixes;\n\n/** @type {string} */\nMimeType.prototype.type;\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/html5/webappapis.html#dom-plugin\n */\nfunction Plugin() {}\n\n/** @type {string} */\nPlugin.prototype.description;\n\n/** @type {string} */\nPlugin.prototype.filename;\n\n/** @type {number} */\nPlugin.prototype.length;\n\n/** @type {string} */\nPlugin.prototype.name;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/custom-elements.html#customelementregistry\n * @constructor\n */\nfunction CustomElementRegistry() {}\n\n/**\n * @param {string} tagName\n * @param {function(new:HTMLElement)} klass\n * @param {{extends: string}=} options\n * @return {undefined}\n */\nCustomElementRegistry.prototype.define = function (tagName, klass, options) {};\n\n/**\n * @param {string} tagName\n * @return {function(new:HTMLElement)|undefined}\n */\nCustomElementRegistry.prototype.get = function(tagName) {};\n\n/**\n * @param {string} tagName\n * @return {!Promise}\n */\nCustomElementRegistry.prototype.whenDefined = function(tagName) {};\n\n/**\n * @param {!Node} root\n * @return {undefined}\n */\nCustomElementRegistry.prototype.upgrade = function(root) {};\n\n/** @type {!CustomElementRegistry} */\nvar customElements;\n\n/**\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLSlotElement() {}\n\n/** @typedef {{flatten: boolean}} */\nvar AssignedNodesOptions;\n\n/**\n * @param {!AssignedNodesOptions=} options\n * @return {!Array}\n */\nHTMLSlotElement.prototype.assignedNodes = function(options) {};\n\n/**\n * @param {!AssignedNodesOptions=} options\n * @return {!Array}\n */\nHTMLSlotElement.prototype.assignedElements = function(options) {};\n\n/** @type {boolean} */\nEvent.prototype.composed;\n\n/**\n * @return {!Array}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath\n */\nEvent.prototype.composedPath = function() {};\n\n/**\n * @constructor\n * @param {{\n *     firesTouchEvents: (string|undefined),\n *     pointerMovementScrolls: (string|undefined)\n *   }=} opt_options\n */\nfunction InputDeviceCapabilities(opt_options){}\n\n/** @type {boolean} */\nInputDeviceCapabilities.prototype.firesTouchEvents;\n\n/** @type {boolean} */\nInputDeviceCapabilities.prototype.pointerMovementScrolls;\n\n/** @type {?InputDeviceCapabilities} */\nMouseEvent.prototype.sourceCapabilities;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/VisualViewport\n * @constructor\n * @implements {EventTarget}\n */\nfunction VisualViewport() {}\n\n/** @type {number} */\nVisualViewport.prototype.offsetLeft;\n\n/** @type {number} */\nVisualViewport.prototype.offsetTop;\n\n/** @type {number} */\nVisualViewport.prototype.pageLeft;\n\n/** @type {number} */\nVisualViewport.prototype.pageTop;\n\n/** @type {number} */\nVisualViewport.prototype.width;\n\n/** @type {number} */\nVisualViewport.prototype.height;\n\n/** @type {number} */\nVisualViewport.prototype.scale;\n\n/** @override */\nVisualViewport.prototype.addEventListener = function(type, listener,\n    opt_options) {};\n\n/** @override */\nVisualViewport.prototype.removeEventListener = function(type, listener,\n    opt_options) {};\n\n/** @override */\nVisualViewport.prototype.dispatchEvent = function(evt) {};\n\n/** @type {?function(!Event)} */\nVisualViewport.prototype.onresize;\n\n/** @type {?function(!Event)} */\nVisualViewport.prototype.onscroll;\n\n/**\n * @see https://storage.spec.whatwg.org/\n * @constructor\n */\nfunction StorageManager() {}\n\n/** @return {!Promise} */\nStorageManager.prototype.persisted = function() {};\n\n/** @return {!Promise} */\nStorageManager.prototype.persist = function() {};\n\n/** @return {!Promise} */\nStorageManager.prototype.estimate = function() {};\n\n/**\n * @see https://storage.spec.whatwg.org/\n * @typedef {{\n *   usage: number,\n *   quota: number\n * }}\n */\nvar StorageEstimate;\n\n/*\n * Focus Management APIs\n *\n * See https://html.spec.whatwg.org/multipage/interaction.html#focus-management-apis\n */\n\n\n/**\n * @type {?Element}\n * @see https://html.spec.whatwg.org/multipage/interaction.html#dom-document-activeelement\n */\nDocument.prototype.activeElement;\n\n/**\n * @see https://html.spec.whatwg.org/multipage/interaction.html#dom-document-hasfocus\n * @return {boolean}\n */\nDocument.prototype.hasFocus = function() {};\n\n/**\n * @param {{preventScroll: boolean}=} options\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/interaction.html#dom-focus\n */\nElement.prototype.focus = function(options) {};\n\n/**\n * @return {undefined}\n * @see https://html.spec.whatwg.org/multipage/interaction.html#dom-blur\n */\nElement.prototype.blur = function() {};\n","externs/gecko_dom.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over\n *  W3C's DOM specification by Gecko. This file depends on\n *  w3c_dom2.js.\n *\n * When a non-standard extension appears in both Gecko and IE, we put\n * it in gecko_dom.js\n *\n * @externs\n * @author [email protected] (Alan Leung)\n */\n\n// TODO: Almost all of it has not been annotated with types.\n\n// Gecko DOM;\n\n/**\n * Mozilla only???\n * @constructor\n * @extends {HTMLElement}\n */\nfunction HTMLSpanElement() {}\n\n/**\n * @see https://developer.mozilla.org/en/Components_object\n */\nWindow.prototype.Components;\n\n/**\n * @type {Window}\n * @see https://developer.mozilla.org/en/DOM/window.content\n */\nWindow.prototype.content;\n\n/** @see https://developer.mozilla.org/en/DOM/window.controllers */\nWindow.prototype.controllers;\n\n/** @see https://developer.mozilla.org/en/DOM/window.crypto */\nWindow.prototype.crypto;\n\n/**\n * Gets/sets the status bar text for the given window.\n * @type {string}\n * @see https://developer.mozilla.org/en/DOM/window.defaultStatus\n */\nWindow.prototype.defaultStatus;\n\n/** @see https://developer.mozilla.org/en/DOM/window.dialogArguments */\nWindow.prototype.dialogArguments;\n\n/** @see https://developer.mozilla.org/en/DOM/window.directories */\nWindow.prototype.directories;\n\n/**\n * @type {boolean}\n * @see https://developer.mozilla.org/en/DOM/window.fullScreen\n */\nWindow.prototype.fullScreen;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/Storage#globalStorage\n */\nWindow.prototype.globalStorage;\n\n/** @see https://developer.mozilla.org/en/DOM/window.pkcs11 */\nWindow.prototype.pkcs11;\n\n/** @see https://developer.mozilla.org/en/DOM/window */\nWindow.prototype.returnValue;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/window.scrollMaxX\n */\nWindow.prototype.scrollMaxX;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/window.scrollMaxY\n */\nWindow.prototype.scrollMaxY;\n\n/** @see https://developer.mozilla.org/en/DOM/Storage#sessionStorage */\nWindow.prototype.sessionStorage;\n\n/** @see https://developer.mozilla.org/en/DOM/window.sidebar */\nWindow.prototype.sidebar;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.back\n * @return {undefined}\n */\nWindow.prototype.back = function() {};\n\n/** @deprecated */\nWindow.prototype.captureEvents;\n\n/**@see https://developer.mozilla.org/en/DOM/window.find */\nWindow.prototype.find;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.forward\n * @return {undefined}\n */\nWindow.prototype.forward = function() {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.getAttention\n * @return {undefined}\n */\nWindow.prototype.getAttention = function() {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.home\n * @return {undefined}\n */\nWindow.prototype.home = function() {};\n\nWindow.prototype.openDialog;\nWindow.prototype.releaseEvents;\nWindow.prototype.scrollByLines;\nWindow.prototype.scrollByPages;\n\n/**\n * @param {string} uri\n * @param {?=} opt_arguments\n * @param {string=} opt_options\n * @see https://developer.mozilla.org/en/DOM/window.showModalDialog\n */\nWindow.prototype.showModalDialog;\n\nWindow.prototype.sizeToContent;\n\nWindow.prototype.updateCommands;\n\n// properties of Document\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.alinkColor\n * @type {string}\n */\nDocument.prototype.alinkColor;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.anchors\n * @type {HTMLCollection}\n */\nDocument.prototype.anchors;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.applets\n * @type {HTMLCollection}\n */\nDocument.prototype.applets;\n/** @type {?string} */ Document.prototype.baseURI;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.bgColor\n * @type {string}\n */\nDocument.prototype.bgColor;\n\n/** @type {HTMLBodyElement} */ Document.prototype.body;\nDocument.prototype.characterSet;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.compatMode\n * @type {string}\n */\nDocument.prototype.compatMode;\n\nDocument.prototype.contentType;\n/** @type {string} */ Document.prototype.cookie;\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/defaultView\n * @type {?Window}\n */\nDocument.prototype.defaultView;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.designMode\n * @type {string}\n */\nDocument.prototype.designMode;\n\nDocument.prototype.documentURIObject;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.domain\n * @type {string}\n */\nDocument.prototype.domain;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.embeds\n * @type {HTMLCollection}\n */\nDocument.prototype.embeds;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.fgColor\n * @type {string}\n */\nDocument.prototype.fgColor;\n\n/** @type {Element} */ Document.prototype.firstChild;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.forms\n * @type {HTMLCollection}\n */\nDocument.prototype.forms;\n\n/** @type {HTMLCollection} */\nDocument.prototype.images;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/DOM/document.lastModified\n */\nDocument.prototype.lastModified;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/DOM/document.linkColor\n */\nDocument.prototype.linkColor;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.links\n * @type {HTMLCollection<(!HTMLAreaElement|!HTMLAnchorElement)>}\n */\nDocument.prototype.links;\n\n/**\n * @type {!Location}\n * @implicitCast\n */\nDocument.prototype.location;\n\nDocument.prototype.namespaceURI;\nDocument.prototype.nodePrincipal;\nDocument.prototype.plugins;\nDocument.prototype.popupNode;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/DOM/document.referrer\n */\nDocument.prototype.referrer;\n\n/**\n * @type {StyleSheetList}\n * @see https://developer.mozilla.org/en/DOM/document.styleSheets\n */\nDocument.prototype.styleSheets;\n\n/** @type {?string} */ Document.prototype.title;\nDocument.prototype.tooltipNode;\n/** @type {string} */ Document.prototype.URL;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/DOM/document.vlinkColor\n */\nDocument.prototype.vlinkColor;\n\n/** @type {number} */ Document.prototype.width;\n\n// Methods of Document\n/**\n * @see https://developer.mozilla.org/en/DOM/document.clear\n * @return {undefined}\n */\nDocument.prototype.clear = function() {};\n\n/**\n * @param {string} type\n * @return {Event}\n */\nDocument.prototype.createEvent = function(type) {};\nDocument.prototype.createNSResolver;\n/** @return {Range} */ Document.prototype.createRange = function() {};\nDocument.prototype.createTreeWalker;\n\nDocument.prototype.evaluate;\n\n/**\n * @param {string} commandName\n * @param {?boolean=} opt_showUi\n * @param {*=} opt_value\n * @see https://developer.mozilla.org/en/Rich-Text_Editing_in_Mozilla#Executing_Commands\n */\nDocument.prototype.execCommand;\n\nDocument.prototype.loadOverlay;\n\n/**\n * @see https://developer.mozilla.org/en/Midas\n * @see http://msdn.microsoft.com/en-us/library/ms536676(VS.85).aspx\n */\nDocument.prototype.queryCommandEnabled;\n\n/**\n * @see https://developer.mozilla.org/en/Midas\n * @see http://msdn.microsoft.com/en-us/library/ms536678(VS.85).aspx\n */\nDocument.prototype.queryCommandIndeterm;\n\n/**\n * @see https://developer.mozilla.org/en/Midas\n * @see http://msdn.microsoft.com/en-us/library/ms536679(VS.85).aspx\n */\nDocument.prototype.queryCommandState;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/document.queryCommandSupported\n * @see http://msdn.microsoft.com/en-us/library/ms536681(VS.85).aspx\n * @param {string} command\n * @return {?} Implementation-specific.\n */\nDocument.prototype.queryCommandSupported;\n\n/**\n * @see https://developer.mozilla.org/en/Midas\n * @see http://msdn.microsoft.com/en-us/library/ms536683(VS.85).aspx\n */\nDocument.prototype.queryCommandValue;\n\nDocument.prototype.ononline;\nDocument.prototype.onoffline;\n\n// XUL\n/**\n * @see http://developer.mozilla.org/en/DOM/document.getBoxObjectFor\n * @return {BoxObject}\n * @nosideeffects\n */\nDocument.prototype.getBoxObjectFor = function(element) {};\n\n// From:\n// http://lxr.mozilla.org/mozilla1.8/source/dom/public/idl/range/nsIDOMNSRange.idl\n\n/**\n * @param {!TrustedHTML|string} tag\n * @return {DocumentFragment}\n */\nRange.prototype.createContextualFragment;\n\n/**\n * @param {Node} parent\n * @param {number} offset\n * @return {boolean}\n * @nosideeffects\n */\nRange.prototype.isPointInRange;\n\n/**\n * @param {Node} parent\n * @param {number} offset\n * @return {number}\n * @nosideeffects\n */\nRange.prototype.comparePoint;\n\n/**\n * @param {Node} n\n * @return {boolean}\n * @nosideeffects\n */\nRange.prototype.intersectsNode;\n\n/**\n * @param {Node} n\n * @return {number}\n * @nosideeffects\n */\nRange.prototype.compareNode;\n\n/**\n * @type {!NodeList}\n * @see https://developer.mozilla.org/en/DOM/element.children\n */\nElement.prototype.children;\n\n/**\n * Firebug sets this property on elements it is inserting into the DOM.\n * @type {boolean}\n */\nElement.prototype.firebugIgnore;\n\n/**\n * Note: According to the spec, name is defined on specific types of\n * HTMLElements, rather than on Node, Element, or HTMLElement directly.\n * Ignore this.\n * @type {string}\n */\nElement.prototype.name;\n\nElement.prototype.nodePrincipal;\n\n/**\n * @type {!CSSStyleDeclaration}\n * This belongs on HTMLElement rather than Element, but that\n * breaks a lot.\n * TODO(rdcronin): Remove this declaration once the breakage is fixed.\n */\nElement.prototype.style;\n\n/** @return {undefined} */\nElement.prototype.click = function() {};\n\n/** @type {number} */\nHTMLTextAreaElement.prototype.selectionStart;\n\n/** @type {number} */\nHTMLTextAreaElement.prototype.selectionEnd;\n\n/**\n * @param {number} selectionStart\n * @param {number} selectionEnd\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dom-textarea/input-setselectionrange\n * @return {undefined}\n */\nHTMLTextAreaElement.prototype.setSelectionRange =\n    function(selectionStart, selectionEnd) {};\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/Navigator.buildID\n */\nNavigator.prototype.buildID;\n\n/**\n * @type {!Array|undefined}\n * @see https://developer.mozilla.org/en/Navigator.languages\n */\nNavigator.prototype.languages;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/Navigator.oscpu\n */\nNavigator.prototype.oscpu;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/Navigator.productSub\n */\nNavigator.prototype.productSub;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/Navigator.securityPolicy\n */\nNavigator.prototype.securityPolicy;\n\n/**\n * @param {string} url\n * @param {ArrayBufferView|Blob|string|FormData=} opt_data\n * @return {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/navigator.sendBeacon\n */\nNavigator.prototype.sendBeacon = function(url, opt_data) {};\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/Navigator.vendor\n */\nNavigator.prototype.vendor;\n\n/**\n * @type {string}\n * @see https://developer.mozilla.org/en/Navigator.vendorSub\n */\nNavigator.prototype.vendorSub;\n\n\n/** @constructor */\nfunction BoxObject() {}\n\n/** @type {Element} */\nBoxObject.prototype.element;\n\n/** @type {number} */\nBoxObject.prototype.screenX;\n\n/** @type {number} */\nBoxObject.prototype.screenY;\n\n/** @type {number} */\nBoxObject.prototype.x;\n\n/** @type {number} */\nBoxObject.prototype.y;\n\n/** @type {number} */\nBoxObject.prototype.width;\n\n\n/**\n * @param {Element} element\n * @param {?string=} pseudoElt\n * @return {?CSSStyleDeclaration}\n * @nosideeffects\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getComputedStyle(element, pseudoElt) {}\n","externs/ie_dom.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over the\n *  W3C's DOM specification by IE in JScript. This file depends on\n *  w3c_dom2.js. The whole file has NOT been fully type annotated.\n *\n * When a non-standard extension appears in both Gecko and IE, we put\n * it in gecko_dom.js\n *\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n */\n\n// TODO(nicksantos): Rewrite all the DOM interfaces as interfaces, instead\n// of kludging them as an inheritance hierarchy.\n\n/**\n * @constructor\n * @extends {Document}\n * @see http://msdn.microsoft.com/en-us/library/ms757878(VS.85).aspx\n */\nfunction XMLDOMDocument() {}\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms761398(VS.85).aspx\n */\nXMLDOMDocument.prototype.async;\n\n/**\n * @type {!Function}\n * @see http://msdn.microsoft.com/en-us/library/ms762647(VS.85).aspx\n */\nXMLDOMDocument.prototype.ondataavailable;\n\n/**\n * @type {!Function}\n * @see http://msdn.microsoft.com/en-us/library/ms764640(VS.85).aspx\n */\nXMLDOMDocument.prototype.onreadystatechange;\n\n/**\n * @type {!Function}\n * @see http://msdn.microsoft.com/en-us/library/ms753795(VS.85).aspx\n */\nXMLDOMDocument.prototype.ontransformnode;\n\n/**\n * @type {Object}\n * @see http://msdn.microsoft.com/en-us/library/ms756041(VS.85).aspx\n */\nXMLDOMDocument.prototype.parseError;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms761353(VS.85).aspx\n */\nXMLDOMDocument.prototype.preserveWhiteSpace;\n\n/**\n * @type {number}\n * @see http://msdn.microsoft.com/en-us/library/ms753702(VS.85).aspx\n */\nXMLDOMDocument.prototype.readyState;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms762283(VS.85).aspx\n * @type {boolean}\n */\nXMLDOMDocument.prototype.resolveExternals;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms760290(v=vs.85).aspx\n * @param {string} name\n * @param {*} value\n * @return {undefined}\n */\nXMLDOMDocument.prototype.setProperty = function(name, value) {};\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms767669(VS.85).aspx\n */\nXMLDOMDocument.prototype.url;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms762791(VS.85).aspx\n */\nXMLDOMDocument.prototype.validateOnParse;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms763830(VS.85).aspx\n * @return {undefined}\n */\nXMLDOMDocument.prototype.abort = function() {};\n\n/**\n * @param {*} type\n * @param {string} name\n * @param {string} namespaceURI\n * @return {Node}\n * @see http://msdn.microsoft.com/en-us/library/ms757901(VS.85).aspx\n * @nosideeffects\n */\nXMLDOMDocument.prototype.createNode = function(type, name, namespaceURI) {};\n\n/**\n * @param {string} xmlString\n * @return {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms754585(VS.85).aspx\n * @override\n */\nXMLDOMDocument.prototype.loadXML = function(xmlString) {};\n\n/**\n * @param {string} id\n * @return {Node}\n * @see http://msdn.microsoft.com/en-us/library/ms766397(VS.85).aspx\n */\nXMLDOMDocument.prototype.nodeFromID = function(id) {};\n\n//==============================================================================\n// XMLNode methods and properties\n// In a real DOM hierarchy, XMLDOMDocument inherits from XMLNode and Document.\n// Since we can't express that in our type system, we put XMLNode properties\n// on Node.\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms767570(VS.85).aspx\n */\nNode.prototype.baseName;\n\n/**\n * @type {?string}\n * @see http://msdn.microsoft.com/en-us/library/ms762763(VS.85).aspx\n */\nNode.prototype.dataType;\n\n/**\n * @type {Node}\n * @see http://msdn.microsoft.com/en-us/library/ms764733(VS.85).aspx\n */\nNode.prototype.definition;\n\n/**\n * IE5 used document instead of ownerDocument.\n * Old versions of WebKit used document instead of contentDocument.\n * @type {Document}\n */\nNode.prototype.document;\n\n\n/**\n * Inserts the given HTML text into the element at the location.\n * @param {string} sWhere Where to insert the HTML text, one of 'beforeBegin',\n *     'afterBegin', 'beforeEnd', 'afterEnd'.\n * @param {!TrustedHTML|string} sText HTML text to insert.\n * @see http://msdn.microsoft.com/en-us/library/ms536452(VS.85).aspx\n * @return {undefined}\n */\nNode.prototype.insertAdjacentHTML = function(sWhere, sText) {};\n\n/**\n * @type {*}\n * @see http://msdn.microsoft.com/en-us/library/ms762308(VS.85).aspx\n */\nNode.prototype.nodeTypedValue;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms757895(VS.85).aspx\n */\nNode.prototype.nodeTypeString;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms762237(VS.85).aspx\n */\nNode.prototype.parsed;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms753816(VS.85).aspx\n */\nNode.prototype.specified;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms762687(VS.85).aspx\n */\nNode.prototype.text;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms755989(VS.85).aspx\n */\nNode.prototype.xml;\n\n/**\n * @param {string} expression An XPath expression.\n * @return {!NodeList}\n * @see http://msdn.microsoft.com/en-us/library/ms754523(VS.85).aspx\n * @nosideeffects\n */\nNode.prototype.selectNodes = function(expression) {};\n\n/**\n * @param {string} expression An XPath expression.\n * @return {Node}\n * @see http://msdn.microsoft.com/en-us/library/ms757846(VS.85).aspx\n * @nosideeffects\n */\nNode.prototype.selectSingleNode = function(expression) {};\n\n/**\n * @param {Node} stylesheet XSLT stylesheet.\n * @return {string}\n * @see http://msdn.microsoft.com/en-us/library/ms761399(VS.85).aspx\n * @nosideeffects\n */\nNode.prototype.transformNode = function(stylesheet) {};\n\n/**\n * @param {Node} stylesheet XSLT stylesheet.\n * @param {Object} outputObject\n * @see http://msdn.microsoft.com/en-us/library/ms766561(VS.85).aspx\n * @return {Object}\n */\nNode.prototype.transformNodeToObject =\n    function(stylesheet, outputObject) {};\n\n//==============================================================================\n// Node methods\n\n/**\n * @param {boolean=} opt_bRemoveChildren Whether to remove the entire sub-tree.\n *    Defaults to false.\n * @return {Node} The object that was removed.\n * @see http://msdn.microsoft.com/en-us/library/ms536708(VS.85).aspx\n */\nNode.prototype.removeNode = function(opt_bRemoveChildren) {};\n\n/**\n * @constructor\n */\nfunction ClipboardData() {}\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535220(VS.85).aspx\n * @param {string=} opt_type Type of clipboard data to clear. 'Text' or\n *     'URL' or 'File' or 'HTML' or 'Image'.\n * @return {undefined}\n */\nClipboardData.prototype.clearData = function(opt_type) {};\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535220(VS.85).aspx\n * @param {string} type Type of clipboard data to set ('Text' or 'URL').\n * @param {string} data Data to set\n * @return {boolean} Whether the data were set correctly.\n */\nClipboardData.prototype.setData = function(type, data) {};\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535220(VS.85).aspx\n * @param {string} type Type of clipboard data to get ('Text' or 'URL').\n * @return {string} The current data\n */\nClipboardData.prototype.getData = function(type) { };\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535220(VS.85).aspx\n * @type {ClipboardData}\n */\nWindow.prototype.clipboardData;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533724(VS.85).aspx\n */\nWindow.prototype.dialogHeight;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533725(VS.85).aspx\n */\nWindow.prototype.dialogLeft;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533726(VS.85).aspx\n */\nWindow.prototype.dialogTop;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533727(VS.85).aspx\n */\nWindow.prototype.dialogWidth;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535863(VS.85).aspx\n */\nWindow.prototype.event;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/cc197012(VS.85).aspx\n */\nWindow.prototype.maxConnectionsPer1_0Server;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/cc197013(VS.85).aspx\n */\nWindow.prototype.maxConnectionsPerServer;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534198(VS.85).aspx\n */\nWindow.prototype.offscreenBuffering;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534389(VS.85).aspx\n * @type {number|undefined}\n */\nWindow.prototype.screenLeft;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534389(VS.85).aspx\n * @type {number|undefined}\n */\nWindow.prototype.screenTop;\n\n// Functions\n\n/**\n * @param {string} event\n * @param {Function} handler\n * @see http://msdn.microsoft.com/en-us/library/ms536343(VS.85).aspx\n */\nWindow.prototype.attachEvent;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536392(VS.85).aspx\n */\nWindow.prototype.createPopup;\n\n/**\n * @param {string} event\n * @param {Function} handler\n * @see http://msdn.microsoft.com/en-us/library/ms536411(VS.85).aspx\n */\nWindow.prototype.detachEvent;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536420(VS.85).aspx\n */\nWindow.prototype.execScript;\n\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536638(VS.85).aspx\n */\nWindow.prototype.navigate;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536738(VS.85).aspx\n */\nWindow.prototype.setActive;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536758(VS.85).aspx\n */\nWindow.prototype.showHelp;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536761(VS.85).aspx\n */\nWindow.prototype.showModelessDialog;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535246%28v=vs.85%29.aspx\n * @const {!Object}\n */\nWindow.prototype.external;\n\n/**\n * @see https://msdn.microsoft.com/en-us/ie/dn265046(v=vs.94)\n * @const {!Object}\n */\nWindow.prototype.msCrypto;\n\n/**\n * @type {boolean}\n * @implicitCast\n * @see http://msdn.microsoft.com/en-us/library/ie/ms533072(v=vs.85).aspx\n */\nHTMLFrameElement.prototype.allowTransparency;\n\n/**\n * @type {Window}\n * @see http://msdn.microsoft.com/en-us/library/ms533692(VS.85).aspx\n */\nHTMLFrameElement.prototype.contentWindow;\n\n/**\n * @type {boolean}\n * @implicitCast\n * @see http://msdn.microsoft.com/en-us/library/ie/ms533072(v=vs.85).aspx\n */\nHTMLIFrameElement.prototype.allowTransparency;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536385(VS.85).aspx\n */\nHTMLBodyElement.prototype.createControlRange;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534359(VS.85).aspx\n */\nHTMLScriptElement.prototype.readyState;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534359(VS.85).aspx\n */\nHTMLIFrameElement.prototype.readyState;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534359(VS.85).aspx\n */\nHTMLImageElement.prototype.readyState;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534359(VS.85).aspx\n */\nHTMLObjectElement.prototype.readyState;\n\n\n/**\n * @constructor\n */\nfunction ControlRange() {}\n\nControlRange.prototype.add;\nControlRange.prototype.addElement;\nControlRange.prototype.execCommand;\nControlRange.prototype.item;\nControlRange.prototype.queryCommandEnabled;\nControlRange.prototype.queryCommandIndeterm;\nControlRange.prototype.queryCommandState;\nControlRange.prototype.queryCommandSupported;\nControlRange.prototype.queryCommandValue;\nControlRange.prototype.remove;\nControlRange.prototype.scrollIntoView;\nControlRange.prototype.select;\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/ms535872.aspx\n */\nfunction TextRange() {}\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533538(VS.85).aspx\n */\nTextRange.prototype.boundingHeight;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533539(VS.85).aspx\n */\nTextRange.prototype.boundingLeft;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533540(VS.85).aspx\n */\nTextRange.prototype.boundingTop;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533541(VS.85).aspx\n */\nTextRange.prototype.boundingWidth;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533874(VS.85).aspx\n */\nTextRange.prototype.htmlText;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534200(VS.85).aspx\n */\nTextRange.prototype.offsetLeft;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534303(VS.85).aspx\n */\nTextRange.prototype.offsetTop;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534676(VS.85).aspx\n */\nTextRange.prototype.text;\n\n/**\n * @param {boolean=} opt_toStart\n * @see http://msdn.microsoft.com/en-us/library/ms536371(VS.85).aspx\n */\nTextRange.prototype.collapse;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536373(VS.85).aspx\n */\nTextRange.prototype.compareEndPoints;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536416(VS.85).aspx\n */\nTextRange.prototype.duplicate;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536419(VS.85).aspx\n */\nTextRange.prototype.execCommand;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536421(VS.85).aspx\n */\nTextRange.prototype.expand;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536422(VS.85).aspx\n */\nTextRange.prototype.findText;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536432(VS.85).aspx\n */\nTextRange.prototype.getBookmark;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536433(VS.85).aspx\n */\nTextRange.prototype.getBoundingClientRect;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536435(VS.85).aspx\n */\nTextRange.prototype.getClientRects;\n\n/**\n * @param {TextRange|ControlRange} range\n * @return {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms536450(VS.85).aspx\n */\nTextRange.prototype.inRange;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536458(VS.85).aspx\n */\nTextRange.prototype.isEqual;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536616(VS.85).aspx\n */\nTextRange.prototype.move;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536620(VS.85).aspx\n */\nTextRange.prototype.moveEnd;\n\n/**\n * @param {string} unit\n * @param {number=} opt_count\n * @see http://msdn.microsoft.com/en-us/library/ms536623(VS.85).aspx\n */\nTextRange.prototype.moveStart;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536628(VS.85).aspx\n */\nTextRange.prototype.moveToBookmark;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536630(VS.85).aspx\n */\nTextRange.prototype.moveToElementText;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536632(VS.85).aspx\n */\nTextRange.prototype.moveToPoint;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536654(VS.85).aspx\n * @return {?Element}\n */\nTextRange.prototype.parentElement;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536656(VS.85).aspx\n */\nTextRange.prototype.pasteHTML;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536676(VS.85).aspx\n */\nTextRange.prototype.queryCommandEnabled;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536678(VS.85).aspx\n */\nTextRange.prototype.queryCommandIndeterm;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536679(VS.85).aspx\n */\nTextRange.prototype.queryCommandState;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536681(VS.85).aspx\n */\nTextRange.prototype.queryCommandSupported;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536683(VS.85).aspx\n */\nTextRange.prototype.queryCommandValue;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536730(VS.85).aspx\n */\nTextRange.prototype.scrollIntoView;\n\n/**\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/ms536735(VS.85).aspx\n */\nTextRange.prototype.select = function() {};\n\n/**\n * @param {string} how\n * @param {TextRange|ControlRange} sourceRange\n * @see http://msdn.microsoft.com/en-us/library/ms536745(VS.85).aspx\n */\nTextRange.prototype.setEndPoint;\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/ms537447(VS.85).aspx\n */\nfunction controlRange() {}\n\n\nDocument.prototype.loadXML;\n\n\n// http://msdn.microsoft.com/en-us/library/ms531073(VS.85).aspx\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533553(VS.85).aspx\n */\nDocument.prototype.charset;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533693(VS.85).aspx\n */\nDocument.prototype.cookie;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533731(VS.85).aspx\n */\nDocument.prototype.dir;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/cc196988(VS.85).aspx\n */\nDocument.prototype.documentMode;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533747(VS.85).aspx\n */\nDocument.prototype.expando;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533750(VS.85).aspx\n */\nDocument.prototype.fileCreatedDate;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533751(VS.85).aspx\n */\nDocument.prototype.fileModifiedDate;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms533752(VS.85).aspx\n */\nDocument.prototype.fileSize;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534331(VS.85).aspx\n * @type {?Window}\n */\nDocument.prototype.parentWindow;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534353(VS.85).aspx\n */\nDocument.prototype.protocol;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534359(VS.85).aspx\n */\nHTMLDocument.prototype.readyState;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534704(VS.85).aspx\n */\nDocument.prototype.uniqueID;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534709(VS.85).aspx\n */\nDocument.prototype.URLUnencoded;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535155(VS.85).aspx\n */\nDocument.prototype.XMLDocument;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535163(VS.85).aspx\n */\nDocument.prototype.XSLDocument;\n\n// functions\n\n/**\n * @param {string} event\n * @param {Function} handler\n * @see http://msdn.microsoft.com/en-us/library/ms536343(VS.85).aspx\n */\nDocument.prototype.attachEvent;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536390(VS.85).aspx\n */\nDocument.prototype.createEventObject;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms531194(VS.85).aspx\n */\nDocument.prototype.createStyleSheet;\n\n/**\n * @param {string} event\n * @param {Function} handler\n * @see http://msdn.microsoft.com/en-us/library/ms536411(VS.85).aspx\n */\nDocument.prototype.detachEvent;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536425(VS.85).aspx\n */\nDocument.prototype.focus;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536614(VS.85).aspx\n */\nDocument.prototype.mergeAttributes;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536685(VS.85).aspx\n */\nDocument.prototype.recalc;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536689(VS.85).aspx\n */\nDocument.prototype.releaseCapture;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536738(VS.85).aspx\n */\nDocument.prototype.setActive;\n\n\n// collections\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms537434(VS.85).aspx\n */\nDocument.prototype.all;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms537445(VS.85).aspx\n */\nDocument.prototype.childNodes;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms537459(VS.85).aspx\n */\nDocument.prototype.frames;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms537470(VS.85).aspx\n */\nDocument.prototype.namespaces;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms537487(VS.85).aspx\n * @type {!HTMLCollection}\n */\nDocument.prototype.scripts;\n\n/**\n * @param {string} sUrl\n * @return {number}\n * @see http://msdn.microsoft.com/en-us/library/ms535922(VS.85).aspx\n */\nElement.prototype.addBehavior = function(sUrl) {};\n\n/**\n * @param {string} event\n * @param {Function} handler\n * @see http://msdn.microsoft.com/en-us/library/mm536343(v=vs.85).aspx\n */\nElement.prototype.attachEvent;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms533546(VS.85).aspx\n */\nElement.prototype.canHaveChildren;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms533559(v=vs.85).aspx\n */\nElement.prototype.classid;\n\n/**\n * @param {number} iCoordX Integer that specifies the client window coordinate\n *     of x.\n * @param {number} iCoordY Integer that specifies the client window coordinate\n *     of y.\n * @return {string} The component of an element located at the specified\n *     coordinates.\n * @see http://msdn.microsoft.com/en-us/library/ms536375(VS.85).aspx\n * @nosideeffects\n */\nElement.prototype.componentFromPoint = function(iCoordX, iCoordY) {};\n\n\n/**\n * TODO(tjgq): Make this string once existing usages have been migrated.\n * @type {string|boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms533690(VS.85).aspx\n */\nElement.prototype.contentEditable;\n\n/**\n * @return {TextRange}\n * @see http://msdn.microsoft.com/en-us/library/ms536401(VS.85).aspx\n */\nElement.prototype.createTextRange;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms535231(VS.85).aspx\n * @type {?CSSStyleDeclaration}\n */\nElement.prototype.currentStyle;\n\n/**\n * @param {string} event\n * @param {Function} handler\n * @see http://msdn.microsoft.com/en-us/library/ie/ms536411(v=vs.85).aspx\n */\nElement.prototype.detachEvent;\n\n/**\n * @param {string=} opt_action\n * @see http://msdn.microsoft.com/en-us/library/ms536414%28VS.85%29.aspx\n * @return {undefined}\n */\nElement.prototype.doScroll = function(opt_action) {};\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536423(VS.85).aspx\n */\nElement.prototype.fireEvent;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms533783(VS.85).aspx\n */\nElement.prototype.hideFocus;\n\n/**\n * @type {string}\n * @implicitCast\n *\n * TODO(lharker): remove the @implicitCast to enforce assigning an explicit\n * string to innerText instead of relying on coercion.\n *\n * @see http://msdn.microsoft.com/en-us/library/ms533899.aspx\n */\nElement.prototype.innerText;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms537838(VS.85).aspx\n */\nElement.prototype.isContentEditable;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms531395(v=vs.85).aspx\n * NOTE: Left untyped to avoid conflict with subclasses.\n */\nElement.prototype.load;\n\n/**\n * @param {number} pointerId Id of the pointer that is assign to the element.\n * @see http://msdn.microsoft.com/en-us/library/ie/hh771882(v=vs.85).aspx\n * @return {undefined}\n */\nElement.prototype.msSetPointerCapture = function(pointerId) {};\n\n/**\n * @param {number} pointerId\n * @see http://msdn.microsoft.com/en-us/library/ie/hh771880.aspx\n * @return {undefined}\n */\nElement.prototype.msReleasePointerCapture = function(pointerId) {};\n\n/**\n * @type {?function(Event)}\n * @see http://msdn.microsoft.com/en-us/library/ms536903(v=vs.85).aspx\n */\nElement.prototype.onbeforedeactivate;\n\n/**\n * @type {?function(Event)}\n * @see http://msdn.microsoft.com/en-us/library/ms536945(VS.85).aspx\n */\nElement.prototype.onmouseenter;\n\n/**\n * @type {?function(Event)}\n * @see http://msdn.microsoft.com/en-us/library/ms536946(VS.85).aspx\n */\nElement.prototype.onmouseleave;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms536689(VS.85).aspx\n * @return {undefined}\n */\nElement.prototype.releaseCapture = function() {};\n\n/**\n * @param {number} iID\n * @return {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms536700(VS.85).aspx\n */\nElement.prototype.removeBehavior = function(iID) {};\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/aa703996(VS.85).aspx\n */\nElement.prototype.runtimeStyle;\n\n/**\n * @param {string} sStoreName The arbitrary name assigned to a persistent object\n *     in a UserData store.\n * @see http://msdn.microsoft.com/en-us/library/ms531403(v=vs.85).aspx\n * @return {undefined}\n */\nElement.prototype.save = function(sStoreName) {};\n\n/**\n * @param {boolean=} opt_bContainerCapture Events originating in a container are\n *     captured by the container. Defaults to true.\n * @see http://msdn.microsoft.com/en-us/library/ms536742(VS.85).aspx\n * @return {undefined}\n */\nElement.prototype.setCapture = function(opt_bContainerCapture) {};\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms534635(VS.85).aspx\n */\nElement.prototype.sourceIndex;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms537840.aspx\n */\nElement.prototype.unselectable;\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/aa752462(v=vs.85).aspx\n */\nfunction HTMLFiltersCollection() {}\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/aa752463(v=vs.85).aspx\n * @type {number}\n */\nHTMLFiltersCollection.prototype.length;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms537452(v=vs.85).aspx\n * @type {HTMLFiltersCollection}\n */\nElement.prototype.filters;\n\n/**\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/ms532853(v=vs.85).aspx\n */\nfunction HTMLFilter() {}\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms532954(v=vs.85).aspx\n * @return {undefined}\n */\nHTMLFilter.prototype.apply = function() {};\n\n/**\n * @constructor\n * @extends {HTMLFilter}\n * @see http://msdn.microsoft.com/en-us/library/ms532967(v=vs.85).aspx\n */\nfunction AlphaFilter() {}\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms532910(v=vs.85).aspx\n * @type {number}\n */\nAlphaFilter.prototype.Opacity;\n\n/**\n * @constructor\n * @extends {HTMLFilter}\n * @see http://msdn.microsoft.com/en-us/library/ms532969(v=vs.85).aspx\n */\nfunction AlphaImageLoaderFilter() {}\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ms532920(v=vs.85).aspx\n * @type {string}\n */\nAlphaImageLoaderFilter.prototype.sizingMethod;\n\n// For IE, returns an object representing key-value pairs for all the global\n// variables prefixed with str, e.g. test*\n\n/** @param {*=} opt_str\n */\nfunction RuntimeObject(opt_str) {}\n\n\n/**\n * @type {StyleSheet}\n * @see http://msdn.microsoft.com/en-us/library/dd347030(VS.85).aspx\n */\nHTMLStyleElement.prototype.styleSheet;\n\n\n/**\n * IE implements Cross Origin Resource Sharing (cross-domain XMLHttpRequests)\n * via the XDomainRequest object.\n *\n * @constructor\n * @see http://msdn.microsoft.com/en-us/library/cc288060(v=vs.85).aspx\n * @see http://www.w3.org/TR/cors/\n */\nfunction XDomainRequest() {}\n\n/**\n * Aborts the request.\n * @see http://msdn.microsoft.com/en-us/library/cc288129(v=vs.85).aspx\n * @return {undefined}\n */\nXDomainRequest.prototype.abort = function() {};\n\n/**\n * Sets the method and URL for the request.\n * @param {string} bstrMethod Either \"GET\" or \"POST\"\n * @param {string} bstrUrl The target URL\n * @see http://msdn.microsoft.com/en-us/library/cc288168(v=vs.85).aspx\n * @return {undefined}\n */\nXDomainRequest.prototype.open = function(bstrMethod, bstrUrl) {};\n\n/**\n * Sends the request.\n * @param {string=} varBody The POST body to send to the server. If omitted,\n *     the behavior is identical to sending an empty string.\n * @see http://msdn.microsoft.com/en-us/library/cc288207(v=vs.85).aspx\n * @return {undefined}\n */\nXDomainRequest.prototype.send = function(varBody) {};\n\n/**\n * Called if the request could not be completed. Note that error information is\n * not available.\n * @see http://msdn.microsoft.com/en-us/library/ms536930%28v=VS.85%29.aspx\n * @type {?function()}\n */\nXDomainRequest.prototype.onerror;\n\n/**\n * Called when the response has finished.\n * @see http://msdn.microsoft.com/en-us/library/ms536942%28v=VS.85%29.aspx\n * @type {?function()}\n */\nXDomainRequest.prototype.onload;\n\n/**\n * Called every time part of the response has been received.\n * @see http://msdn.microsoft.com/en-us/library/cc197058%28v=VS.85%29.aspx\n * @type {?function()}\n */\nXDomainRequest.prototype.onprogress;\n\n/**\n * Called if the timeout period has elapsed.\n * @see http://msdn.microsoft.com/en-us/library/cc197061%28v=VS.85%29.aspx\n * @type {?function()}\n */\nXDomainRequest.prototype.ontimeout;\n\n/**\n * The current response body.\n * @see http://msdn.microsoft.com/en-us/library/cc287956%28v=VS.85%29.aspx\n * @type {string}\n */\nXDomainRequest.prototype.responseText;\n\n/**\n * The timeout (in milliseconds) for the request.\n * @type {number}\n */\nXDomainRequest.prototype.timeout;\n\n/**\n * The Content-Type of the response, or an empty string.\n * @type {string}\n */\nXDomainRequest.prototype.contentType;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms533542(v=vs.85).aspx\n */\nNavigator.prototype.browserLanguage;\n\n/**\n * @type {number}\n * @see https://msdn.microsoft.com/en-us/library/ie/hh772144(v=vs.85).aspx\n */\nNavigator.prototype.msMaxTouchPoints;\n\n/**\n * @type {boolean}\n * @see http://blogs.msdn.com/b/ie/archive/2011/09/20/touch-input-for-ie10-and-metro-style-apps.aspx\n */\nNavigator.prototype.msPointerEnabled;\n\n/**\n * @param {(!File|!Blob)} blob\n * @param {string=} opt_defaultName\n * @return {boolean}\n * @see https://msdn.microsoft.com/en-us/library/hh772331(v=vs.85).aspx\n */\nNavigator.prototype.msSaveBlob = function(blob, opt_defaultName) {};\n\n/**\n * @param {(!File|!Blob)} blob\n * @param {string=} opt_defaultName\n * @return {boolean}\n * @see https://msdn.microsoft.com/en-us/library/hh772332(v=vs.85).aspx\n */\nNavigator.prototype.msSaveOrOpenBlob = function(blob, opt_defaultName) {};\n\n/**\n * @type {number}\n * @see http://msdn.microsoft.com/en-us/library/ms533721(v=vs.85).aspx\n */\nScreen.prototype.deviceXDPI;\n\n/**\n * @type {number}\n * @see http://msdn.microsoft.com/en-us/library/ms534128%28v=vs.85%29.aspx\n */\nScreen.prototype.logicalXDPI;\n\n/**\n * @type {number}\n * @see http://msdn.microsoft.com/en-us/library/ms534130%28v=vs.85%29.aspx\n */\nScreen.prototype.logicalYDPI;\n","externs/webkit_dom.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over W3C's DOM\n *  specification by WebKit. This file depends on w3c_dom2.js.\n *  All the provided definitions has been type annotated\n *\n * @externs\n * @author [email protected] (Alan Leung)\n */\n\n/**\n * @param {boolean=} opt_center\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=403510\n * @return {undefined}\n */\nElement.prototype.scrollIntoViewIfNeeded = function(opt_center) {};\n\n/**\n * @constructor\n * @see http://trac.webkit.org/browser/trunk/Source/WebCore/inspector/ScriptProfileNode.idl\n */\nfunction ScriptProfileNode() {};\n\n/** @type {string} */\nScriptProfileNode.prototype.functionName;\n\n/** @type {string} */\nScriptProfileNode.prototype.url;\n\n/** @type {number} */\nScriptProfileNode.prototype.lineNumber;\n\n/** @type {number} */\nScriptProfileNode.prototype.totalTime;\n\n/** @type {number} */\nScriptProfileNode.prototype.selfTime;\n\n/** @type {number} */\nScriptProfileNode.prototype.numberOfCalls;\n\n/** @type {Array} */\nScriptProfileNode.prototype.children;\n\n/** @type {boolean} */\nScriptProfileNode.prototype.visible;\n\n/** @type {number} */\nScriptProfileNode.prototype.callUID;\n\n/**\n * @constructor\n * @see http://trac.webkit.org/browser/trunk/Source/WebCore/inspector/ScriptProfile.idl\n */\nfunction ScriptProfile() {};\n\n/** @type {string} */\nScriptProfile.prototype.title;\n\n/** @type {number} */\nScriptProfile.prototype.uid;\n\n/** @type {ScriptProfileNode} */\nScriptProfile.prototype.head;\n\n/**\n * @type {number}\n * @see http://developer.android.com/reference/android/webkit/WebView.html\n */\nWindow.prototype.devicePixelRatio;\n\n/**\n * @param {string} contextId\n * @param {string} name\n * @param {number} width\n * @param {number} height\n * @nosideeffects\n * @return {undefined}\n */\nDocument.prototype.getCSSCanvasContext =\n    function(contextId, name, width, height) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {?Range}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/caretRangeFromPoint\n */\nDocument.prototype.caretRangeFromPoint = function(x, y) {};\n\n/**\n * @return {!Promise}\n * @nosideeffects\n * @see https://webkit.org/blog/8124/introducing-storage-access-api\n */\nDocument.prototype.hasStorageAccess = function() {};\n\n/**\n * @return {!Promise}\n * @see https://webkit.org/blog/8124/introducing-storage-access-api\n * @see https://developer.mozilla.org/docs/Web/API/Document/requestStorageAccess#Syntax\n */\nDocument.prototype.requestStorageAccess = function() {};\n","externs/w3c_geometry1.js":"/*\n * Copyright 2018 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Geometry Interfaces Module Level 1 spec.\n *  The whole file has been fully type annotated. Created from\n *  https://www.w3.org/TR/geometry-1/\n *\n * @externs\n * @author [email protected] (Andreas F. Bobak)\n */\n\n/**\n * @deprecated ClientRect has been replaced by DOMRect in the latest spec.\n * @constructor\n * @see https://www.w3.org/TR/cssom-view/#changes-from-2011-08-04\n */\nfunction ClientRect() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrect-top\n */\nClientRect.prototype.top;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrect-right\n */\nClientRect.prototype.right;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrect-bottom\n */\nClientRect.prototype.bottom;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrect-left\n */\nClientRect.prototype.left;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrect-width\n */\nClientRect.prototype.width;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrect-height\n */\nClientRect.prototype.height;\n\n/**\n * @constructor\n * @extends {ClientRect} for backwards compatibility\n * @param {number=} x\n * @param {number=} y\n * @param {number=} width\n * @param {number=} height\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-domrectreadonly\n */\nfunction DOMRectReadOnly(x, y, width, height) {}\n\n/**\n * @param {!DOMRectInit} other\n * @return {!DOMRectReadOnly}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-fromrect\n */\nDOMRectReadOnly.prototype.fromRect = function(other) {};\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-x\n */\nDOMRectReadOnly.prototype.x;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-y\n */\nDOMRectReadOnly.prototype.y;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-width\n */\nDOMRectReadOnly.prototype.width;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-height\n */\nDOMRectReadOnly.prototype.height;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-top\n */\nDOMRectReadOnly.prototype.top;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-right\n */\nDOMRectReadOnly.prototype.right;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-bottom\n */\nDOMRectReadOnly.prototype.bottom;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-left\n */\nDOMRectReadOnly.prototype.left;\n\n/**\n * @constructor\n * @extends {DOMRectReadOnly}\n * @param {number=} x\n * @param {number=} y\n * @param {number=} width\n * @param {number=} height\n * @see https://www.w3.org/TR/geometry-1/#dom-domrect-domrect\n */\nfunction DOMRect(x, y, width, height) {}\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrect-x\n */\nDOMRect.prototype.x;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrect-y\n */\nDOMRect.prototype.y;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrect-width\n */\nDOMRect.prototype.width;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrect-height\n */\nDOMRect.prototype.height;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-top\n */\nDOMRect.prototype.top;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-right\n */\nDOMRect.prototype.right;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-bottom\n */\nDOMRect.prototype.bottom;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectreadonly-left\n */\nDOMRect.prototype.left;\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/geometry-1/#dictdef-domrectinit\n */\nfunction DOMRectInit() {}\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectinit-x\n */\nDOMRectInit.prototype.x;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectinit-y\n */\nDOMRectInit.prototype.y;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectinit-width\n */\nDOMRectInit.prototype.width;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-domrectinit-height\n */\nDOMRectInit.prototype.height;\n\n/**\n * @constructor\n * @param {number=} x\n * @param {number=} y\n * @param {number=} z\n * @param {number=} w\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointreadonly-dompointreadonly\n * TODO(larsrc): Remove duplicate definitions, then remove these\n * @suppress {duplicate}\n */\nfunction DOMPointReadOnly(x, y, z, w) {}\n\n/**\n * @param {!DOMPointInit} other\n * @return {!DOMPointReadOnly}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointreadonly-frompoint\n * @suppress {duplicate}\n */\nDOMPointReadOnly.prototype.fromPoint = function(other) {};\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointreadonly-x\n * @suppress {duplicate}\n */\nDOMPointReadOnly.prototype.x;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointreadonly-y\n * @suppress {duplicate}\n */\nDOMPointReadOnly.prototype.y;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointreadonly-z\n * @suppress {duplicate}\n */\nDOMPointReadOnly.prototype.z;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointreadonly-w\n * @suppress {duplicate}\n */\nDOMPointReadOnly.prototype.w;\n\n/**\n * @constructor\n * @extends {DOMPointReadOnly}\n * @param {number=} x\n * @param {number=} y\n * @param {number=} z\n * @param {number=} w\n * @see https://www.w3.org/TR/geometry-1/#dom-dompoint-dompoint\n * @suppress {duplicate}\n */\nfunction DOMPoint(x, y, z, w) {}\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompoint-x\n * @suppress {duplicate}\n */\nDOMPoint.prototype.x;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompoint-y\n * @suppress {duplicate}\n */\nDOMPoint.prototype.y;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompoint-z\n * @suppress {duplicate}\n */\nDOMPoint.prototype.z;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompoint-w\n * @suppress {duplicate}\n */\nDOMPoint.prototype.w;\n\n/**\n * @record\n * @see https://www.w3.org/TR/geometry-1/#dictdef-dompointinit\n * @suppress {duplicate}\n */\nfunction DOMPointInit() {}\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointinit-x\n * @suppress {duplicate}\n */\nDOMPointInit.prototype.x;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointinit-y\n * @suppress {duplicate}\n */\nDOMPointInit.prototype.y;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointinit-z\n * @suppress {duplicate}\n */\nDOMPointInit.prototype.z;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/geometry-1/#dom-dompointinit-w\n * @suppress {duplicate}\n */\nDOMPointInit.prototype.w;\n","externs/w3c_css.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's CSS specification\n *  The whole file has been fully type annotated.\n *  http://www.w3.org/TR/DOM-Level-2-Style/css.html\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n *\n * TODO(nicksantos): When there are no more occurrences of w3c_range.js and\n * gecko_dom.js being included directly in BUILD files, bug dbeam to split the\n * bottom part of this file into a separate externs.\n */\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet\n */\nfunction StyleSheet() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-type\n */\nStyleSheet.prototype.type;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-disabled\n */\nStyleSheet.prototype.disabled;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-owner\n */\nStyleSheet.prototype.ownerNode;\n\n/**\n * @type {StyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-parentStyleSheet\n */\nStyleSheet.prototype.parentStyleSheet;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-href\n */\nStyleSheet.prototype.href;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-title\n */\nStyleSheet.prototype.title;\n\n/**\n * @type {MediaList}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-media\n */\nStyleSheet.prototype.media;\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheetList\n */\nfunction StyleSheetList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheetList-length\n */\nStyleSheetList.prototype.length;\n\n/**\n * @param {number} index\n * @return {StyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheetList-item\n */\nStyleSheetList.prototype.item = function(index) {};\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList\n */\nfunction MediaList() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList-mediaText\n */\nMediaList.prototype.mediaText;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList-length\n */\nMediaList.prototype.length;\n\n/**\n * @param {number} index\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList-item\n */\nMediaList.prototype.item = function(index) {};\n\n/**\n * @interface\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-LinkStyle\n */\nfunction LinkStyle() {}\n\n/**\n * @type {StyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-LinkStyle-sheet\n */\nLinkStyle.prototype.sheet;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-DocumentStyle\n */\nfunction DocumentStyle() {}\n\n/**\n * @type {StyleSheetList}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-StyleSheet-DocumentStyle-styleSheets\n */\nDocumentStyle.prototype.styleSheets;\n\n/**\n * @constructor\n * @extends {StyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet\n */\nfunction CSSStyleSheet() {}\n\n/**\n * @type {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-ownerRule\n */\nCSSStyleSheet.prototype.ownerRule;\n\n/**\n * @type {CSSRuleList}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-cssRules\n */\nCSSStyleSheet.prototype.cssRules;\n\n/**\n * @param {string} rule\n * @param {number} index\n * @return {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-insertRule\n */\nCSSStyleSheet.prototype.insertRule = function(rule, index) {};\n\n/**\n * @param {number} index\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-deleteRule\n * @return {undefined}\n */\nCSSStyleSheet.prototype.deleteRule = function(index) {};\n\n/**\n * @constructor\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList\n */\nfunction CSSRuleList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList-length\n */\nCSSRuleList.prototype.length;\n\n/**\n * @param {number} index\n * @return {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList-item\n */\nCSSRuleList.prototype.item = function(index) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule\n */\nfunction CSSRule() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.prototype.type;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-cssText\n */\nCSSRule.prototype.cssText;\n\n/**\n * @type {CSSStyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-sheet\n */\nCSSRule.prototype.parentStyleSheet;\n\n/**\n * @type {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-parentRule\n */\nCSSRule.prototype.parentRule;\n\n/**\n * @type {CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule\n */\nCSSRule.prototype.style;\n\n/**\n * Indicates that the rule is a {@see CSSUnknownRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.UNKNOWN_RULE;\n\n/**\n * Indicates that the rule is a {@see CSSStyleRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.STYLE_RULE;\n\n/**\n * Indicates that the rule is a {@see CSSCharsetRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.CHARSET_RULE;\n\n/**\n * Indicates that the rule is a {@see CSSImportRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.IMPORT_RULE;\n\n/**\n * Indicates that the rule is a {@see CSSMediaRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.MEDIA_RULE;\n\n/**\n * Indicates that the rule is a {@see CSSFontFaceRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.FONT_FACE_RULE;\n\n/**\n * Indicates that the rule is a {@see CSSPageRule}.\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule-ruleType\n */\nCSSRule.PAGE_RULE;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule\n */\nfunction CSSStyleRule() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule-selectorText\n */\nCSSStyleRule.prototype.selectorText;\n\n/**\n * @type {CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule-style\n */\nCSSStyleRule.prototype.style;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule\n */\nfunction CSSMediaRule() {}\n\n/**\n * @type {MediaList}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-mediaTypes\n */\nCSSMediaRule.prototype.media;\n\n/**\n * @type {CSSRuleList}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-cssRules\n */\nCSSMediaRule.prototype.cssRules;\n\n/**\n * @param {string} rule\n * @param {number} index\n * @return {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-insertRule\n */\nCSSMediaRule.prototype.insertRule = function(rule, index) {};\n\n/**\n * @param {number} index\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-deleteRule\n * @return {undefined}\n */\nCSSMediaRule.prototype.deleteRule = function(index) {};\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSFontFaceRule\n */\nfunction CSSFontFaceRule() {}\n\n/**\n * @type {CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSFontFaceRule-style\n */\nCSSFontFaceRule.prototype.style;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPageRule\n */\nfunction CSSPageRule() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPageRule-name\n */\nCSSPageRule.prototype.selectorText;\n\n/**\n * @type {CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPageRule-style\n */\nCSSPageRule.prototype.style;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule\n */\nfunction CSSImportRule() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule-href\n */\nCSSImportRule.prototype.href;\n\n/**\n * @type {MediaList}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule-media\n */\nCSSImportRule.prototype.media;\n\n/**\n * @type {CSSStyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule-styleSheet\n */\nCSSImportRule.prototype.styleSheet;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSCharsetRule\n */\nfunction CSSCharsetRule() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSCharsetRule-encoding\n */\nCSSCharsetRule.prototype.encoding;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSUnknownRule\n */\nfunction CSSUnknownRule() {}\n\n/**\n * @constructor\n * @extends {CSSProperties}\n * @implements {IObject<(string|number), string>}\n * @implements {IArrayLike}\n * @implements {Iterable}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration\n */\nfunction CSSStyleDeclaration() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-cssText\n */\nCSSStyleDeclaration.prototype.cssText;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-length\n */\nCSSStyleDeclaration.prototype.length;\n\n/**\n * @type {CSSRule}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-parentRule\n */\nCSSStyleDeclaration.prototype.parentRule;\n\n/**\n * @param {string} propertyName\n * @return {CSSValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyCSSValue\n */\nCSSStyleDeclaration.prototype.getPropertyCSSValue = function(propertyName) {};\n\n/**\n * @param {string} propertyName\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyPriority\n */\nCSSStyleDeclaration.prototype.getPropertyPriority = function(propertyName) {};\n\n/**\n * @param {string} propertyName\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyValue\n */\nCSSStyleDeclaration.prototype.getPropertyValue = function(propertyName) {};\n\n/**\n * @param {number} index\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-item\n */\nCSSStyleDeclaration.prototype.item = function(index) {};\n\n/**\n * @param {string} propertyName\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-removeProperty\n */\nCSSStyleDeclaration.prototype.removeProperty = function(propertyName) {};\n\n/**\n * @param {string} propertyName\n * @param {string} value\n * @param {string=} opt_priority\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-setProperty\n */\nCSSStyleDeclaration.prototype.setProperty = function(propertyName, value, opt_priority) {};\n\n// IE-specific\n\n/**\n * @param {string} name\n * @param {number=} opt_flags\n * @return {string|number|boolean|null}\n * @see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx\n */\nCSSStyleDeclaration.prototype.getAttribute = function(name, opt_flags) {};\n\n/**\n * @param {string} name\n * @return {string|number|boolean|null}\n * @see http://msdn.microsoft.com/en-us/library/aa358797(VS.85).aspx\n */\nCSSStyleDeclaration.prototype.getExpression = function(name) {};\n\n/**\n * @param {string} name\n * @param {number=} opt_flags\n * @return {boolean}\n * @see http://msdn.microsoft.com/en-us/library/ms536696(VS.85).aspx\n */\nCSSStyleDeclaration.prototype.removeAttribute =\n    function(name, opt_flags) {};\n\n/**\n * @param {string} name\n * @return {boolean}\n * @see http://msdn.microsoft.com/en-us/library/aa358798(VS.85).aspx\n */\nCSSStyleDeclaration.prototype.removeExpression = function(name) {};\n\n/**\n * @deprecated\n * @param {string} name\n * @param {*} value\n * @param {number=} opt_flags\n * @see http://msdn.microsoft.com/en-us/library/ms536739(VS.85).aspx\n * @return {undefined}\n */\nCSSStyleDeclaration.prototype.setAttribute = function(name, value, opt_flags) {};\n\n/**\n * @param {string} name\n * @param {string} expr\n * @param {string=} opt_language\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/ms531196(VS.85).aspx\n */\nCSSStyleDeclaration.prototype.setExpression =\n    function(name, expr, opt_language) {};\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue\n */\nfunction CSSValue() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue-cssText\n */\nCSSValue.prototype.cssText;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue-cssValueType\n */\nCSSValue.prototype.cssValueType;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue-types\n */\nCSSValue.CSS_INHERIT;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue-types\n */\nCSSValue.CSS_PRIMITIVE_VALUE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue-types\n */\nCSSValue.CSS_VALUE_LIST;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue-types\n */\nCSSValue.CSS_CUSTOM;\n\n/**\n * @constructor\n * @extends {CSSValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nfunction CSSPrimitiveValue() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.prototype.primitiveType;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_UNKNOWN;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_NUMBER;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_PERCENTAGE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_EMS;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_EXS;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_PX;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_CM;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_MM;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_IN;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_PT;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_PC;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_DEG;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_RAD;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_GRAD;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_MS;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_S;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_HZ;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_KHZ;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_DIMENSION;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_STRING;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_URI;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_IDENT;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_ATTR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_COUNTER;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_RECT;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue\n */\nCSSPrimitiveValue.CSS_RGBCOLOR;\n\n/**\n * @return {Counter}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-getCounterValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR}\n */\nCSSPrimitiveValue.prototype.getCounterValue = function() {};\n\n/**\n * @param {number} unitType\n * @return {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-getFloatValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR}\n */\nCSSPrimitiveValue.prototype.getFloatValue = function(unitType) {};\n\n/**\n * @return {RGBColor}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-getRGBColorValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR}\n */\nCSSPrimitiveValue.prototype.getRGBColorValue = function() {};\n\n/**\n * @return {Rect}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-getRectValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR}\n */\nCSSPrimitiveValue.prototype.getRectValue = function() {};\n\n/**\n * @return {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-getStringValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR}\n */\nCSSPrimitiveValue.prototype.getStringValue = function() {};\n\n/**\n * @param {number} unitType\n * @param {number} floatValue\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-setFloatValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR},\n *                      {@see DomException.NO_MODIFICATION_ALLOWED_ERR}\n */\nCSSPrimitiveValue.prototype.setFloatValue = function(unitType, floatValue) {};\n\n/**\n * @param {number} stringType\n * @param {string} stringValue\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-setStringValue\n * @throws DOMException {@see DomException.INVALID_ACCESS_ERR},\n *                      {@see DomException.NO_MODIFICATION_ALLOWED_ERR}\n */\nCSSPrimitiveValue.prototype.setStringValue = function(stringType, stringValue) {};\n\n/**\n * @constructor\n * @extends {CSSValue}\n * @implements {IArrayLike}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValueList\n */\nfunction CSSValueList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValueList-length\n */\nCSSValueList.prototype.length;\n\n/**\n * @param {number} index\n * @return {CSSValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValueList-item\n */\nCSSValueList.prototype.item = function(index) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-RGBColor\n */\nfunction RGBColor() {}\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-RGBColor-red\n */\nRGBColor.prototype.red;\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-RGBColor-green\n */\nRGBColor.prototype.green;\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-RGBColor-blue\n */\nRGBColor.prototype.blue;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Rect\n */\nfunction Rect() {}\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Rect-top\n */\nRect.prototype.top;\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Rect-right\n */\nRect.prototype.right;\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Rect-bottom\n */\nRect.prototype.bottom;\n\n/**\n * @type {CSSPrimitiveValue}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Rect-left\n */\nRect.prototype.left;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Counter\n */\nfunction Counter() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Counter-identifier\n */\nCounter.prototype.identifier;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Counter-listStyle\n */\nCounter.prototype.listStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-Counter-separator\n */\nCounter.prototype.separator;\n\n/**\n * @interface\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-ViewCSS\n */\nfunction ViewCSS() {}\n\n/**\n * @param {Element} elt\n * @param {?string=} opt_pseudoElt This argument is required according to the\n *     CSS2 specification, but optional in all major browsers. See the note at\n *     https://developer.mozilla.org/en-US/docs/Web/API/Window.getComputedStyle\n * @return {?CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSview-getComputedStyle\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nViewCSS.prototype.getComputedStyle = function(elt, opt_pseudoElt) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-DocumentCSS\n */\nfunction DocumentCSS() {}\n\n/**\n * @param {Element} elt\n * @param {string} pseudoElt\n * @return {CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-DocumentCSS-getOverrideStyle\n */\nDocumentCSS.prototype.getOverrideStyle = function(elt, pseudoElt) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-DOMImplementationCSS\n */\nfunction DOMImplementationCSS() {}\n\n/**\n * @param {string} title\n * @param {string} media\n * @return {CSSStyleSheet}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-DOMImplementationCSS-createCSSStyleSheet\n * @throws DOMException {@see DomException.SYNTAX_ERR}\n */\nDOMImplementationCSS.prototype.createCSSStyleSheet = function(title, media) {};\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-ElementCSSInlineStyle\n */\nfunction ElementCSSInlineStyle() {}\n\n/**\n * @type {CSSStyleDeclaration}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-ElementCSSInlineStyle-style\n */\nElementCSSInlineStyle.prototype.style;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties\n */\nfunction CSSProperties() {}\n\n// CSS 2 properties\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-azimuth\n */\nCSSProperties.prototype.azimuth;\n\n/**\n * @type {string}\n * @see https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty\n */\nCSSProperties.prototype.backdropFilter;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-background\n */\nCSSProperties.prototype.background;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-backgroundAttachment\n */\nCSSProperties.prototype.backgroundAttachment;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-backgroundColor\n */\nCSSProperties.prototype.backgroundColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-backgroundImage\n */\nCSSProperties.prototype.backgroundImage;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-backgroundPosition\n */\nCSSProperties.prototype.backgroundPosition;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-backgroundRepeat\n */\nCSSProperties.prototype.backgroundRepeat;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-background/#the-background-size\n */\nCSSProperties.prototype.backgroundSize;\n\n/**\n * @implicitCast\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-border\n */\nCSSProperties.prototype.border;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderCollapse\n */\nCSSProperties.prototype.borderCollapse;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderColor\n */\nCSSProperties.prototype.borderColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderSpacing\n */\nCSSProperties.prototype.borderSpacing;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue-borderStyle\n */\nCSSProperties.prototype.borderStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderTop\n */\nCSSProperties.prototype.borderTop;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderRight\n */\nCSSProperties.prototype.borderRight;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderBottom\n */\nCSSProperties.prototype.borderBottom;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderLeft\n */\nCSSProperties.prototype.borderLeft;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderTopColor\n */\nCSSProperties.prototype.borderTopColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderRightColor\n */\nCSSProperties.prototype.borderRightColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderBottomColor\n */\nCSSProperties.prototype.borderBottomColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderLeftColor\n */\nCSSProperties.prototype.borderLeftColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderTopStyle\n */\nCSSProperties.prototype.borderTopStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderRightStyle\n */\nCSSProperties.prototype.borderRightStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderBottomStyle\n */\nCSSProperties.prototype.borderBottomStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderLeftStyle\n */\nCSSProperties.prototype.borderLeftStyle;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderTopWidth\n */\nCSSProperties.prototype.borderTopWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderRightWidth\n */\nCSSProperties.prototype.borderRightWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderBottomWidth\n */\nCSSProperties.prototype.borderBottomWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderLeftWidth\n */\nCSSProperties.prototype.borderLeftWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-borderWidth\n */\nCSSProperties.prototype.borderWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-radius\n */\nCSSProperties.prototype.borderRadius;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-radius\n */\nCSSProperties.prototype.borderBottomLeftRadius;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-radius\n */\nCSSProperties.prototype.borderBottomRightRadius;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-radius\n */\nCSSProperties.prototype.borderTopLeftRadius;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-radius\n */\nCSSProperties.prototype.borderTopRightRadius;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-background/#the-border-image-source\n */\nCSSProperties.prototype.borderImageSource;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-image-slice\n */\nCSSProperties.prototype.borderImageSlice;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-image-width\n */\nCSSProperties.prototype.borderImageWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-background/#the-border-image-outset\n */\nCSSProperties.prototype.borderImageOutset;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-background/#the-border-image-repeat\n */\nCSSProperties.prototype.borderImageRepeat;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-background/#the-border-image\n */\nCSSProperties.prototype.borderImage;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/1998/REC-CSS2-19980512/visuren.html#propdef-bottom\n */\nCSSProperties.prototype.bottom;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-captionSide\n */\nCSSProperties.prototype.captionSide;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-clear\n */\nCSSProperties.prototype.clear;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-clip\n */\nCSSProperties.prototype.clip;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-color\n */\nCSSProperties.prototype.color;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-content\n */\nCSSProperties.prototype.content;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-counterIncrement\n */\nCSSProperties.prototype.counterIncrement;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-counterReset\n */\nCSSProperties.prototype.counterReset;\n\n/**\n * This is not an official part of the W3C spec. In practice, this is a settable\n * property that works cross-browser. It is used in goog.dom.setProperties() and\n * needs to be extern'd so the --disambiguate_properties JS compiler pass works.\n * @type {string}\n */\nCSSProperties.prototype.cssText;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-cue\n */\nCSSProperties.prototype.cue;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-cueAfter\n */\nCSSProperties.prototype.cueAfter;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-cueBefore\n */\nCSSProperties.prototype.cueBefore;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-cursor\n */\nCSSProperties.prototype.cursor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-direction\n */\nCSSProperties.prototype.direction;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-display\n */\nCSSProperties.prototype.display;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-elevation\n */\nCSSProperties.prototype.elevation;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-emptyCells\n */\nCSSProperties.prototype.emptyCells;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-cssFloat\n */\nCSSProperties.prototype.cssFloat;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-font\n */\nCSSProperties.prototype.font;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontFamily\n */\nCSSProperties.prototype.fontFamily;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontSize\n */\nCSSProperties.prototype.fontSize;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontSizeAdjust\n */\nCSSProperties.prototype.fontSizeAdjust;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontStretch\n */\nCSSProperties.prototype.fontStretch;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontStyle\n */\nCSSProperties.prototype.fontStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontVariant\n */\nCSSProperties.prototype.fontVariant;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-fontWeight\n */\nCSSProperties.prototype.fontWeight;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-height\n */\nCSSProperties.prototype.height;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/1998/REC-CSS2-19980512/visuren.html#propdef-left\n */\nCSSProperties.prototype.left;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-letterSpacing\n */\nCSSProperties.prototype.letterSpacing;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-lineHeight\n */\nCSSProperties.prototype.lineHeight;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-listStyle\n */\nCSSProperties.prototype.listStyle;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-listStyleImage\n */\nCSSProperties.prototype.listStyleImage;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-listStylePosition\n */\nCSSProperties.prototype.listStylePosition;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-listStyleType\n */\nCSSProperties.prototype.listStyleType;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-margin\n */\nCSSProperties.prototype.margin;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-marginTop\n */\nCSSProperties.prototype.marginTop;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-marginRight\n */\nCSSProperties.prototype.marginRight;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-marginBottom\n */\nCSSProperties.prototype.marginBottom;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-marginLeft\n */\nCSSProperties.prototype.marginLeft;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-markerOffset\n */\nCSSProperties.prototype.markerOffset;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-marks\n */\nCSSProperties.prototype.marks;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-maxHeight\n */\nCSSProperties.prototype.maxHeight;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-maxWidth\n */\nCSSProperties.prototype.maxWidth;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-minHeight\n */\nCSSProperties.prototype.minHeight;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-minWidth\n */\nCSSProperties.prototype.minWidth;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-orphans\n */\nCSSProperties.prototype.orphans;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-outline\n */\nCSSProperties.prototype.outline;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-outlineColor\n */\nCSSProperties.prototype.outlineColor;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-outlineStyle\n */\nCSSProperties.prototype.outlineStyle;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-outlineWidth\n */\nCSSProperties.prototype.outlineWidth;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-overflow\n */\nCSSProperties.prototype.overflow;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-padding\n */\nCSSProperties.prototype.padding;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-paddingTop\n */\nCSSProperties.prototype.paddingTop;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-paddingRight\n */\nCSSProperties.prototype.paddingRight;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-paddingBottom\n */\nCSSProperties.prototype.paddingBottom;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-paddingLeft\n */\nCSSProperties.prototype.paddingLeft;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-page\n */\nCSSProperties.prototype.page;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pageBreakAfter\n */\nCSSProperties.prototype.pageBreakAfter;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pageBreakBefore\n */\nCSSProperties.prototype.pageBreakBefore;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pageBreakInside\n */\nCSSProperties.prototype.pageBreakInside;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pause\n */\nCSSProperties.prototype.pause;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pauseAfter\n */\nCSSProperties.prototype.pauseAfter;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pauseBefore\n */\nCSSProperties.prototype.pauseBefore;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pitch\n */\nCSSProperties.prototype.pitch;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-pitchRange\n */\nCSSProperties.prototype.pitchRange;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-playDuring\n */\nCSSProperties.prototype.playDuring;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-position\n */\nCSSProperties.prototype.position;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-quotes\n */\nCSSProperties.prototype.quotes;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-ui/#resize\n */\nCSSProperties.prototype.resize;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-richness\n */\nCSSProperties.prototype.richness;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/1998/REC-CSS2-19980512/visuren.html#propdef-right\n */\nCSSProperties.prototype.right;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-size\n */\nCSSProperties.prototype.size;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-speak\n */\nCSSProperties.prototype.speak;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-speakHeader\n */\nCSSProperties.prototype.speakHeader;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-speakNumeral\n */\nCSSProperties.prototype.speakNumeral;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-speakPunctuation\n */\nCSSProperties.prototype.speakPunctuation;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-speechRate\n */\nCSSProperties.prototype.speechRate;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-stress\n */\nCSSProperties.prototype.stress;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-tableLayout\n */\nCSSProperties.prototype.tableLayout;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-textAlign\n */\nCSSProperties.prototype.textAlign;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-textDecoration\n */\nCSSProperties.prototype.textDecoration;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-textIndent\n */\nCSSProperties.prototype.textIndent;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-textShadow\n */\nCSSProperties.prototype.textShadow;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-textTransform\n */\nCSSProperties.prototype.textTransform;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/1998/REC-CSS2-19980512/visuren.html#propdef-top\n */\nCSSProperties.prototype.top;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-unicodeBidi\n */\nCSSProperties.prototype.unicodeBidi;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-verticalAlign\n */\nCSSProperties.prototype.verticalAlign;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-visibility\n */\nCSSProperties.prototype.visibility;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-voiceFamily\n */\nCSSProperties.prototype.voiceFamily;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-volume\n */\nCSSProperties.prototype.volume;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-whiteSpace\n */\nCSSProperties.prototype.whiteSpace;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-widows\n */\nCSSProperties.prototype.widows;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-width\n */\nCSSProperties.prototype.width;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-wordSpacing\n */\nCSSProperties.prototype.wordSpacing;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-wordWrap\n */\nCSSProperties.prototype.wordWrap;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSProperties-zIndex\n */\nCSSProperties.prototype.zIndex;\n\n// CSS 3 properties\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-background/#box-shadow\n */\nCSSProperties.prototype.boxShadow;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-ui/#box-sizing\n */\nCSSProperties.prototype.boxSizing;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-color/#transparency\n */\nCSSProperties.prototype.opacity;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-ui/#text-overflow\n */\nCSSProperties.prototype.textOverflow;\n\n// CSS 3 animations\n\n/**\n * @type {string|number}\n * @see https://www.w3.org/TR/css-animations-1/#animation\n */\nCSSProperties.prototype.animation;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-delay\n */\nCSSProperties.prototype.animationDelay;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-direction\n */\nCSSProperties.prototype.animationDirection;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-duration\n */\nCSSProperties.prototype.animationDuration;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-fill-mode\n */\nCSSProperties.prototype.animationFillMode;\n\n/**\n * @type {string|number}\n * @see https://www.w3.org/TR/css-animations-1/#animation-iteration-count\n */\nCSSProperties.prototype.animationIterationCount;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-name\n */\nCSSProperties.prototype.animationName;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-play-state\n */\nCSSProperties.prototype.animationPlayState;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-animations-1/#animation-timing-function\n */\nCSSProperties.prototype.animationTimingFunction;\n\n// CSS 3 transforms\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-2d-transforms/#backface-visibility-property\n */\nCSSProperties.prototype.backfaceVisibility;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-2d-transforms/#perspective\n */\nCSSProperties.prototype.perspective;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-2d-transforms/#perspective-origin\n */\nCSSProperties.prototype.perspectiveOrigin;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-2d-transforms/#effects\n */\nCSSProperties.prototype.transform;\n\n/**\n * @type {string|number}\n * @see http://www.w3.org/TR/css3-2d-transforms/#transform-origin\n */\nCSSProperties.prototype.transformOrigin;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-2d-transforms/#transform-style\n */\nCSSProperties.prototype.transformStyle;\n\n// CSS 3 transitions\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-transitions/#transition\n */\nCSSProperties.prototype.transition;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-transitions/#transition-delay\n */\nCSSProperties.prototype.transitionDelay;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-transitions/#transition-duration\n */\nCSSProperties.prototype.transitionDuration;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-transitions/#transition-property-property\n */\nCSSProperties.prototype.transitionProperty;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css3-transitions/#transition-timing-function\n */\nCSSProperties.prototype.transitionTimingFunction;\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/SVG11/interact.html#PointerEventsProperty\n */\nCSSProperties.prototype.pointerEvents;\n\n\n// CSS Flexbox 1\n\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#align-content-property\n */\nCSSProperties.prototype.alignContent;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#align-items-property\n */\nCSSProperties.prototype.alignItems;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#align-items-property\n */\nCSSProperties.prototype.alignSelf;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-property\n */\nCSSProperties.prototype.flex;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-basis-property\n */\nCSSProperties.prototype.flexBasis;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-direction-property\n */\nCSSProperties.prototype.flexDirection;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-flow-property\n */\nCSSProperties.prototype.flexFlow;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-grow-property\n */\nCSSProperties.prototype.flexGrow;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-shrink-property\n */\nCSSProperties.prototype.flexShrink;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#flex-wrap-property\n */\nCSSProperties.prototype.flexWrap;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-flexbox-1/#justify-content-property\n */\nCSSProperties.prototype.justifyContent;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/css-flexbox-1/#order-property\n */\nCSSProperties.prototype.order;\n\n// Externs for CSS Will Change Module Level 1\n// http://www.w3.org/TR/css-will-change/\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/css-will-change-1/#will-change\n */\nCSSProperties.prototype.willChange;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-ui-4/#propdef-user-select\n */\nCSSProperties.prototype.userSelect;\n\n// CSS 3 Images\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css3-images/#the-object-fit\n */\nCSSProperties.prototype.objectFit;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css3-images/#object-position\n */\nCSSProperties.prototype.objectPosition;\n\n// CSS Masking\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-masking-1/\n */\nCSSProperties.prototype.clipPath;\n\n// CSS Containment\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/css-contain-1/\n */\nCSSProperties.prototype.contain;\n\n// SVG Stroke Properties\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.stroke;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeAlignment;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeOpacity;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeWidth;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeLinecap;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeLinejoin;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeMiterlimit;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeDasharray;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeDashoffset;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeDashcorner;\n\n/**\n * @type {string}\n * @see https://www.w3.org/TR/svg-strokes/\n */\nCSSProperties.prototype.strokeDashadjust;\n\n/**\n * TODO(dbeam): Put this in separate file named w3c_cssom.js.\n * Externs for the CSSOM View Module.\n * @see http://www.w3.org/TR/cssom-view/\n */\n\n// http://www.w3.org/TR/cssom-view/#extensions-to-the-window-interface\n\n/**\n * @param {string} media_query_list\n * @return {!MediaQueryList}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-matchmedia\n */\nWindow.prototype.matchMedia = function(media_query_list) {};\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-innerwidth\n */\nWindow.prototype.innerWidth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-innerheight\n */\nWindow.prototype.innerHeight;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-scrollx\n */\nWindow.prototype.scrollX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-pagexoffset\n */\nWindow.prototype.pageXOffset;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-scrolly\n */\nWindow.prototype.scrollY;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-pageyoffset\n */\nWindow.prototype.pageYOffset;\n\n/**\n * @typedef {{\n *   left: (number|undefined),\n *   top: (number|undefined),\n *   behavior: (string|undefined)\n * }}\n * @see https://www.w3.org/TR/cssom-view/#dictdef-scrolltooptions\n */\nvar ScrollToOptions;\n\n/**\n * @record\n * @see https://www.w3.org/TR/cssom-view/#dictdef-scrollintoviewoptions\n */\nfunction ScrollIntoViewOptions () {}\n\n/** @type {string|undefined} */\nScrollIntoViewOptions.prototype.behavior;\n\n/** @type {string|undefined} */\nScrollIntoViewOptions.prototype.block;\n\n/** @type {string|undefined} */\nScrollIntoViewOptions.prototype.inline;\n\n/**\n * @param {number|!ScrollToOptions} scrollToOptionsOrX\n * @param {number=} opt_y\n * @see http://www.w3.org/TR/cssom-view/#dom-window-scroll\n * @return {undefined}\n */\nWindow.prototype.scroll = function(scrollToOptionsOrX, opt_y) {};\n\n/**\n * @param {number|!ScrollToOptions} scrollToOptionsOrX\n * @param {number=} opt_y\n * @see http://www.w3.org/TR/cssom-view/#dom-window-scrollto\n * @return {undefined}\n */\nWindow.prototype.scrollTo = function(scrollToOptionsOrX, opt_y) {};\n\n/**\n * @param {number|!ScrollToOptions} scrollToOptionsOrX\n * @param {number=} opt_y\n * @see http://www.w3.org/TR/cssom-view/#dom-window-scrollby\n * @return {undefined}\n */\nWindow.prototype.scrollBy = function(scrollToOptionsOrX, opt_y) {};\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-screenx\n */\nWindow.prototype.screenX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-screeny\n */\nWindow.prototype.screenY;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-outerwidth\n */\nWindow.prototype.outerWidth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-window-outerheight\n */\nWindow.prototype.outerHeight;\n\n/**\n * @type {number}\n * @see https://www.w3.org/TR/cssom-view/#dom-window-devicepixelratio\n */\nWindow.prototype.devicePixelRatio;\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @see https://www.w3.org/TR/cssom-view/#dom-window-moveto\n */\nWindow.prototype.moveTo = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @see https://www.w3.org/TR/cssom-view/#dom-window-moveby\n */\nWindow.prototype.moveBy = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @see https://www.w3.org/TR/cssom-view/#dom-window-resizeto\n */\nWindow.prototype.resizeTo = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n * @see https://www.w3.org/TR/cssom-view/#dom-window-resizeby\n */\nWindow.prototype.resizeBy = function(x, y) {};\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @see http://www.w3.org/TR/cssom-view/#mediaquerylist\n */\nfunction MediaQueryList() {}\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/cssom-view/#dom-mediaquerylist-media\n */\nMediaQueryList.prototype.media;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/cssom-view/#dom-mediaquerylist-matches\n */\nMediaQueryList.prototype.matches;\n\n/**\n * @param {MediaQueryListListener} listener\n * @see http://www.w3.org/TR/cssom-view/#dom-mediaquerylist-addlistener\n * @return {undefined}\n */\nMediaQueryList.prototype.addListener = function(listener) {};\n\n/**\n * @param {MediaQueryListListener} listener\n * @see http://www.w3.org/TR/cssom-view/#dom-mediaquerylist-removelistener\n * @return {undefined}\n */\nMediaQueryList.prototype.removeListener = function(listener) {};\n\n/** @override Not available in some browsers; use addListener instead. */\nMediaQueryList.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override Not available in old browsers; use removeListener instead. */\nMediaQueryList.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nMediaQueryList.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @typedef {(function(!MediaQueryList) : void)}\n * @see http://www.w3.org/TR/cssom-view/#mediaquerylistlistener\n */\nvar MediaQueryListListener;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/cssom-view/#screen\n */\nfunction Screen() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-screen-availwidth\n */\nScreen.prototype.availWidth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-screen-availheight\n */\nScreen.prototype.availHeight;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-screen-width\n */\nScreen.prototype.width;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-screen-height\n */\nScreen.prototype.height;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-screen-colordepth\n */\nScreen.prototype.colorDepth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-screen-pixeldepth\n */\nScreen.prototype.pixelDepth;\n\n\n// http://www.w3.org/TR/cssom-view/#extensions-to-the-document-interface\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {?Element}\n * @see http://www.w3.org/TR/cssom-view/#dom-document-elementfrompoint\n */\nDocument.prototype.elementFromPoint = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {!IArrayLike}\n * @see http://www.w3.org/TR/cssom-view/#dom-document-elementsfrompoint\n */\nDocument.prototype.elementsFromPoint = function(x, y) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @return {CaretPosition}\n * @see http://www.w3.org/TR/cssom-view/#dom-document-caretpositionfrompoint\n */\nDocument.prototype.caretPositionFromPoint = function(x, y) {};\n\n/**\n * @type {Element}\n * @see http://dev.w3.org/csswg/cssom-view/#dom-document-scrollingelement\n */\nDocument.prototype.scrollingElement;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/cssom-view/#caretposition\n */\nfunction CaretPosition() {}\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/cssom-view/#dom-caretposition-offsetnode\n */\nCaretPosition.prototype.offsetNode;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-caretposition-offset\n */\nCaretPosition.prototype.offset;\n\n\n// http://www.w3.org/TR/cssom-view/#extensions-to-the-element-interface\n\n/**\n * @return {!ClientRectList}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-getclientrects\n */\nElement.prototype.getClientRects = function() {};\n\n/**\n * @return {!DOMRect}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-getboundingclientrect\n */\nElement.prototype.getBoundingClientRect = function() {};\n\n/**\n * @param {(boolean|ScrollIntoViewOptions)=} top\n * @see http://www.w3.org/TR/cssom-view/#dom-element-scrollintoview\n * @return {undefined}\n */\nElement.prototype.scrollIntoView = function(top) {};\n\n/**\n * @param {number|!ScrollToOptions} scrollToOptionsOrX\n * @param {number=} opt_y\n * @see https://www.w3.org/TR/cssom-view/#extension-to-the-element-interface\n * @return {undefined}\n */\nElement.prototype.scrollTo = function(scrollToOptionsOrX, opt_y) {};\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-scrolltop\n */\nElement.prototype.scrollTop;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-scrollleft\n */\nElement.prototype.scrollLeft;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-scrollwidth\n */\nElement.prototype.scrollWidth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-scrollheight\n */\nElement.prototype.scrollHeight;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-clienttop\n */\nElement.prototype.clientTop;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-clientleft\n */\nElement.prototype.clientLeft;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-clientwidth\n */\nElement.prototype.clientWidth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-element-clientheight\n */\nElement.prototype.clientHeight;\n\n// http://www.w3.org/TR/cssom-view/#extensions-to-the-htmlelement-interface\n\n/**\n * @type {Element}\n * @see http://www.w3.org/TR/cssom-view/#dom-htmlelement-offsetparent\n */\nHTMLElement.prototype.offsetParent;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-htmlelement-offsettop\n */\nHTMLElement.prototype.offsetTop;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-htmlelement-offsetleft\n */\nHTMLElement.prototype.offsetLeft;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-htmlelement-offsetwidth\n */\nHTMLElement.prototype.offsetWidth;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-htmlelement-offsetheight\n */\nHTMLElement.prototype.offsetHeight;\n\n\n// http://www.w3.org/TR/cssom-view/#extensions-to-the-range-interface\n\n/**\n * @return {!ClientRectList}\n * @see http://www.w3.org/TR/cssom-view/#dom-range-getclientrects\n */\nRange.prototype.getClientRects = function() {};\n\n/**\n * @return {!DOMRect}\n * @see http://www.w3.org/TR/cssom-view/#dom-range-getboundingclientrect\n */\nRange.prototype.getBoundingClientRect = function() {};\n\n\n// http://www.w3.org/TR/cssom-view/#extensions-to-the-mouseevent-interface\n\n// MouseEvent: screen{X,Y} and client{X,Y} are in DOM Level 2/3 Event as well,\n// so it seems like a specification issue. I've emailed [email protected] in\n// hopes of resolving the conflict, but in the mean time they can live here\n// (http://lists.w3.org/Archives/Public/www-style/2012May/0039.html).\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-screenx\n */\n//MouseEvent.prototype.screenX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-screeny\n */\n//MouseEvent.prototype.screenY;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-pagex\n */\nMouseEvent.prototype.pageX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-pagey\n */\nMouseEvent.prototype.pageY;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-clientx\n */\n//MouseEvent.prototype.clientX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-clienty\n */\n//MouseEvent.prototype.clientY;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-x\n */\nMouseEvent.prototype.x;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-y\n */\nMouseEvent.prototype.y;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-offsetx\n */\nMouseEvent.prototype.offsetX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-mouseevent-offsety\n */\nMouseEvent.prototype.offsetY;\n\n\n// http://www.w3.org/TR/cssom-view/#rectangles\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/cssom-view/#the-clientrectlist-interface\n * @implements {IArrayLike}\n */\nfunction ClientRectList() {}\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrectlist-length\n */\nClientRectList.prototype.length;\n\n/**\n * @param {number} index\n * @return {?DOMRect}\n * @see http://www.w3.org/TR/cssom-view/#dom-clientrectlist-item\n */\nClientRectList.prototype.item = function(index) {};\n\n/**\n * @constructor\n * http://www.w3.org/TR/css3-conditional/#CSS-interface\n */\nfunction CSSInterface() {}\n\n/**\n * @param {string} ident\n * @return {string}\n * @see http://www.w3.org/TR/cssom/#the-css.escape()-method\n * @throws DOMException {@see DOMException.INVALID_CHARACTER_ERR}\n */\nCSSInterface.prototype.escape = function(ident) {};\n\n/**\n * @param {string} property\n * @param {string=} opt_value\n * @return {boolean}\n */\nCSSInterface.prototype.supports = function(property, opt_value) {};\n\n/**\n * TODO(nicksantos): This suppress tag probably isn't needed, and\n * should be removed.\n * @suppress {duplicate}\n * @type {CSSInterface}\n */\nvar CSS;\n\n/** @type {CSSInterface} */\nWindow.prototype.CSS;\n\n// http://dev.w3.org/csswg/css-font-loading/\n\n/**\n * Set of possible string values: 'error', 'loaded', 'loading', 'unloaded'.\n * @typedef {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#enumdef-fontfaceloadstatus\n */\nvar FontFaceLoadStatus;\n\n/**\n * @typedef {{\n *   style: (string|undefined),\n *   weight: (string|undefined),\n *   stretch: (string|undefined),\n *   unicodeRange: (string|undefined),\n *   variant: (string|undefined),\n *   featureSettings: (string|undefined)\n * }}\n * @see http://dev.w3.org/csswg/css-font-loading/#dictdef-fontfacedescriptors\n */\nvar FontFaceDescriptors;\n\n/**\n * @constructor\n * @param {string} fontFamily\n * @param {(string|ArrayBuffer|ArrayBufferView)} source\n * @param {!FontFaceDescriptors=} opt_descriptors\n * @see http://dev.w3.org/csswg/css-font-loading/#font-face-constructor\n */\nfunction FontFace(fontFamily, source, opt_descriptors) {}\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-family\n */\nFontFace.prototype.family;\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-style\n */\nFontFace.prototype.style;\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-weight\n */\nFontFace.prototype.weight;\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-stretch\n */\nFontFace.prototype.stretch;\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-unicoderange\n */\nFontFace.prototype.unicodeRange;\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-variant\n */\nFontFace.prototype.variant;\n\n/**\n * @type {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-featuresettings\n */\nFontFace.prototype.featureSettings;\n\n/**\n * @type {FontFaceLoadStatus}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontface-status\n */\nFontFace.prototype.status;\n\n/**\n * @return {!Promise}\n * @see http://dev.w3.org/csswg/css-font-loading/#font-face-load\n */\nFontFace.prototype.load = function() {};\n\n/**\n * Set of possible string values: 'loaded', 'loading'.\n * @typedef {string}\n * @see http://dev.w3.org/csswg/css-font-loading/#enumdef-fontfacesetloadstatus\n */\nvar FontFaceSetLoadStatus;\n\n/**\n * @interface\n * @extends {EventTarget}\n * @see http://dev.w3.org/csswg/css-font-loading/#FontFaceSet-interface\n */\nfunction FontFaceSet() {}\n\n// Event handlers\n// http://dev.w3.org/csswg/css-font-loading/#FontFaceSet-events\n\n/** @type {?function (Event)} */ FontFaceSet.prototype.onloading;\n/** @type {?function (Event)} */ FontFaceSet.prototype.onloadingdone;\n/** @type {?function (Event)} */ FontFaceSet.prototype.onloadingerror;\n\n/**\n * @param {!FontFace} value\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-add\n * @return {undefined}\n */\nFontFaceSet.prototype.add = function(value) {};\n\n/**\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-clear\n * @return {undefined}\n */\nFontFaceSet.prototype.clear = function() {};\n\n/**\n * @param {!FontFace} value\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-delete\n * @return {undefined}\n */\nFontFaceSet.prototype.delete = function(value) {};\n\n/**\n * @param {!FontFace} font\n * @return {boolean}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-has\n */\nFontFaceSet.prototype.has = function(font) {};\n\n/**\n * @param {function(!FontFace, number, !FontFaceSet)} callback\n * @param {?Object=} selfObj\n * see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-foreach\n * @return {undefined}\n */\nFontFaceSet.prototype.forEach = function(callback, selfObj) {};\n\n/**\n * @param {string} font\n * @param {string=} opt_text\n * @return {!Promise>}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-load\n */\nFontFaceSet.prototype.load = function(font, opt_text) {};\n\n/**\n * @param {string} font\n * @param {string=} opt_text\n * @return {boolean}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-check\n */\nFontFaceSet.prototype.check = function(font, opt_text) {};\n\n/**\n * @type {!Promise}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-ready\n */\nFontFaceSet.prototype.ready;\n\n/**\n * @type {FontFaceSetLoadStatus}\n * @see http://dev.w3.org/csswg/css-font-loading/#dom-fontfaceset-status\n */\nFontFaceSet.prototype.status;\n\n/**\n * @constructor\n * @param {string} type\n * @param {{\n *   animationName: (string|undefined),\n *   elapsedTime: (number|undefined),\n *   pseudoElement: (string|undefined)\n * }=} opt_animationEventInitDict\n * @extends {Event}\n * @see https://drafts.csswg.org/css-animations/#interface-animationevent\n */\nfunction AnimationEvent(type, opt_animationEventInitDict) {};\n\n/**\n * @type {string}\n * @see https://drafts.csswg.org/css-animations/#dom-animationevent-animationname\n */\nAnimationEvent.prototype.animationName;\n\n/**\n * @type {number}\n * @see https://drafts.csswg.org/css-animations/#dom-animationevent-elapsedtime\n */\nAnimationEvent.prototype.elapsedTime;\n\n/**\n * @type {string}\n * @see https://drafts.csswg.org/css-animations/#dom-animationevent-pseudoelement\n */\nAnimationEvent.prototype.pseudoElement;\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://dev.w3.org/csswg/css-animations/#csskeyframerule\n */\nfunction CSSKeyframeRule() {}\n\n/**\n * @type {string}\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframerule-keytext\n */\nCSSKeyframeRule.prototype.keyText;\n\n/**\n * @type {!CSSStyleDeclaration}\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframerule-style\n */\nCSSKeyframeRule.prototype.style;\n\n\n/**\n * @constructor\n * @extends {CSSRule}\n * @see http://dev.w3.org/csswg/css-animations/#csskeyframesrule\n */\nfunction CSSKeyframesRule() {}\n\n/**\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-name\n * @type {string}\n */\nCSSKeyframesRule.prototype.name;\n\n/**\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-cssrules\n * @type {!CSSRuleList}\n */\nCSSKeyframesRule.prototype.cssRules;\n\n/**\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-findrule\n * @param {string} key The key text for the rule to find.\n * @return {?CSSKeyframeRule}\n */\nCSSKeyframesRule.prototype.findRule = function(key) {};\n\n/**\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-appendrule\n * @param {string} rule The text for the rule to append.\n */\nCSSKeyframesRule.prototype.appendRule = function(rule) {};\n\n/**\n * @see https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-deleterule\n * @param {string} key The key text for the rule to delete.\n */\nCSSKeyframesRule.prototype.deleteRule = function(key) {};\n","externs/gecko_css.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for Gecko's custom CSS properties. Copied from:\n * http://mxr.mozilla.org/mozilla2.0/source/dom/interfaces/css/nsIDOMCSS2Properties.idl\n *\n * @externs\n * @author [email protected] (Nick Santos)\n */\n\n\n/** @type {string} */ CSSProperties.prototype.MozAppearance;\n/** @type {string} */ CSSProperties.prototype.MozBackfaceVisibility;\n/** @type {string} */ CSSProperties.prototype.MozBackgroundClip;\n/** @type {string} */ CSSProperties.prototype.MozBackgroundInlinePolicy;\n/** @type {string} */ CSSProperties.prototype.MozBackgroundOrigin;\n/** @type {string} */ CSSProperties.prototype.MozBinding;\n/** @type {string} */ CSSProperties.prototype.MozBorderBottomColors;\n/** @type {string} */ CSSProperties.prototype.MozBorderEnd;\n/** @type {string} */ CSSProperties.prototype.MozBorderEndColor;\n/** @type {string} */ CSSProperties.prototype.MozBorderEndStyle;\n/** @type {string} */ CSSProperties.prototype.MozBorderEndWidth;\n/** @type {string} */ CSSProperties.prototype.MozBorderImage;\n/** @type {string} */ CSSProperties.prototype.MozBorderLeftColors;\n/** @type {string} */ CSSProperties.prototype.MozBorderRadius;\n/** @type {string} */ CSSProperties.prototype.MozBorderRadiusTopleft;\n/** @type {string} */ CSSProperties.prototype.MozBorderRadiusTopright;\n/** @type {string} */ CSSProperties.prototype.MozBorderRadiusBottomleft;\n/** @type {string} */ CSSProperties.prototype.MozBorderRadiusBottomright;\n/** @type {string} */ CSSProperties.prototype.MozBorderRightColors;\n/** @type {string} */ CSSProperties.prototype.MozBorderStart;\n/** @type {string} */ CSSProperties.prototype.MozBorderStartColor;\n/** @type {string} */ CSSProperties.prototype.MozBorderStartStyle;\n/** @type {string} */ CSSProperties.prototype.MozBorderStartWidth;\n/** @type {string} */ CSSProperties.prototype.MozBorderTopColors;\n/** @type {string} */ CSSProperties.prototype.MozBoxAlign;\n/** @type {string} */ CSSProperties.prototype.MozBoxDirection;\n/** @type {string} */ CSSProperties.prototype.MozBoxFlex;\n/** @type {string} */ CSSProperties.prototype.MozBoxOrdinalGroup;\n/** @type {string} */ CSSProperties.prototype.MozBoxOrient;\n/** @type {string} */ CSSProperties.prototype.MozBoxPack;\n/** @type {string} */ CSSProperties.prototype.MozBoxSizing;\n/** @type {string} */ CSSProperties.prototype.MozBoxShadow;\n/** @type {string} */ CSSProperties.prototype.MozColumnCount;\n/** @type {string} */ CSSProperties.prototype.MozColumnGap;\n/** @type {string} */ CSSProperties.prototype.MozColumnRule;\n/** @type {string} */ CSSProperties.prototype.MozColumnRuleColor;\n/** @type {string} */ CSSProperties.prototype.MozColumnRuleStyle;\n/** @type {string} */ CSSProperties.prototype.MozColumnRuleWidth;\n/** @type {string} */ CSSProperties.prototype.MozColumnWidth;\n/** @type {string} */ CSSProperties.prototype.MozFloatEdge;\n/** @type {string} */ CSSProperties.prototype.MozFontFeatureSettings;\n/** @type {string} */ CSSProperties.prototype.MozFontLanguageOverride;\n/** @type {string} */ CSSProperties.prototype.MozForceBrokenImageIcon;\n/** @type {string} */ CSSProperties.prototype.MozImageRegion;\n/** @type {string} */ CSSProperties.prototype.MozMarginEnd;\n/** @type {string} */ CSSProperties.prototype.MozMarginStart;\n/** @type {number|string} */ CSSProperties.prototype.MozOpacity;\n/** @type {string} */ CSSProperties.prototype.MozOutline;\n/** @type {string} */ CSSProperties.prototype.MozOutlineColor;\n/** @type {string} */ CSSProperties.prototype.MozOutlineOffset;\n/** @type {string} */ CSSProperties.prototype.MozOutlineRadius;\n/** @type {string} */ CSSProperties.prototype.MozOutlineRadiusBottomleft;\n/** @type {string} */ CSSProperties.prototype.MozOutlineRadiusBottomright;\n/** @type {string} */ CSSProperties.prototype.MozOutlineRadiusTopleft;\n/** @type {string} */ CSSProperties.prototype.MozOutlineRadiusTopright;\n/** @type {string} */ CSSProperties.prototype.MozOutlineStyle;\n/** @type {string} */ CSSProperties.prototype.MozOutlineWidth;\n/** @type {string} */ CSSProperties.prototype.MozPaddingEnd;\n/** @type {string} */ CSSProperties.prototype.MozPaddingStart;\n/** @type {string} */ CSSProperties.prototype.MozPerspective;\n/** @type {string} */ CSSProperties.prototype.MozStackSizing;\n/** @type {string} */ CSSProperties.prototype.MozTabSize;\n/** @type {string} */ CSSProperties.prototype.MozTransform;\n/** @type {string} */ CSSProperties.prototype.MozTransformOrigin;\n/** @type {string} */ CSSProperties.prototype.MozTransition;\n/** @type {string} */ CSSProperties.prototype.MozTransitionDelay;\n/** @type {string} */ CSSProperties.prototype.MozTransitionDuration;\n/** @type {string} */ CSSProperties.prototype.MozTransitionProperty;\n/** @type {string} */ CSSProperties.prototype.MozTransitionTimingFunction;\n/** @type {string} */ CSSProperties.prototype.MozUserFocus;\n/** @type {string} */ CSSProperties.prototype.MozUserInput;\n/** @type {string} */ CSSProperties.prototype.MozUserModify;\n/** @type {string} */ CSSProperties.prototype.MozUserSelect;\n/** @type {string} */ CSSProperties.prototype.MozWindowShadow;\n\n\n// These are non-standard Gecko CSSOM properties on Window.prototype.screen.\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/window.screen.availTop\n */\nScreen.prototype.availTop;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/window.screen.availLeft\n */\nScreen.prototype.availLeft;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/window.screen.left\n */\nScreen.prototype.left;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/window.screen.top\n */\nScreen.prototype.top;\n","externs/ie_css.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for IE's custom CSS properties, as defined here:\n * http://msdn.microsoft.com/en-us/library/aa768661(VS.85).aspx\n *\n * This page is also useful for the IDL definitions:\n * http://source.winehq.org/source/include/mshtml.idl\n *\n * @externs\n * @author [email protected]\n */\n\n/** @type {Element} */\nStyleSheet.prototype.owningElement;\n\n/** @type {boolean} */\nStyleSheet.prototype.readOnly;\n\n/** @type {StyleSheetList} */\nStyleSheet.prototype.imports;\n\n/** @type {string} */\nStyleSheet.prototype.id;\n\n/**\n * @param {string} bstrURL\n * @param {number} lIndex\n * @return {number}\n */\nStyleSheet.prototype.addImport;\n\n/**\n * @param {string} bstrSelector\n * @param {string} bstrStyle\n * @param {number=} opt_iIndex\n * @return {number}\n * @see http://msdn.microsoft.com/en-us/library/aa358796%28v=vs.85%29.aspx\n */\nStyleSheet.prototype.addRule;\n\n/**\n * @param {number} lIndex\n */\nStyleSheet.prototype.removeImport;\n\n/**\n * @param {number} lIndex\n */\nStyleSheet.prototype.removeRule;\n\n/** @type {string} */\nStyleSheet.prototype.cssText;\n\n/** @type {CSSRuleList} */\nStyleSheet.prototype.rules;\n\n// StyleSheet methods\n\n/**\n * @param {string} propName\n * @return {string}\n * @see http://msdn.microsoft.com/en-us/library/aa358797(VS.85).aspx\n */\nStyleSheet.prototype.getExpression;\n\n/**\n * @param {string} name\n * @param {string} expression\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/ms531196(VS.85).aspx\n */\nStyleSheet.prototype.setExpression;\n\n/**\n * @param {string} expression\n * @return {undefined}\n * @see http://msdn.microsoft.com/en-us/library/aa358798(VS.85).aspx\n */\nStyleSheet.prototype.removeExpression;\n\n// IE-only CSS style names.\n\n/** @type {string} */ CSSProperties.prototype.backgroundPositionX;\n\n/** @type {string} */ CSSProperties.prototype.backgroundPositionY;\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ie/ms531081(v=vs.85).aspx\n * NOTE: Left untyped to avoid conflict with caller.\n */\nCSSProperties.prototype.behavior;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms533883.aspx\n */\nCSSProperties.prototype.imeMode;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms534176(VS.85).aspx\n */\nCSSProperties.prototype.msInterpolationMode;\n\n/** @type {string} */ CSSProperties.prototype.overflowX;\n\n/** @type {string} */ CSSProperties.prototype.overflowY;\n\n/** @type {number} */ CSSProperties.prototype.pixelWidth;\n\n/** @type {number} */ CSSProperties.prototype.pixelHeight;\n\n/** @type {number} */ CSSProperties.prototype.pixelLeft;\n\n/** @type {number} */ CSSProperties.prototype.pixelTop;\n\n/** @type {string} */ CSSProperties.prototype.styleFloat;\n\n/**\n * @type {string|number}\n * @see http://msdn.microsoft.com/en-us/library/ms535169(VS.85).aspx\n */\nCSSProperties.prototype.zoom;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/ms535153(VS.85).aspx\n */\nCSSProperties.prototype.writingMode;\n\n/**\n * IE-specific extensions.\n * @see http://blogs.msdn.com/b/ie/archive/2008/09/08/microsoft-css-vendor-extensions.aspx\n */\n\n/** @type {string} */\nCSSProperties.prototype.MsAccelerator;\n\n/** @type {string} */\nCSSProperties.prototype.MsBackgroundPositionX;\n\n/** @type {string} */\nCSSProperties.prototype.MsBackgroundPositionY;\n\n/** @type {string} */\nCSSProperties.prototype.MsBehavior;\n\n/** @type {string} */\nCSSProperties.prototype.MsBlockProgression;\n\n/** @type {string} */\nCSSProperties.prototype.MsFilter;\n\n/** @type {string} */\nCSSProperties.prototype.MsImeMode;\n\n/** @type {string} */\nCSSProperties.prototype.MsLayoutGrid;\n\n/** @type {string} */\nCSSProperties.prototype.MsLayoutGridChar;\n\n/** @type {string} */\nCSSProperties.prototype.MsLayoutGridLine;\n\n/** @type {string} */\nCSSProperties.prototype.MsLayoutGridMode;\n\n/** @type {string} */\nCSSProperties.prototype.MsLayoutGridType;\n\n/** @type {string} */\nCSSProperties.prototype.MsLineBreak;\n\n/** @type {string} */\nCSSProperties.prototype.MsLineGridMode;\n\n/** @type {string} */\nCSSProperties.prototype.MsInterpolationMode;\n\n/** @type {string} */\nCSSProperties.prototype.MsOverflowX;\n\n/** @type {string} */\nCSSProperties.prototype.MsOverflowY;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbar3dlightColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbarArrowColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbarBaseColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbarDarkshadowColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbarFaceColor;\n\nCSSProperties.prototype.MsScrollbarHighlightColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbarShadowColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsScrollbarTrackColor;\n\n/** @type {string} */\nCSSProperties.prototype.MsTextAlignLast;\n\n/** @type {string} */\nCSSProperties.prototype.MsTextAutospace;\n\n/** @type {string} */\nCSSProperties.prototype.MsTextJustify;\n\n/** @type {string} */\nCSSProperties.prototype.MsTextKashidaSpace;\n\n/** @type {string} */\nCSSProperties.prototype.MsTextOverflow;\n\n/** @type {string} */\nCSSProperties.prototype.MsTextUnderlinePosition;\n\n/** @type {string} */\nCSSProperties.prototype.MsWordBreak;\n\n/** @type {string} */\nCSSProperties.prototype.MsWordWrap;\n\n/** @type {string} */\nCSSProperties.prototype.MsWritingMode;\n\n/** @type {string} */\nCSSProperties.prototype.MsZoom;\n\n/** @type {string} */\nCSSProperties.prototype.msUserSelect;\n\n// See: http://msdn.microsoft.com/en-us/library/windows/apps/Hh702466.aspx\n\n/** @type {string} */\nCSSProperties.prototype.msContentZooming;\n\n/** @type {string} */\nCSSProperties.prototype.msTouchAction;\n\n/** @type {string} */\nCSSProperties.prototype.msTransform;\n\n/** @type {string} */\nCSSProperties.prototype.msTransition;\n","externs/webkit_css.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for WebKit's custom CSS properties. Copied from:\n * {@link\n * http://trac.webkit.org/browser/trunk/Source/WebCore/css/CSSPropertyNames.in}\n *\n * If you make changes to this file, notice that every property appears\n * twice: once as an uppercase name and once as a lowercase name.\n * WebKit allows both. The uppercase version is preferred.\n *\n * @externs\n * @author [email protected] (Nick Santos)\n * @author [email protected] (Marek Stepien)\n */\n\n/** @type {string} */ CSSProperties.prototype.WebkitAlignContent;\n/** @type {string} */ CSSProperties.prototype.WebkitAlignItems;\n/** @type {string} */ CSSProperties.prototype.WebkitAlignSelf;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimation;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationDelay;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationDirection;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationDuration;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationFillMode;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationIterationCount;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationName;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationPlayState;\n/** @type {string} */ CSSProperties.prototype.WebkitAnimationTimingFunction;\n/** @type {string} */ CSSProperties.prototype.WebkitAppearance;\n/** @type {string} */ CSSProperties.prototype.WebkitAppRegion;\n/** @type {string} */ CSSProperties.prototype.WebkitAspectRatio;\n/** @type {string} */ CSSProperties.prototype.WebkitBackfaceVisibility;\n/** @type {string} */ CSSProperties.prototype.WebkitBackgroundClip;\n/** @type {string} */ CSSProperties.prototype.WebkitBackgroundComposite;\n/** @type {string} */ CSSProperties.prototype.WebkitBackgroundOrigin;\n/** @type {string} */ CSSProperties.prototype.WebkitBackgroundSize;\n/** @type {string} */ CSSProperties.prototype.WebkitBinding;\n/** @type {string} */ CSSProperties.prototype.WebkitBlendMode;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderAfter;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderAfterColor;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderAfterStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderAfterWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderBefore;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderBeforeColor;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderBeforeStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderBeforeWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderBottomLeftRadius;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderBottomRightRadius;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderEnd;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderEndColor;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderEndStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderEndWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderFit;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderHorizontalSpacing;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderImage;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderRadius;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderStart;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderStartColor;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderStartStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderStartWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderTopLeftRadius;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderTopRightRadius;\n/** @type {string} */ CSSProperties.prototype.WebkitBorderVerticalSpacing;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxAlign;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxDecorationBreak;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxDirection;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxFlex;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxFlexGroup;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxLines;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxOrdinalGroup;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxOrient;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxPack;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxReflect;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxShadow;\n/** @type {string} */ CSSProperties.prototype.WebkitBoxSizing;\n/** @type {string} */ CSSProperties.prototype.WebkitColorCorrection;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnAxis;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnBreakAfter;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnBreakBefore;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnBreakInside;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnCount;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnGap;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnProgression;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnRule;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnRuleColor;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnRuleStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnRuleWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitColumns;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnSpan;\n/** @type {string} */ CSSProperties.prototype.WebkitColumnWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitDashboardRegion;\n/** @type {string} */ CSSProperties.prototype.WebkitFilter;\n/** @type {string} */ CSSProperties.prototype.WebkitFlex;\n/** @type {string} */ CSSProperties.prototype.WebkitFlexBasis;\n/** @type {string} */ CSSProperties.prototype.WebkitFlexDirection;\n/** @type {string} */ CSSProperties.prototype.WebkitFlexFlow;\n/** @type {string} */ CSSProperties.prototype.WebkitFlexGrow;\n/** @type {string} */ CSSProperties.prototype.WebkitFlexShrink;\n/** @type {string} */ CSSProperties.prototype.WebkitFlexWrap;\n/** @type {string} */ CSSProperties.prototype.WebkitFlowFrom;\n/** @type {string} */ CSSProperties.prototype.WebkitFlowInto;\n/** @type {string} */ CSSProperties.prototype.WebkitFontSizeDelta;\n/** @type {string} */ CSSProperties.prototype.WebkitFontSmoothing;\n/** @type {string} */ CSSProperties.prototype.WebkitGridColumn;\n/** @type {string} */ CSSProperties.prototype.WebkitGridColumns;\n/** @type {string} */ CSSProperties.prototype.WebkitGridRow;\n/** @type {string} */ CSSProperties.prototype.WebkitGridRows;\n/** @type {string} */ CSSProperties.prototype.WebkitHighlight;\n/** @type {string} */ CSSProperties.prototype.WebkitHyphenateCharacter;\n/** @type {string} */ CSSProperties.prototype.WebkitHyphenateLimitAfter;\n/** @type {string} */ CSSProperties.prototype.WebkitHyphenateLimitBefore;\n/** @type {string} */ CSSProperties.prototype.WebkitHyphenateLimitLines;\n/** @type {string} */ CSSProperties.prototype.WebkitHyphens;\n/** @type {string} */ CSSProperties.prototype.WebkitJustifyContent;\n/** @type {string} */ CSSProperties.prototype.WebkitLineAlign;\n/** @type {string} */ CSSProperties.prototype.WebkitLineBoxContain;\n/** @type {string} */ CSSProperties.prototype.WebkitLineBreak;\n/** @type {string} */ CSSProperties.prototype.WebkitLineClamp;\n/** @type {string} */ CSSProperties.prototype.WebkitLineGrid;\n/** @type {string} */ CSSProperties.prototype.WebkitLineSnap;\n/** @type {string} */ CSSProperties.prototype.WebkitLocale;\n/** @type {string} */ CSSProperties.prototype.WebkitLogicalHeight;\n/** @type {string} */ CSSProperties.prototype.WebkitLogicalWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginAfter;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginAfterCollapse;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginBefore;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginBeforeCollapse;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginBottomCollapse;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginCollapse;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginEnd;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginStart;\n/** @type {string} */ CSSProperties.prototype.WebkitMarginTopCollapse;\n/** @type {string} */ CSSProperties.prototype.WebkitMarquee;\n/** @type {string} */ CSSProperties.prototype.WebkitMarqueeDirection;\n/** @type {string} */ CSSProperties.prototype.WebkitMarqueeIncrement;\n/** @type {string} */ CSSProperties.prototype.WebkitMarqueeRepetition;\n/** @type {string} */ CSSProperties.prototype.WebkitMarqueeSpeed;\n/** @type {string} */ CSSProperties.prototype.WebkitMarqueeStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitMask;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskAttachment;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskBoxImage;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskBoxImageOutset;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskBoxImageRepeat;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskBoxImageSlice;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskBoxImageSource;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskBoxImageWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskClip;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskComposite;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskImage;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskOrigin;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskPosition;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskPositionX;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskPositionY;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskRepeat;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskRepeatX;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskRepeatY;\n/** @type {string} */ CSSProperties.prototype.WebkitMaskSize;\n/** @type {string} */\nCSSProperties.prototype.WebkitMatchNearestMailBlockquoteColor;\n/** @type {string} */ CSSProperties.prototype.WebkitMaxLogicalHeight;\n/** @type {string} */ CSSProperties.prototype.WebkitMaxLogicalWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitMinLogicalHeight;\n/** @type {string} */ CSSProperties.prototype.WebkitMinLogicalWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitNbspMode;\n/** @type {string} */ CSSProperties.prototype.WebkitOrder;\n/** @type {string} */ CSSProperties.prototype.WebkitOverflowScrolling;\n/** @type {string} */ CSSProperties.prototype.WebkitPaddingAfter;\n/** @type {string} */ CSSProperties.prototype.WebkitPaddingBefore;\n/** @type {string} */ CSSProperties.prototype.WebkitPaddingEnd;\n/** @type {string} */ CSSProperties.prototype.WebkitPaddingStart;\n/** @type {string} */ CSSProperties.prototype.WebkitPerspective;\n/** @type {string} */ CSSProperties.prototype.WebkitPerspectiveOrigin;\n/** @type {string} */ CSSProperties.prototype.WebkitPerspectiveOriginX;\n/** @type {string} */ CSSProperties.prototype.WebkitPerspectiveOriginY;\n/** @type {string} */ CSSProperties.prototype.WebkitPrintColorAdjust;\n/** @type {string} */ CSSProperties.prototype.WebkitRegionBreakAfter;\n/** @type {string} */ CSSProperties.prototype.WebkitRegionBreakBefore;\n/** @type {string} */ CSSProperties.prototype.WebkitRegionBreakInside;\n/** @type {string} */ CSSProperties.prototype.WebkitRegionOverflow;\n/** @type {string} */ CSSProperties.prototype.WebkitRtlOrdering;\n/** @type {string} */ CSSProperties.prototype.WebkitRubyPosition;\n/** @type {string} */ CSSProperties.prototype.WebkitShapeInside;\n/** @type {string} */ CSSProperties.prototype.WebkitShapeMargin;\n/** @type {string} */ CSSProperties.prototype.WebkitShapeOutside;\n/** @type {string} */ CSSProperties.prototype.WebkitShapePadding;\n/** @type {string} */ CSSProperties.prototype.WebkitTapHighlightColor;\n/** @type {string} */ CSSProperties.prototype.WebkitTextAlignLast;\n/** @type {string} */ CSSProperties.prototype.WebkitTextCombine;\n/** @type {string} */ CSSProperties.prototype.WebkitTextDecorationLine;\n/** @type {string} */ CSSProperties.prototype.WebkitTextDecorationsInEffect;\n/** @type {string} */ CSSProperties.prototype.WebkitTextDecorationStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitTextEmphasis;\n/** @type {string} */ CSSProperties.prototype.WebkitTextEmphasisColor;\n/** @type {string} */ CSSProperties.prototype.WebkitTextEmphasisPosition;\n/** @type {string} */ CSSProperties.prototype.WebkitTextEmphasisStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitTextFillColor;\n/** @type {string} */ CSSProperties.prototype.WebkitTextOrientation;\n/** @type {string} */ CSSProperties.prototype.WebkitTextSecurity;\n/** @type {string} */ CSSProperties.prototype.WebkitTextSizeAdjust;\n/** @type {string} */ CSSProperties.prototype.WebkitTextStroke;\n/** @type {string} */ CSSProperties.prototype.WebkitTextStrokeColor;\n/** @type {string} */ CSSProperties.prototype.WebkitTextStrokeWidth;\n/** @type {string} */ CSSProperties.prototype.WebkitTransform;\n/** @type {string} */ CSSProperties.prototype.WebkitTransformOrigin;\n/** @type {string} */ CSSProperties.prototype.WebkitTransformOriginX;\n/** @type {string} */ CSSProperties.prototype.WebkitTransformOriginY;\n/** @type {string} */ CSSProperties.prototype.WebkitTransformOriginZ;\n/** @type {string} */ CSSProperties.prototype.WebkitTransformStyle;\n/** @type {string} */ CSSProperties.prototype.WebkitTransition;\n/** @type {string} */ CSSProperties.prototype.WebkitTransitionDelay;\n/** @type {string} */ CSSProperties.prototype.WebkitTransitionDuration;\n/** @type {string} */ CSSProperties.prototype.WebkitTransitionProperty;\n/** @type {string} */ CSSProperties.prototype.WebkitTransitionRepeatCount;\n/** @type {string} */ CSSProperties.prototype.WebkitTransitionTimingFunction;\n/** @type {string} */ CSSProperties.prototype.WebkitUserDrag;\n/** @type {string} */ CSSProperties.prototype.WebkitUserModify;\n/** @type {string} */ CSSProperties.prototype.WebkitUserSelect;\n/** @type {string} */ CSSProperties.prototype.WebkitWrap;\n/** @type {string} */ CSSProperties.prototype.WebkitWrapFlow;\n/** @type {string} */ CSSProperties.prototype.WebkitWrapThrough;\n/** @type {string} */ CSSProperties.prototype.WebkitWritingMode;\n\n// WebKit also adds bindings for the lowercase versions of these properties.\n// The uppercase version is preferred.\n\n/** @type {string} */ CSSProperties.prototype.webkitAlignContent;\n/** @type {string} */ CSSProperties.prototype.webkitAlignItems;\n/** @type {string} */ CSSProperties.prototype.webkitAlignSelf;\n/** @type {string} */ CSSProperties.prototype.webkitAnimation;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationDelay;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationDirection;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationDuration;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationFillMode;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationIterationCount;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationName;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationPlayState;\n/** @type {string} */ CSSProperties.prototype.webkitAnimationTimingFunction;\n/** @type {string} */ CSSProperties.prototype.webkitAppearance;\n/** @type {string} */ CSSProperties.prototype.webkitAppRegion;\n/** @type {string} */ CSSProperties.prototype.webkitAspectRatio;\n/** @type {string} */ CSSProperties.prototype.webkitBackfaceVisibility;\n/** @type {string} */ CSSProperties.prototype.webkitBackgroundClip;\n/** @type {string} */ CSSProperties.prototype.webkitBackgroundComposite;\n/** @type {string} */ CSSProperties.prototype.webkitBackgroundOrigin;\n/** @type {string} */ CSSProperties.prototype.webkitBackgroundSize;\n/** @type {string} */ CSSProperties.prototype.webkitBinding;\n/** @type {string} */ CSSProperties.prototype.webkitBlendMode;\n/** @type {string} */ CSSProperties.prototype.webkitBorderAfter;\n/** @type {string} */ CSSProperties.prototype.webkitBorderAfterColor;\n/** @type {string} */ CSSProperties.prototype.webkitBorderAfterStyle;\n/** @type {string} */ CSSProperties.prototype.webkitBorderAfterWidth;\n/** @type {string} */ CSSProperties.prototype.webkitBorderBefore;\n/** @type {string} */ CSSProperties.prototype.webkitBorderBeforeColor;\n/** @type {string} */ CSSProperties.prototype.webkitBorderBeforeStyle;\n/** @type {string} */ CSSProperties.prototype.webkitBorderBeforeWidth;\n/** @type {string} */ CSSProperties.prototype.webkitBorderBottomLeftRadius;\n/** @type {string} */ CSSProperties.prototype.webkitBorderBottomRightRadius;\n/** @type {string} */ CSSProperties.prototype.webkitBorderEnd;\n/** @type {string} */ CSSProperties.prototype.webkitBorderEndColor;\n/** @type {string} */ CSSProperties.prototype.webkitBorderEndStyle;\n/** @type {string} */ CSSProperties.prototype.webkitBorderEndWidth;\n/** @type {string} */ CSSProperties.prototype.webkitBorderFit;\n/** @type {string} */ CSSProperties.prototype.webkitBorderHorizontalSpacing;\n/** @type {string} */ CSSProperties.prototype.webkitBorderImage;\n/** @type {string} */ CSSProperties.prototype.webkitBorderRadius;\n/** @type {string} */ CSSProperties.prototype.webkitBorderStart;\n/** @type {string} */ CSSProperties.prototype.webkitBorderStartColor;\n/** @type {string} */ CSSProperties.prototype.webkitBorderStartStyle;\n/** @type {string} */ CSSProperties.prototype.webkitBorderStartWidth;\n/** @type {string} */ CSSProperties.prototype.webkitBorderTopLeftRadius;\n/** @type {string} */ CSSProperties.prototype.webkitBorderTopRightRadius;\n/** @type {string} */ CSSProperties.prototype.webkitBorderVerticalSpacing;\n/** @type {string} */ CSSProperties.prototype.webkitBoxAlign;\n/** @type {string} */ CSSProperties.prototype.webkitBoxDecorationBreak;\n/** @type {string} */ CSSProperties.prototype.webkitBoxDirection;\n/** @type {string} */ CSSProperties.prototype.webkitBoxFlex;\n/** @type {string} */ CSSProperties.prototype.webkitBoxFlexGroup;\n/** @type {string} */ CSSProperties.prototype.webkitBoxLines;\n/** @type {string} */ CSSProperties.prototype.webkitBoxOrdinalGroup;\n/** @type {string} */ CSSProperties.prototype.webkitBoxOrient;\n/** @type {string} */ CSSProperties.prototype.webkitBoxPack;\n/** @type {string} */ CSSProperties.prototype.webkitBoxReflect;\n/** @type {string} */ CSSProperties.prototype.webkitBoxShadow;\n/** @type {string} */ CSSProperties.prototype.webkitBoxSizing;\n/** @type {string} */ CSSProperties.prototype.webkitColorCorrection;\n/** @type {string} */ CSSProperties.prototype.webkitColumnAxis;\n/** @type {string} */ CSSProperties.prototype.webkitColumnBreakAfter;\n/** @type {string} */ CSSProperties.prototype.webkitColumnBreakBefore;\n/** @type {string} */ CSSProperties.prototype.webkitColumnBreakInside;\n/** @type {string} */ CSSProperties.prototype.webkitColumnCount;\n/** @type {string} */ CSSProperties.prototype.webkitColumnGap;\n/** @type {string} */ CSSProperties.prototype.webkitColumnProgression;\n/** @type {string} */ CSSProperties.prototype.webkitColumnRule;\n/** @type {string} */ CSSProperties.prototype.webkitColumnRuleColor;\n/** @type {string} */ CSSProperties.prototype.webkitColumnRuleStyle;\n/** @type {string} */ CSSProperties.prototype.webkitColumnRuleWidth;\n/** @type {string} */ CSSProperties.prototype.webkitColumns;\n/** @type {string} */ CSSProperties.prototype.webkitColumnSpan;\n/** @type {string} */ CSSProperties.prototype.webkitColumnWidth;\n/** @type {string} */ CSSProperties.prototype.webkitDashboardRegion;\n/** @type {string} */ CSSProperties.prototype.webkitFilter;\n/** @type {string} */ CSSProperties.prototype.webkitFlex;\n/** @type {string} */ CSSProperties.prototype.webkitFlexBasis;\n/** @type {string} */ CSSProperties.prototype.webkitFlexDirection;\n/** @type {string} */ CSSProperties.prototype.webkitFlexFlow;\n/** @type {string} */ CSSProperties.prototype.webkitFlexGrow;\n/** @type {string} */ CSSProperties.prototype.webkitFlexShrink;\n/** @type {string} */ CSSProperties.prototype.webkitFlexWrap;\n/** @type {string} */ CSSProperties.prototype.webkitFlowFrom;\n/** @type {string} */ CSSProperties.prototype.webkitFlowInto;\n/** @type {string} */ CSSProperties.prototype.webkitFontSizeDelta;\n/** @type {string} */ CSSProperties.prototype.webkitFontSmoothing;\n/** @type {string} */ CSSProperties.prototype.webkitGridColumn;\n/** @type {string} */ CSSProperties.prototype.webkitGridColumns;\n/** @type {string} */ CSSProperties.prototype.webkitGridRow;\n/** @type {string} */ CSSProperties.prototype.webkitGridRows;\n/** @type {string} */ CSSProperties.prototype.webkitHighlight;\n/** @type {string} */ CSSProperties.prototype.webkitHyphenateCharacter;\n/** @type {string} */ CSSProperties.prototype.webkitHyphenateLimitAfter;\n/** @type {string} */ CSSProperties.prototype.webkitHyphenateLimitBefore;\n/** @type {string} */ CSSProperties.prototype.webkitHyphenateLimitLines;\n/** @type {string} */ CSSProperties.prototype.webkitHyphens;\n/** @type {string} */ CSSProperties.prototype.webkitJustifyContent;\n/** @type {string} */ CSSProperties.prototype.webkitLineAlign;\n/** @type {string} */ CSSProperties.prototype.webkitLineBoxContain;\n/** @type {string} */ CSSProperties.prototype.webkitLineBreak;\n/** @type {string} */ CSSProperties.prototype.webkitLineClamp;\n/** @type {string} */ CSSProperties.prototype.webkitLineGrid;\n/** @type {string} */ CSSProperties.prototype.webkitLineSnap;\n/** @type {string} */ CSSProperties.prototype.webkitLocale;\n/** @type {string} */ CSSProperties.prototype.webkitLogicalHeight;\n/** @type {string} */ CSSProperties.prototype.webkitLogicalWidth;\n/** @type {string} */ CSSProperties.prototype.webkitMarginAfter;\n/** @type {string} */ CSSProperties.prototype.webkitMarginAfterCollapse;\n/** @type {string} */ CSSProperties.prototype.webkitMarginBefore;\n/** @type {string} */ CSSProperties.prototype.webkitMarginBeforeCollapse;\n/** @type {string} */ CSSProperties.prototype.webkitMarginBottomCollapse;\n/** @type {string} */ CSSProperties.prototype.webkitMarginCollapse;\n/** @type {string} */ CSSProperties.prototype.webkitMarginEnd;\n/** @type {string} */ CSSProperties.prototype.webkitMarginStart;\n/** @type {string} */ CSSProperties.prototype.webkitMarginTopCollapse;\n/** @type {string} */ CSSProperties.prototype.webkitMarquee;\n/** @type {string} */ CSSProperties.prototype.webkitMarqueeDirection;\n/** @type {string} */ CSSProperties.prototype.webkitMarqueeIncrement;\n/** @type {string} */ CSSProperties.prototype.webkitMarqueeRepetition;\n/** @type {string} */ CSSProperties.prototype.webkitMarqueeSpeed;\n/** @type {string} */ CSSProperties.prototype.webkitMarqueeStyle;\n/** @type {string} */ CSSProperties.prototype.webkitMask;\n/** @type {string} */ CSSProperties.prototype.webkitMaskAttachment;\n/** @type {string} */ CSSProperties.prototype.webkitMaskBoxImage;\n/** @type {string} */ CSSProperties.prototype.webkitMaskBoxImageOutset;\n/** @type {string} */ CSSProperties.prototype.webkitMaskBoxImageRepeat;\n/** @type {string} */ CSSProperties.prototype.webkitMaskBoxImageSlice;\n/** @type {string} */ CSSProperties.prototype.webkitMaskBoxImageSource;\n/** @type {string} */ CSSProperties.prototype.webkitMaskBoxImageWidth;\n/** @type {string} */ CSSProperties.prototype.webkitMaskClip;\n/** @type {string} */ CSSProperties.prototype.webkitMaskComposite;\n/** @type {string} */ CSSProperties.prototype.webkitMaskImage;\n/** @type {string} */ CSSProperties.prototype.webkitMaskOrigin;\n/** @type {string} */ CSSProperties.prototype.webkitMaskPosition;\n/** @type {string} */ CSSProperties.prototype.webkitMaskPositionX;\n/** @type {string} */ CSSProperties.prototype.webkitMaskPositionY;\n/** @type {string} */ CSSProperties.prototype.webkitMaskRepeat;\n/** @type {string} */ CSSProperties.prototype.webkitMaskRepeatX;\n/** @type {string} */ CSSProperties.prototype.webkitMaskRepeatY;\n/** @type {string} */ CSSProperties.prototype.webkitMaskSize;\n/** @type {string} */\nCSSProperties.prototype.webkitMatchNearestMailBlockquoteColor;\n/** @type {string} */ CSSProperties.prototype.webkitMaxLogicalHeight;\n/** @type {string} */ CSSProperties.prototype.webkitMaxLogicalWidth;\n/** @type {string} */ CSSProperties.prototype.webkitMinLogicalHeight;\n/** @type {string} */ CSSProperties.prototype.webkitMinLogicalWidth;\n/** @type {string} */ CSSProperties.prototype.webkitNbspMode;\n/** @type {string} */ CSSProperties.prototype.webkitOrder;\n/** @type {string} */ CSSProperties.prototype.webkitOverflowScrolling;\n/** @type {string} */ CSSProperties.prototype.webkitPaddingAfter;\n/** @type {string} */ CSSProperties.prototype.webkitPaddingBefore;\n/** @type {string} */ CSSProperties.prototype.webkitPaddingEnd;\n/** @type {string} */ CSSProperties.prototype.webkitPaddingStart;\n/** @type {string} */ CSSProperties.prototype.webkitPerspective;\n/** @type {string} */ CSSProperties.prototype.webkitPerspectiveOrigin;\n/** @type {string} */ CSSProperties.prototype.webkitPerspectiveOriginX;\n/** @type {string} */ CSSProperties.prototype.webkitPerspectiveOriginY;\n/** @type {string} */ CSSProperties.prototype.webkitPrintColorAdjust;\n/** @type {string} */ CSSProperties.prototype.webkitRegionBreakAfter;\n/** @type {string} */ CSSProperties.prototype.webkitRegionBreakBefore;\n/** @type {string} */ CSSProperties.prototype.webkitRegionBreakInside;\n/** @type {string} */ CSSProperties.prototype.webkitRegionOverflow;\n/** @type {string} */ CSSProperties.prototype.webkitRtlOrdering;\n/** @type {string} */ CSSProperties.prototype.webkitRubyPosition;\n/** @type {string} */ CSSProperties.prototype.webkitShapeInside;\n/** @type {string} */ CSSProperties.prototype.webkitShapeMargin;\n/** @type {string} */ CSSProperties.prototype.webkitShapeOutside;\n/** @type {string} */ CSSProperties.prototype.webkitShapePadding;\n/** @type {string} */ CSSProperties.prototype.webkitTapHighlightColor;\n/** @type {string} */ CSSProperties.prototype.webkitTextAlignLast;\n/** @type {string} */ CSSProperties.prototype.webkitTextCombine;\n/** @type {string} */ CSSProperties.prototype.webkitTextDecorationLine;\n/** @type {string} */ CSSProperties.prototype.webkitTextDecorationsInEffect;\n/** @type {string} */ CSSProperties.prototype.webkitTextDecorationStyle;\n/** @type {string} */ CSSProperties.prototype.webkitTextEmphasis;\n/** @type {string} */ CSSProperties.prototype.webkitTextEmphasisColor;\n/** @type {string} */ CSSProperties.prototype.webkitTextEmphasisPosition;\n/** @type {string} */ CSSProperties.prototype.webkitTextEmphasisStyle;\n/** @type {string} */ CSSProperties.prototype.webkitTextFillColor;\n/** @type {string} */ CSSProperties.prototype.webkitTextOrientation;\n/** @type {string} */ CSSProperties.prototype.webkitTextSecurity;\n/** @type {string} */ CSSProperties.prototype.webkitTextSizeAdjust;\n/** @type {string} */ CSSProperties.prototype.webkitTextStroke;\n/** @type {string} */ CSSProperties.prototype.webkitTextStrokeColor;\n/** @type {string} */ CSSProperties.prototype.webkitTextStrokeWidth;\n/** @type {string} */ CSSProperties.prototype.webkitTransform;\n/** @type {string} */ CSSProperties.prototype.webkitTransformOrigin;\n/** @type {string} */ CSSProperties.prototype.webkitTransformOriginX;\n/** @type {string} */ CSSProperties.prototype.webkitTransformOriginY;\n/** @type {string} */ CSSProperties.prototype.webkitTransformOriginZ;\n/** @type {string} */ CSSProperties.prototype.webkitTransformStyle;\n/** @type {string} */ CSSProperties.prototype.webkitTransition;\n/** @type {string} */ CSSProperties.prototype.webkitTransitionDelay;\n/** @type {string} */ CSSProperties.prototype.webkitTransitionDuration;\n/** @type {string} */ CSSProperties.prototype.webkitTransitionProperty;\n/** @type {string} */ CSSProperties.prototype.webkitTransitionRepeatCount;\n/** @type {string} */ CSSProperties.prototype.webkitTransitionTimingFunction;\n/** @type {string} */ CSSProperties.prototype.webkitUserDrag;\n/** @type {string} */ CSSProperties.prototype.webkitUserModify;\n/** @type {string} */ CSSProperties.prototype.webkitUserSelect;\n/** @type {string} */ CSSProperties.prototype.webkitWrap;\n/** @type {string} */ CSSProperties.prototype.webkitWrapFlow;\n/** @type {string} */ CSSProperties.prototype.webkitWrapThrough;\n/** @type {string} */ CSSProperties.prototype.webkitWritingMode;\n\n/**\n * @constructor\n * @param {number} x\n * @param {number} y\n */\nfunction WebKitPoint(x, y) {}\n\n/** @type {number} */\nWebKitPoint.prototype.x;\n\n/** @type {number} */\nWebKitPoint.prototype.y;\n","externs/window.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview JavaScript Built-Ins for windows properties.\n *\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n */\n\n// Window properties\n// Only common properties are here.  Others such as open()\n// should be used with an explicit Window object.\n\n/**\n * @const {!Window}\n * @see https://developer.mozilla.org/en/DOM/window.top\n */\nvar top;\n\n/**\n * @const {!Navigator}\n * @see https://developer.mozilla.org/en/DOM/window.navigator\n */\nvar navigator;\n\n/**\n * @const {!HTMLDocument}\n * @see https://developer.mozilla.org/en/DOM/window.document\n */\nvar document;\n\n/**\n * @const {!Location}\n * @see https://developer.mozilla.org/en/DOM/window.location\n * @suppress {duplicate}\n * @implicitCast\n */\nvar location;\n\n/**\n * @const {!Screen}\n * @see https://developer.mozilla.org/En/DOM/window.screen\n */\nvar screen;\n\n/**\n * @const {!Window}\n * @see https://developer.mozilla.org/En/DOM/Window.self\n */\nvar self;\n\n/**\n * @type {!Window}\n * @see https://developer.mozilla.org/en/DOM/window\n */\nvar window;\n\n/**\n * @const {boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/isSecureContext\n */\nvar isSecureContext;\n\n/**\n * @const {!VisualViewport}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/visualViewport\n */\nvar visualViewport;\n\n/**\n * @param {*} message\n * @see https://developer.mozilla.org/en/DOM/window.alert\n * @return {undefined}\n */\nfunction alert(message) {}\n\n/**\n * @param {number=} immediateID\n * @see https://developer.mozilla.org/en-US/docs/DOM/window.clearImmediate\n * @see http://msdn.microsoft.com/en-us/library/ie/hh924825(v=vs.85).aspx\n * @return {undefined}\n */\nfunction clearImmediate(immediateID) {}\n\n/**\n * @param {?number|undefined} intervalID\n * @see https://developer.mozilla.org/en/DOM/window.clearInterval\n * @suppress {duplicate}\n * @return {undefined}\n */\nfunction clearInterval(intervalID) {}\n\n/**\n * @param {?number|undefined} timeoutID\n * @see https://developer.mozilla.org/en/DOM/window.clearTimeout\n * @suppress {duplicate}\n * @return {undefined}\n */\nfunction clearTimeout(timeoutID) {}\n\n/**\n * @param {*} message\n * @return {boolean}\n * @see https://developer.mozilla.org/en/DOM/window.confirm\n */\nfunction confirm(message) {}\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.dump\n * @param {*} x\n * @return {undefined}\n */\nfunction dump(x) {}\n\n/**\n * @param {string} message\n * @param {string=} opt_value\n * @return {?string}\n * @see https://developer.mozilla.org/en/DOM/window.prompt\n */\nfunction prompt(message, opt_value) {}\n\n/**\n * @param {function()} callback\n * @param {...?} callbackParams\n * @return {number}\n * @see https://developer.mozilla.org/en-US/docs/DOM/window.setImmediate\n * @see http://msdn.microsoft.com/en-us/library/ie/hh773176(v=vs.85).aspx\n */\nfunction setImmediate(callback, callbackParams) {}\n\n/**\n * @param {Function|!TrustedScript|string} callback\n * @param {number=} opt_delay\n * @param {...?} callbackParams\n * @return {number}\n * @see https://developer.mozilla.org/en/DOM/window.setInterval\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#timers\n */\nfunction setInterval(callback, opt_delay, callbackParams) {}\n\n/**\n * @param {Function|!TrustedScript|string} callback\n * @param {number=} opt_delay\n * @param {...*} callbackParams\n * @return {number}\n * @see https://developer.mozilla.org/en/DOM/window.setTimeout\n * @see https://html.spec.whatwg.org/multipage/webappapis.html#timers\n */\nfunction setTimeout(callback, opt_delay, callbackParams) {}\n\n/**\n * Returns whether the object has a property with the specified name.\n *\n * @param {*} propertyName Implicitly cast to a string.\n * @return {boolean}\n * @nosideeffects\n * @see http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty\n */\nfunction hasOwnProperty (propertyName) {}\n","externs/deprecated.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview JavaScript Built-Ins that are not part of any specifications\n * but are still needed in some project's build.\n * @externs\n */\nvar opera = {};\n\nopera.postError;\n\n/** @nosideeffects */\nopera.version = function() {};\n\n/** @constructor */\nfunction XSLTProcessor() {}\n\n/**\n * @param {Node} styleSheet\n * @return {undefined}\n * @deprecated\n */\nXSLTProcessor.importStylesheet = function(styleSheet) {};\n\n/**\n * @param {Node} source\n * @return {Document}\n * @deprecated\n */\nXSLTProcessor.transformToDocument = function(source) {};\n\n// The \"methods\" object is a place to hang arbitrary external\n// properties. It is a throwback to pre-typed days, and should\n// not be used for any new definitions; it exists only to bridge\n// the gap between the old way and the new way.\nvar methods = {};\n","externs/fido.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions from the FIDO Specifications\n * @see https://fidoalliance.org/download/\n *\n * @externs\n * @author [email protected] (Arnar Birgisson)\n */\n\n/**\n * U2F JavaScript API namespace\n * @see https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-javascript-api-v1.2-ps-20170411.html\n * @const\n */\nvar u2f = {};\n\n/**\n * Data object for a single sign request.\n * @typedef {string}\n */\nu2f.Transport;\n\n/**\n * Data object for a registered key.\n * @typedef {{\n *   version: string,\n *   keyHandle: string,\n *   transports: (!Array|undefined),\n *   appId: ?string\n * }}\n */\nu2f.RegisteredKey;\n\n/**\n * An error object for responses\n * @typedef {{\n *   errorCode: number,\n *   errorMessage: ?string\n * }}\n */\nu2f.Error;\n\n/**\n * Data object for a sign response.\n * @typedef {{\n *   keyHandle: string,\n *   signatureData: string,\n *   clientData: string\n * }}\n */\nu2f.SignResponse;\n\n/**\n * @typedef {{\n *   version: string,\n *   challenge: string\n * }}\n */\nu2f.RegisterRequest\n\n/**\n * @param {string} appId\n * @param {string} challenge\n * @param {!Array} registeredKeys\n * @param {function((!u2f.Error|!u2f.SignResponse))} callback\n * @param {number=} opt_timeoutSeconds\n */\nu2f.sign = function(\n    appId, challenge, registeredKeys, callback, opt_timeoutSeconds) {};\n\n/**\n * @param {string} appId\n * @param {!Array} registerRequests\n * @param {!Array} registeredKeys\n * @param {function((!u2f.Error|!u2f.SignResponse))} callback\n * @param {number=} opt_timeoutSeconds\n */\nu2f.register = function(\n    appId, registerRequests, registeredKeys, callback, opt_timeoutSeconds) {};\n","externs/w3c_fileapi.js":"/*\n * Copyright 2010 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for objects in the File API, File Writer API, and\n * File System API. Details of the API are at:\n * http://www.w3.org/TR/FileAPI/\n *\n * @externs\n */\n\n/** @record */\nfunction BlobPropertyBag() {};\n\n/** @type {(string|undefined)} */\nBlobPropertyBag.prototype.type;\n\n/**\n * @see http://dev.w3.org/2006/webapi/FileAPI/#dfn-Blob\n * @param {Array=} opt_blobParts\n * @param {BlobPropertyBag=} opt_options\n * @constructor\n * @nosideeffects\n */\nfunction Blob(opt_blobParts, opt_options) {}\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-size\n * @type {number}\n */\nBlob.prototype.size;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-type\n * @type {string}\n */\nBlob.prototype.type;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-slice\n * @param {number=} start\n * @param {number=} length\n * @param {string=} opt_contentType\n * @return {!Blob}\n * @nosideeffects\n */\nBlob.prototype.slice = function(start, length, opt_contentType) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#arraybuffer-method-algo\n * @return {!Promise}\n * @nosideeffects\n */\nBlob.prototype.arrayBuffer = function() {};\n\n/**\n * @see https://www.w3.org/TR/FileAPI/#dom-blob-text\n * @return {!Promise}\n * @nosideeffects\n */\nBlob.prototype.text = function() {};\n\n\n/**\n * @record\n * @extends {BlobPropertyBag}\n **/\nfunction FilePropertyBag() {};\n\n/** @type {(number|undefined)} */\nFilePropertyBag.prototype.lastModified;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-file\n * @param {!Array=} contents\n * @param {string=} name\n * @param {FilePropertyBag=} properties\n * @constructor\n * @extends {Blob}\n */\nfunction File(contents, name, properties) {}\n\n/**\n * Chrome uses this instead of name.\n * @deprecated Use name instead.\n * @type {string}\n */\nFile.prototype.fileName;\n\n/**\n * Chrome uses this instead of size.\n * @deprecated Use size instead.\n * @type {string}\n */\nFile.prototype.fileSize;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-name\n * @type {string}\n */\nFile.prototype.name;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-lastModifiedDate\n * @type {Date}\n */\nFile.prototype.lastModifiedDate;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-lastModified\n * @type {number}\n */\nFile.prototype.lastModified;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-filereader\n * @constructor\n * @implements {EventTarget}\n */\nfunction FileReader() {}\n\n/** @override */\nFileReader.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/** @override */\nFileReader.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nFileReader.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsArrayBuffer\n * @param {!Blob} blob\n * @return {undefined}\n */\nFileReader.prototype.readAsArrayBuffer = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsBinaryStringAsync\n * @param {!Blob} blob\n * @return {undefined}\n */\nFileReader.prototype.readAsBinaryString = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsText\n * @param {!Blob} blob\n * @param {string=} encoding\n * @return {undefined}\n */\nFileReader.prototype.readAsText = function(blob, encoding) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsDataURL\n * @param {!Blob} blob\n * @return {undefined}\n */\nFileReader.prototype.readAsDataURL = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-abort\n * @return {undefined}\n */\nFileReader.prototype.abort = function() {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-empty\n * @const {number}\n */\nFileReader.prototype.EMPTY;\n\n/** @const {number} */\nFileReader.EMPTY;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-loading\n * @const {number}\n */\nFileReader.prototype.LOADING;\n\n/** @const {number} */\nFileReader.LOADING;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-done\n * @const {number}\n */\nFileReader.prototype.DONE;\n\n/** @const {number} */\nFileReader.DONE;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readystate\n * @type {number}\n */\nFileReader.prototype.readyState;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-result\n * @type {string|Blob|ArrayBuffer}\n */\nFileReader.prototype.result;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-error\n * @type {DOMError}\n */\nFileReader.prototype.error;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-onloadstart\n * @type {?function(!ProgressEvent)}\n */\nFileReader.prototype.onloadstart;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-onprogress\n * @type {?function(!ProgressEvent)}\n */\nFileReader.prototype.onprogress;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-onload\n * @type {?function(!ProgressEvent)}\n */\nFileReader.prototype.onload;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-onabort\n * @type {?function(!ProgressEvent)}\n */\nFileReader.prototype.onabort;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-onerror\n * @type {?function(!ProgressEvent)}\n */\nFileReader.prototype.onerror;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-onloadend\n * @type {?function(!ProgressEvent)}\n */\nFileReader.prototype.onloadend;\n\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#FileReaderSyncSync\n * @constructor\n */\nfunction FileReaderSync() {}\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsArrayBufferSync\n * @param {!Blob} blob\n * @return {!ArrayBuffer}\n */\nFileReaderSync.prototype.readAsArrayBuffer = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsBinaryStringSync\n * @param {!Blob} blob\n * @return {string}\n */\nFileReaderSync.prototype.readAsBinaryString = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsTextSync\n * @param {!Blob} blob\n * @param {string=} encoding\n * @return {string}\n */\nFileReaderSync.prototype.readAsText = function(blob, encoding) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-readAsDataURLSync\n * @param {!Blob} blob\n * @return {string}\n */\nFileReaderSync.prototype.readAsDataURL = function(blob) {};\n","externs/nonstandard_fileapi.js":"/*\n * Copyright 2019 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for file api implemented in\n *     various browsers but not part of https://www.w3.org/TR/FileAPI.\n * @externs\n */\n\n/**\n * This replaces Blob.slice in Chrome since WebKit revision 84005.\n * @see http://lists.w3.org/Archives/Public/public-webapps/2011AprJun/0222.html\n * @param {number=} start\n * @param {number=} end\n * @param {string=} contentType\n * @return {!Blob}\n * @nosideeffects\n */\nBlob.prototype.webkitSlice = function(start, end, contentType) {};\n\n/**\n * This replaces Blob.slice in Firefox.\n * @see http://lists.w3.org/Archives/Public/public-webapps/2011AprJun/0222.html\n * @param {number=} start\n * @param {number=} end\n * @param {string=} contentType\n * @return {!Blob}\n * @nosideeffects\n */\nBlob.prototype.mozSlice = function(start, end, contentType) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#the-blobbuilder-interface\n * @constructor\n */\nfunction BlobBuilder() {}\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-append0\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-append1\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-append2\n * @param {string|Blob|ArrayBuffer} data\n * @param {string=} endings\n * @return {undefined}\n */\nBlobBuilder.prototype.append = function(data, endings) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-getBlob\n * @param {string=} contentType\n * @return {!Blob}\n */\nBlobBuilder.prototype.getBlob = function(contentType) {};\n\n/**\n * This has replaced BlobBuilder in Chrome since WebKit revision 84008.\n * @see http://lists.w3.org/Archives/Public/public-webapps/2011AprJun/0222.html\n * @constructor\n */\nfunction WebKitBlobBuilder() {}\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-append0\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-append1\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-append2\n * @param {string|Blob|ArrayBuffer} data\n * @param {string=} endings\n * @return {undefined}\n */\nWebKitBlobBuilder.prototype.append = function(data, endings) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-BlobBuilder-getBlob\n * @param {string=} contentType\n * @return {!Blob}\n */\nWebKitBlobBuilder.prototype.getBlob = function(contentType) {};\n\n/**\n * @record\n * @see https://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-dictionary\n */\nfunction FileSystemFlags() {};\n\n/** @type {(undefined|boolean)} */\nFileSystemFlags.prototype.create;\n\n/** @type {(undefined|boolean)} */\nFileSystemFlags.prototype.exclusive;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-directoryentry-interface\n * @constructor\n * @extends {Entry}\n */\nfunction DirectoryEntry() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntry-createReader\n * @return {!DirectoryReader}\n */\nDirectoryEntry.prototype.createReader = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntry-getFile\n * @param {string} path\n * @param {!FileSystemFlags=} options\n * @param {function(!FileEntry)=} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nDirectoryEntry.prototype.getFile = function(\n    path, options, successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntry-getDirectory\n * @param {string} path\n * @param {!FileSystemFlags=} options\n * @param {function(!DirectoryEntry)=} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nDirectoryEntry.prototype.getDirectory = function(\n    path, options, successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntry-removeRecursively\n * @param {function()} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nDirectoryEntry.prototype.removeRecursively = function(\n    successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-directoryreader-interface\n * @constructor\n */\nfunction DirectoryReader() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryReader-readEntries\n * @param {function(!Array)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nDirectoryReader.prototype.readEntries = function(\n    successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-entry-interface\n * @constructor\n */\nfunction Entry() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-isFile\n * @type {boolean}\n */\nEntry.prototype.isFile;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-isDirectory\n * @type {boolean}\n */\nEntry.prototype.isDirectory;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-name\n * @type {string}\n */\nEntry.prototype.name;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-fullPath\n * @type {string}\n */\nEntry.prototype.fullPath;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-filesystem\n * @type {!FileSystem}\n */\nEntry.prototype.filesystem;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-moveTo\n * @param {!DirectoryEntry} parent\n * @param {string=} newName\n * @param {function(!Entry)=} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nEntry.prototype.moveTo = function(\n    parent, newName, successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-copyTo\n * @param {!DirectoryEntry} parent\n * @param {string=} newName\n * @param {function(!Entry)=} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nEntry.prototype.copyTo = function(\n    parent, newName, successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-toURL\n * @param {string=} mimeType\n * @return {string}\n */\nEntry.prototype.toURL = function(mimeType) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-remove\n * @param {function()} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nEntry.prototype.remove = function(successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-getMetadata\n * @param {function(!Metadata)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nEntry.prototype.getMetadata = function(successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Entry-getParent\n * @param {function(!Entry)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nEntry.prototype.getParent = function(successCallback, errorCallback) {};\n\n/**\n * @return {?Entry} The Entry corresponding to this item, or null. Note that\n * despite its name,this method only works in Chrome, and will eventually\n * be renamed to {@code getAsEntry}.\n * @nosideeffects\n */\nDataTransferItem.prototype.webkitGetAsEntry = function() {};\n\n/**\n * @see https://wicg.github.io/entries-api/#dom-file-webkitrelativepath\n * @type {string}\n */\nFile.prototype.webkitRelativePath;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-fileentry-interface\n * @constructor\n * @extends {Entry}\n */\nfunction FileEntry() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileEntry-createWriter\n * @param {function(!FileWriter)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nFileEntry.prototype.createWriter = function(successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileEntry-file\n * @param {function(!File)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nFileEntry.prototype.file = function(successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#FileErrorInterface\n * @constructor\n * @extends {DOMError}\n */\nfunction FileError() {}\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-NOT_FOUND_ERR\n * @const {number}\n */\nFileError.prototype.NOT_FOUND_ERR;\n\n/** @const {number} */\nFileError.NOT_FOUND_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-SECURITY_ERR\n * @const {number}\n */\nFileError.prototype.SECURITY_ERR;\n\n/** @const {number} */\nFileError.SECURITY_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-ABORT_ERR\n * @const {number}\n */\nFileError.prototype.ABORT_ERR;\n\n/** @const {number} */\nFileError.ABORT_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-NOT_READABLE_ERR\n * @const {number}\n */\nFileError.prototype.NOT_READABLE_ERR;\n\n/** @const {number} */\nFileError.NOT_READABLE_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-ENCODING_ERR\n * @const {number}\n */\nFileError.prototype.ENCODING_ERR;\n\n/** @const {number} */\nFileError.ENCODING_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileError-NO_MODIFICATION_ALLOWED_ERR\n * @const {number}\n */\nFileError.prototype.NO_MODIFICATION_ALLOWED_ERR;\n\n/** @const {number} */\nFileError.NO_MODIFICATION_ALLOWED_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileException-INVALID_STATE_ERR\n * @const {number}\n */\nFileError.prototype.INVALID_STATE_ERR;\n\n/** @const {number} */\nFileError.INVALID_STATE_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileException-SYNTAX_ERR\n * @const {number}\n */\nFileError.prototype.SYNTAX_ERR;\n\n/** @const {number} */\nFileError.SYNTAX_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileError-INVALID_MODIFICATION_ERR\n * @const {number}\n */\nFileError.prototype.INVALID_MODIFICATION_ERR;\n\n/** @const {number} */\nFileError.INVALID_MODIFICATION_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileError-QUOTA_EXCEEDED_ERR\n * @const {number}\n */\nFileError.prototype.QUOTA_EXCEEDED_ERR;\n\n/** @const {number} */\nFileError.QUOTA_EXCEEDED_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileException-TYPE_MISMATCH_ERR\n * @const {number}\n */\nFileError.prototype.TYPE_MISMATCH_ERR;\n\n/** @const {number} */\nFileError.TYPE_MISMATCH_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileException-PATH_EXISTS_ERR\n * @const {number}\n */\nFileError.prototype.PATH_EXISTS_ERR;\n\n/** @const {number} */\nFileError.PATH_EXISTS_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-code-exception\n * @type {number}\n * @deprecated Use the 'name' or 'message' attributes of DOMError rather than\n * 'code'\n */\nFileError.prototype.code;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#idl-def-FileSaver\n * @constructor\n */\nfunction FileSaver() {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-abort\n * @return {undefined}\n */\nFileSaver.prototype.abort = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-INIT\n * @const {number}\n */\nFileSaver.prototype.INIT;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-WRITING\n * @const {number}\n */\nFileSaver.prototype.WRITING;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-DONE\n * @const {number}\n */\nFileSaver.prototype.DONE;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-readyState\n * @type {number}\n */\nFileSaver.prototype.readyState;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-error\n * @type {FileError}\n */\nFileSaver.prototype.error;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-onwritestart\n * @type {?function(!ProgressEvent)}\n */\nFileSaver.prototype.onwritestart;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-onprogress\n * @type {?function(!ProgressEvent)}\n */\nFileSaver.prototype.onprogress;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-onwrite\n * @type {?function(!ProgressEvent)}\n */\nFileSaver.prototype.onwrite;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-onabort\n * @type {?function(!ProgressEvent)}\n */\nFileSaver.prototype.onabort;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-onerror\n * @type {?function(!ProgressEvent)}\n */\nFileSaver.prototype.onerror;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileSaver-onwriteend\n * @type {?function(!ProgressEvent)}\n */\nFileSaver.prototype.onwriteend;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-filesystem-interface\n * @constructor\n */\nfunction FileSystem() {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileSystem-name\n * @type {string}\n */\nFileSystem.prototype.name;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileSystem-root\n * @type {!DirectoryEntry}\n */\nFileSystem.prototype.root;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#idl-def-FileWriter\n * @constructor\n * @extends {FileSaver}\n */\nfunction FileWriter() {}\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriter-position\n * @type {number}\n */\nFileWriter.prototype.position;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriter-length\n * @type {number}\n */\nFileWriter.prototype.length;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriter-write\n * @param {!Blob} blob\n * @return {undefined}\n */\nFileWriter.prototype.write = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriter-seek\n * @param {number} offset\n * @return {undefined}\n */\nFileWriter.prototype.seek = function(offset) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriter-truncate\n * @param {number} size\n * @return {undefined}\n */\nFileWriter.prototype.truncate = function(size) {};\n\n/**\n * LocalFileSystem interface, implemented by Window and WorkerGlobalScope.\n * @see http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem\n * @constructor\n */\nfunction LocalFileSystem() {}\n\n/**\n * Metadata interface.\n * @see http://www.w3.org/TR/file-system-api/#idl-def-Metadata\n * @constructor\n */\nfunction Metadata() {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Metadata-modificationTime\n * @type {!Date}\n */\nMetadata.prototype.modificationTime;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-Metadata-size\n * @type {number}\n */\nMetadata.prototype.size;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-TEMPORARY\n * @const {number}\n */\nWindow.prototype.TEMPORARY;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-PERSISTENT\n * @const {number}\n */\nWindow.prototype.PERSISTENT;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-requestFileSystem\n * @param {number} type\n * @param {number} size\n * @param {function(!FileSystem)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nfunction requestFileSystem(type, size, successCallback, errorCallback) {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-requestFileSystem\n * @param {number} type\n * @param {number} size\n * @param {function(!FileSystem)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nWindow.prototype.requestFileSystem = function(\n    type, size, successCallback, errorCallback) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-resolveLocalFileSystemURI\n * @param {string} uri\n * @param {function(!Entry)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nfunction resolveLocalFileSystemURI(uri, successCallback, errorCallback) {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-resolveLocalFileSystemURI\n * @param {string} uri\n * @param {function(!Entry)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nWindow.prototype.resolveLocalFileSystemURI =\n    function(uri, successCallback, errorCallback) {}\n\n/**\n * This has replaced requestFileSystem in Chrome since WebKit revision 84224.\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-requestFileSystem\n * @param {number} type\n * @param {number} size\n * @param {function(!FileSystem)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nfunction webkitRequestFileSystem(type, size, successCallback, errorCallback) {}\n\n/**\n * This has replaced requestFileSystem in Chrome since WebKit revision 84224.\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-requestFileSystem\n * @param {number} type\n * @param {number} size\n * @param {function(!FileSystem)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nWindow.prototype.webkitRequestFileSystem = function(type, size, successCallback,\n    errorCallback) {};\n\n/**\n * This has replaced resolveLocalFileSystemURI in Chrome since WebKit revision\n * 84224.\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-resolveLocalFileSystemURI\n * @param {string} uri\n * @param {function(!Entry)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nfunction webkitResolveLocalFileSystemURI(uri, successCallback, errorCallback) {}\n\n/**\n * This has replaced resolveLocalFileSystemURI in Chrome since WebKit revision\n * 84224.\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-resolveLocalFileSystemURI\n * @param {string} uri\n * @param {function(!Entry)} successCallback\n * @param {function(!FileError)=} errorCallback\n * @return {undefined}\n */\nWindow.prototype.webkitResolveLocalFileSystemURI = function(\n    uri, successCallback, errorCallback) {}\n\n// WindowBlobURIMethods interface, implemented by Window and WorkerGlobalScope.\n// There are three APIs for this: the old specced API, the new specced API, and\n// the webkit-prefixed API.\n// @see http://www.w3.org/TR/FileAPI/#creating-revoking\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-createObjectURL\n * @param {!Object} obj\n * @return {string}\n */\nfunction createObjectURL(obj) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-createObjectURL\n * @param {!Object} obj\n * @return {string}\n */\nWindow.prototype.createObjectURL = function(obj) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-revokeObjectURL\n * @param {string} url\n * @return {undefined}\n */\nfunction revokeObjectURL(url) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-revokeObjectURL\n * @param {string} url\n * @return {undefined}\n */\nWindow.prototype.revokeObjectURL = function(url) {};\n\n/**\n * This has been replaced by URL in Chrome since WebKit revision 75739.\n * @constructor\n * @param {string} urlString\n * @param {string=} base\n */\nfunction webkitURL(urlString, base) {}\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-createObjectURL\n * @param {!Object} obj\n * @return {string}\n */\nwebkitURL.createObjectURL = function(obj) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-revokeObjectURL\n * @param {string} url\n * @return {undefined}\n */\nwebkitURL.revokeObjectURL = function(url) {};\n\n/**\n * @see https://developers.google.com/chrome/whitepapers/storage\n * @constructor\n */\nfunction StorageInfo() {}\n\n/**\n * @see https://developers.google.com/chrome/whitepapers/storage\n * @const {number}\n * */\nStorageInfo.prototype.TEMPORARY;\n\n/**\n * @see https://developers.google.com/chrome/whitepapers/storage\n * @const {number}\n */\nStorageInfo.prototype.PERSISTENT;\n\n/**\n * @see https://developers.google.com/chrome/whitepapers/storage#requestQuota\n * @param {number} type\n * @param {number} size\n * @param {function(number)} successCallback\n * @param {function(!DOMException)=} errorCallback\n * @return {undefined}\n */\nStorageInfo.prototype.requestQuota = function(\n    type, size, successCallback, errorCallback) {};\n\n/**\n * @see https://developers.google.com/chrome/whitepapers/storage#queryUsageAndQuota\n * @param {number} type\n * @param {function(number, number)} successCallback\n * @param {function(!DOMException)=} errorCallback\n * @return {undefined}\n */\nStorageInfo.prototype.queryUsageAndQuota = function(\n    type, successCallback, errorCallback) {};\n\n/**\n * @see https://developers.google.com/chrome/whitepapers/storage\n * @type {!StorageInfo}\n */\nWindow.prototype.webkitStorageInfo;\n\n/**\n * @see https://dvcs.w3.org/hg/quota/raw-file/tip/Overview.html#storagequota-interface.\n * @constructor\n */\nfunction StorageQuota() {}\n\n/**\n * @param {number} size\n * @param {function(number)=} successCallback\n * @param {function(!DOMException)=} errorCallback\n * @return {undefined}\n */\nStorageQuota.prototype.requestQuota = function(\n    size, successCallback, errorCallback) {};\n\n/**\n * @param {function(number, number)} successCallback\n * @param {function(!DOMException)=} errorCallback\n * @return {undefined}\n */\nStorageQuota.prototype.queryUsageAndQuota = function(\n    successCallback, errorCallback) {};\n\n/**\n * @type {!StorageQuota}\n * @see https://developer.chrome.com/apps/offline_storage\n */\nNavigator.prototype.webkitPersistentStorage;\n\n/**\n * @type {!StorageQuota}\n * @see https://developer.chrome.com/apps/offline_storage\n */\nNavigator.prototype.webkitTemporaryStorage;\n\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#idl-def-FileWriterSync\n * @constructor\n */\nfunction FileWriterSync() {}\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriterSync-position\n * @type {number}\n * @const\n */\nFileWriterSync.prototype.position;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriterSync-length\n * @type {number}\n * @const\n */\nFileWriterSync.prototype.length;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriter-write\n * @param {!Blob} blob\n * @return {undefined}\n */\nFileWriterSync.prototype.write = function(blob) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriterSync-seek\n * @param {number} offset\n * @return {undefined}\n */\nFileWriterSync.prototype.seek = function(offset) {};\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileWriterSync-truncate\n * @param {number} size\n * @return {undefined}\n */\nFileWriterSync.prototype.truncate = function(size) {};\n\n/**\n * LocalFileSystemSync interface, implemented by WorkerGlobalScope.\n * @see http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystemSync\n * @constructor\n */\nfunction LocalFileSystemSync() {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/\n *     #the-synchronous-filesystem-interface\n * @constructor\n */\nfunction FileSystemSync() {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileSystemSync-name\n * @type {string}\n * @const\n */\nFileSystemSync.prototype.name;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileSystemSync-root\n * @type {!DirectoryEntrySync}\n * @const\n */\nFileSystemSync.prototype.root;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystemSync-requestFileSystemSync-FileSystemSync-unsigned-short-type-unsigned-long-long-size\n * @param {number} type\n * @param {number} size\n * @return {!FileSystemSync}\n */\nfunction requestFileSystemSync(type, size) {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-LocalFileSystemSync-requestFileSystemSync-FileSystemSync-unsigned-short-type-unsigned-long-long-size\n * @param {number} type\n * @param {number} size\n * @return {!FileSystemSync}\n */\nfunction webkitRequestFileSystemSync(type, size) {}\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-entrysync-interface\n * @constructor\n */\nfunction EntrySync() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-isFile\n * @type {boolean}\n * @const\n */\nEntrySync.prototype.isFile;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-isDirectory\n * @type {boolean}\n * @const\n */\nEntrySync.prototype.isDirectory;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-name\n * @type {string}\n * @const\n */\nEntrySync.prototype.name;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-fullPath\n * @type {string}\n * @const\n */\nEntrySync.prototype.fullPath;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-filesystem\n * @type {!FileSystemSync}\n * @const\n */\nEntrySync.prototype.filesystem;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-moveTo\n * @param {!DirectoryEntrySync} parent\n * @param {string=} newName\n * @return {!EntrySync}\n */\nEntrySync.prototype.moveTo = function(parent, newName) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-copyTo\n * @param {!DirectoryEntrySync} parent\n * @param {string=} newName\n * @return {!EntrySync}\n */\nEntrySync.prototype.copyTo = function(parent, newName) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-toURL\n * @param {string=} mimeType\n * @return {string}\n */\nEntrySync.prototype.toURL = function(mimeType) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-remove\n * @return {undefined}\n */\nEntrySync.prototype.remove = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-getMetadata\n * @return {!Metadata}\n */\nEntrySync.prototype.getMetadata = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-EntrySync-getParent\n * @return {!DirectoryEntrySync}\n */\nEntrySync.prototype.getParent = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface\n * @constructor\n * @extends {EntrySync}\n */\nfunction DirectoryEntrySync() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntrySync-createReader\n * @return {!DirectoryReaderSync}\n */\nDirectoryEntrySync.prototype.createReader = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntrySync-getFile\n * @param {string} path\n * @param {Object=} options\n * @return {!FileEntrySync}\n */\nDirectoryEntrySync.prototype.getFile = function(path, options) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntrySync-getDirectory\n * @param {string} path\n * @param {Object=} options\n * @return {!DirectoryEntrySync}\n */\nDirectoryEntrySync.prototype.getDirectory = function(path, options) {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryEntrySync-removeRecursively\n * @return {undefined}\n */\nDirectoryEntrySync.prototype.removeRecursively = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-directoryreadersync-interface\n * @constructor\n */\nfunction DirectoryReaderSync() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-DirectoryReaderSync-readEntries\n * @return {!Array}\n */\nDirectoryReaderSync.prototype.readEntries = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-fileentrysync-interface\n * @constructor\n * @extends {EntrySync}\n */\nfunction FileEntrySync() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileEntrySync-createWriter\n * @return {!FileWriterSync}\n */\nFileEntrySync.prototype.createWriter = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileEntrySync-file\n * @return {!File}\n */\nFileEntrySync.prototype.file = function() {};\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#the-fileexception-exception\n * @constructor\n */\nfunction FileException() {}\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-NOT_FOUND_ERR\n * @type {number}\n */\nFileException.prototype.NOT_FOUND_ERR;\n\n/** @type {number} */\nFileException.NOT_FOUND_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-SECURITY_ERR\n * @type {number}\n */\nFileException.prototype.SECURITY_ERR;\n\n/** @type {number} */\nFileException.SECURITY_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#widl-FileException-ABORT_ERR\n * @type {number}\n */\nFileException.prototype.ABORT_ERR;\n\n/** @type {number} */\nFileException.ABORT_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#widl-FileException-NOT_READABLE_ERR\n * @type {number}\n */\nFileException.prototype.NOT_READABLE_ERR;\n\n/** @type {number} */\nFileException.NOT_READABLE_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#widl-FileException-ENCODING_ERR\n * @type {number}\n */\nFileException.prototype.ENCODING_ERR;\n\n/** @type {number} */\nFileException.ENCODING_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileException-NO_MODIFICATION_ALLOWED_ERR\n * @type {number}\n */\nFileException.prototype.NO_MODIFICATION_ALLOWED_ERR;\n\n/** @type {number} */\nFileException.NO_MODIFICATION_ALLOWED_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileException-INVALID_STATE_ERR\n * @type {number}\n */\nFileException.prototype.INVALID_STATE_ERR;\n\n/** @type {number} */\nFileException.INVALID_STATE_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-writer-api/#widl-FileException-SYNTAX_ERR\n * @type {number}\n */\nFileException.prototype.SYNTAX_ERR;\n\n/** @type {number} */\nFileException.SYNTAX_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileException-INVALID_MODIFICATION_ERR\n * @type {number}\n */\nFileException.prototype.INVALID_MODIFICATION_ERR;\n\n/** @type {number} */\nFileException.INVALID_MODIFICATION_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileException-QUOTA_EXCEEDED_ERR\n * @type {number}\n */\nFileException.prototype.QUOTA_EXCEEDED_ERR;\n\n/** @type {number} */\nFileException.QUOTA_EXCEEDED_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileException-TYPE_MISMATCH_ERR\n * @type {number}\n */\nFileException.prototype.TYPE_MISMATCH_ERR;\n\n/** @type {number} */\nFileException.TYPE_MISMATCH_ERR;\n\n/**\n * @see http://www.w3.org/TR/file-system-api/#widl-FileException-PATH_EXISTS_ERR\n * @type {number}\n */\nFileException.prototype.PATH_EXISTS_ERR;\n\n/** @type {number} */\nFileException.PATH_EXISTS_ERR;\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-code-exception\n * @type {number}\n */\nFileException.prototype.code;\n","externs/flash.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for all the Flash Object JavaScript methods. This\n * file depends on w3c_dom2.js.\n * Created from\n * http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html\n *\n * @externs\n * @author [email protected] (Andy Perelson)\n */\n\n\n// Standard Methods.\n\n/**\n * Call a Flash function exported by ExternalInterface.\n * @param {string} xmlString The XML string passed to Flash. The outer element\n *     should be {@code }. A sample invocation string:\n *     {@code \n *     test}\n * @return {string} The serialized return value from Flash that you can eval.\n */\nHTMLObjectElement.prototype.CallFunction = function(xmlString) {};\n\n/**\n * Returns the value of the Flash variable specified by varName or null if the\n * variable does not exist.\n * @param {string} varName The variable name.\n * @return {?string} The variable value.\n */\nHTMLObjectElement.prototype.GetVariable = function(varName) {};\n\n/**\n * Activates the frame number specified by `frameNumber` in the current\n * movie.\n * @param {number} frameNumber A non-negative integer frame number.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.GotoFrame = function(frameNumber) {};\n\n/**\n * @return {boolean} Whether the movie is currently playing.\n */\nHTMLObjectElement.prototype.IsPlaying = function() {};\n\n/**\n * Loads the movie identified by `url` to the layer specified by\n * `layerNumber`.\n * @param {number} layerNumber The layer number.\n * @param {string} url The movie URL.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.LoadMovie = function(layerNumber, url) {};\n\n/**\n * Pans a zoomed-in movie to the coordinates specified by x and y. Use mode to\n * specify whether the values for x and y are pixels or a percent of the window.\n * When mode is 0, the coordinates are pixels; when mode is 1, the coordinates\n * are percent of the window.\n * @param {number} x The x-coordinate.\n * @param {number} y The y-coordinate.\n * @param {number} mode The mode.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.Pan = function(x, y, mode) {};\n\n/**\n * @return {number} The percent of the Flash Player movie that has streamed\n *     into the browser so far; Possible values are from 0 to 100.\n */\nHTMLObjectElement.prototype.PercentLoaded = function() {};\n\n/**\n * Starts playing the movie.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.Play = function() {};\n\n/**\n * Goes to the first frame.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.Rewind = function() {};\n\n/**\n * Sets the value of the flash variable.\n * @param {string} variableName The variable name.\n * @param {string} value The value.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.SetVariable = function(variableName, value) {};\n\n/**\n * Zooms in on a rectangular area of the movie. The units of the coordinates\n * are in twips (1440 units per inch).\n * @param {number} left The left coordinate.\n * @param {number} top The top coordinate.\n * @param {number} right The right coordinate.\n * @param {number} bottom The bottom coordinate.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.SetZoomRect = function(left, top, right, bottom) {};\n\n/**\n * Stops playing the movie.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.StopPlay = function() {};\n\n/**\n * @return {number} The total number of frames in the movie.\n */\nHTMLObjectElement.prototype.TotalFrames = function() {};\n\n/**\n * Zooms the view by a relative scale factor.\n * @param {number} percent The percentage scale factor, should be an integer.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.Zoom = function(percent) {};\n\n\n// TellTarget Methods.\n\n/**\n * Executes the action in the timeline specified by `target` in the\n * specified frame.\n * @param {string} target The timeline.\n * @param {number} frameNumber The frame number.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TCallFrame = function(target, frameNumber) {};\n\n/**\n * Executes the action in the timeline specified by `target` in the\n * specified frame.\n * @param {string} target The timeline.\n * @param {string} label The frame label.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TCallLabel = function(target, label) {};\n\n/**\n * Returns the number of the current frame for the specified timeline.\n * @param {string} target The timeline.\n * @return {number} The number of the current frame.\n */\nHTMLObjectElement.prototype.TCurentFrame = function(target) {};\n\n/**\n * Returns the label of the current frame for the specified timeline.\n * @param {string} target The timeline.\n * @return {string} The label of the current frame, empty string if no\n *     current frame.\n */\nHTMLObjectElement.prototype.TCurrentLabel = function(target) {};\n\n/**\n * Returns a string indicating the value of the property in the\n * specified timeline.\n * @param {string} target The timeline.\n * @param {number} property The integer corresponding to the desired property.\n * @return {string} The value of the property.\n */\nHTMLObjectElement.prototype.TGetProperty = function(target, property) {};\n\n/**\n * Returns a number indicating the value of the property in the specified\n * timeline.\n * @param {string} target The timeline.\n * @param {number} property The integer corresponding to the desired property.\n * @return {number} A number indicating the value of the property.\n */\nHTMLObjectElement.prototype.TGetPropertyAsNumber = function(target, property) {};\n\n/**\n * Goes to the specified frame number in the specified timeline.\n * @param {string} target The timeline.\n * @param {number} frameNumber The frame number.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TGotoFrame = function(target, frameNumber) {};\n\n/**\n * Goes to the specified frame label in the specified timeline.\n * @param {string} target The timeline.\n * @param {string} label The framelabel.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TGotoLabel = function(target, label) {};\n\n/**\n * Plays the specified timeline.\n * @param {number} target The timeline.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TPlay = function(target) {};\n\n/**\n * Sets the value of the property in the specified timeline.\n * @param {number} target The timeline.\n * @param {number} property The integer corresponding to the desired property.\n * @param {string|number} value The value.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TSetProperty = function(target, property, value) {};\n\n/**\n * Stops the specified timeline.\n * @param {number} target The timeline.\n * @return {undefined}\n */\nHTMLObjectElement.prototype.TStopPlay = function(target) {};\n","externs/gecko_xml.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for all the extensions over some of the\n *  W3C's XML specifications by Gecko. This file depends on\n *  w3c_xml.js. The whole file has been fully type annotated.\n *\n * @externs\n * @author [email protected] (Alan Leung)\n */\n\n/**\n * XMLSerializer can be used to convert DOM subtree or DOM document into text.\n * XMLSerializer is available to unprivileged scripts.\n *\n * XMLSerializer is mainly useful for applications and extensions based on\n * Mozilla platform. While it's available to web pages, it's not part of any\n * standard and level of support in other browsers is unknown.\n *\n * @constructor\n */\nfunction XMLSerializer() {}\n\n/**\n * Returns the serialized subtree in the form of a string\n * @param {Node} subtree\n * @return {string}\n */\nXMLSerializer.prototype.serializeToString = function(subtree) {};\n\n/**\n * The subtree rooted by the specified element is serialized to a byte stream\n * using the character set specified.\n *\n * @param {Node} subtree\n * @return {Object}\n */\nXMLSerializer.prototype.serializeToStream = function(subtree) {};\n\n/**\n * DOMParser is mainly useful for applications and extensions based on Mozilla\n * platform. While it's available to web pages, it's not part of any standard and\n * level of support in other browsers is unknown.\n *\n * @constructor\n */\nfunction DOMParser() {}\n\n/**\n * The string passed in is parsed into a DOM document.\n *\n * Example:\n *  var parser = new DOMParser();\n *  var doc = parser.parseFromString(aStr, \"text/xml\");\n *\n * @param {!TrustedHTML|string} src The UTF16 string to be parsed.\n * @param {string} type The content type of the string.\n * @return {Document}\n */\nDOMParser.prototype.parseFromString = function(src, type) {};\n","externs/ie_vml.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for IE's vector markup language, or VML.\n *\n * @externs\n * @author [email protected] (Robby Walker)\n */\n\n\n/**\n * @type {Object|string}\n * @see http://msdn.microsoft.com/en-us/library/bb263836(VS.85).aspx\n */\nElement.prototype.coordorigin;\n\n/**\n * @type {Object|string}\n * @see http://msdn.microsoft.com/en-us/library/bb263837(VS.85).aspx\n */\nElement.prototype.coordsize;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/bb263839(VS.85).aspx\n */\nElement.prototype.fillcolor;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/bb263840(VS.85).aspx\n */\nElement.prototype.filled;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/bb263871(VS.85).aspx\n */\nElement.prototype.path;\n\n/**\n * @type {number|string}\n * @see http://msdn.microsoft.com/en-us/library/bb263877(VS.85).aspx\n */\nElement.prototype.rotation;\n\n/**\n * @type {string}\n * @see http://msdn.microsoft.com/en-us/library/bb263881(VS.85).aspx\n */\nElement.prototype.strokecolor;\n\n/**\n * @type {boolean}\n * @see http://msdn.microsoft.com/en-us/library/bb263882(VS.85).aspx\n */\nElement.prototype.stroked;\n\n/**\n * @type {number|string}\n * @see http://msdn.microsoft.com/en-us/library/bb263883(VS.85).aspx\n */\nElement.prototype.strokeweight;\n","externs/intersection_observer.js":"/*\n * Copyright 2016 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Externs for Intersection Observer objects.\n * @see https://w3c.github.io/IntersectionObserver/\n * @externs\n * @author [email protected] (Rob Durbin)\n */\n\n// TODO(robadurbin): Once the Intersection Observer spec is adopted by W3C, add\n// a w3c_ prefix to this file's name.\n\n\n/**\n * These contain the information provided from a change event.\n * @see https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @record\n */\nfunction IntersectionObserverEntry() {}\n\n/**\n * The time the change was observed.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-time\n * @const {number}\n */\nIntersectionObserverEntry.prototype.time;\n\n/**\n * The root intersection rectangle, if target belongs to the same unit of\n * related similar-origin browsing contexts as the intersection root, null\n * otherwise.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-rootbounds\n * @const {{top: number, right: number, bottom: number, left: number,\n *     height: number, width: number}}\n */\nIntersectionObserverEntry.prototype.rootBounds;\n\n/**\n * The rectangle describing the element being observed.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-boundingclientrect\n * @const {!{top: number, right: number, bottom: number, left: number,\n *     height: number, width: number}}\n */\nIntersectionObserverEntry.prototype.boundingClientRect;\n\n/**\n * The rectangle describing the intersection between the observed element and\n * the viewport.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-intersectionrect\n * @const {!{top: number, right: number, bottom: number, left: number,\n *     height: number, width: number}}\n */\nIntersectionObserverEntry.prototype.intersectionRect;\n\n/**\n * Ratio of intersectionRect area to boundingClientRect area.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-intersectionratio\n * @const {number}\n */\nIntersectionObserverEntry.prototype.intersectionRatio;\n\n/**\n * The Element whose intersection with the intersection root changed.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-target\n * @const {!Element}\n */\nIntersectionObserverEntry.prototype.target;\n\n/**\n * Whether or not the target is intersecting with the root.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserverentry-isintersecting\n * @const {boolean}\n */\nIntersectionObserverEntry.prototype.isIntersecting;\n\n/**\n * Whether or not the target is visible with the root.\n * @see https://w3c.github.io/IntersectionObserver/v2/#dom-intersectionobserverentry-isvisible\n * @const {boolean|undefined}\n */\nIntersectionObserverEntry.prototype.isVisible;\n\n/**\n * Callback for the IntersectionObserver.\n * @see https://w3c.github.io/IntersectionObserver/#intersection-observer-callback\n * @typedef {function(!Array,!IntersectionObserver)}\n */\nvar IntersectionObserverCallback;\n\n/**\n * Options for the IntersectionObserver.\n * @see https://w3c.github.io/IntersectionObserver/v2/#intersection-observer-init\n * @typedef {{\n *   threshold: (!Array|number|undefined),\n *   delay: (number|undefined),\n *   trackVisibility: (boolean|undefined),\n *   root: (?Element|undefined),\n *   rootMargin: (string|undefined)\n * }}\n */\nvar IntersectionObserverInit;\n\n/**\n * This is the constructor for Intersection Observer objects.\n * @see https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {!IntersectionObserverCallback} handler The callback for the observer.\n * @param {!IntersectionObserverInit=} opt_options The object defining the\n *     thresholds, etc.\n * @constructor\n */\nfunction IntersectionObserver(handler, opt_options) {};\n\n/**\n * The root Element to use for intersection, or null if the observer uses the\n * implicit root.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-root\n * @const {?Element}\n */\nIntersectionObserver.prototype.root;\n\n/**\n * Offsets applied to the intersection root’s bounding box, effectively growing\n * or shrinking the box that is used to calculate intersections.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-rootmargin\n * @const {string}\n */\nIntersectionObserver.prototype.rootMargin;\n\n/**\n * A list of thresholds, sorted in increasing numeric order, where each\n * threshold is a ratio of intersection area to bounding box area of an observed\n * target.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-thresholds\n * @const {!Array}\n */\nIntersectionObserver.prototype.thresholds;\n\n/**\n * This is used to set which element to observe.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-observe\n * @param {!Element} element The element to observe.\n * @return {undefined}\n */\nIntersectionObserver.prototype.observe = function(element) {};\n\n/**\n * This is used to stop observing a given element.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-unobserve\n * @param {!Element} element The elmenent to stop observing.\n * @return {undefined}\n */\nIntersectionObserver.prototype.unobserve = function(element) {};\n\n/**\n * Disconnect.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-disconnect\n */\nIntersectionObserver.prototype.disconnect = function() {};\n\n/**\n * Take records.\n * @see https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-takerecords\n * @return {!Array.}\n */\nIntersectionObserver.prototype.takeRecords = function() {};\n","externs/iphone.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for all iPhone extensions. Created from:\n * http://developer.apple.com/library/safari/navigation/\n *\n * @externs\n * @author [email protected] (Andrew Grieve)\n */\n\n\n/**\n * @type {number}\n */\nTouch.prototype.webkitForce;\n\n/**\n * @type {number}\n */\nTouch.prototype.webkitRadiusX;\n\n/**\n * @type {number}\n */\nTouch.prototype.webkitRadiusY;\n\n/**\n * The distance between two fingers since the start of an event as a multiplier\n * of the initial distance. The initial value is 1.0. If less than 1.0, the\n * gesture is pinch close (to zoom out). If greater than 1.0, the gesture is\n * pinch open (to zoom in).\n * @type {number}\n */\nTouchEvent.prototype.scale;\n\n/**\n * The delta rotation since the start of an event, in degrees, where clockwise\n * is positive and counter-clockwise is negative. The initial value is 0.0.\n * @type {number}\n */\nTouchEvent.prototype.rotation;\n\n/**\n * Initializes a newly created TouchEvent object.\n * @param {string} type\n * @param {boolean} canBubble\n * @param {boolean} cancelable\n * @param {Window} view\n * @param {number} detail\n * @param {number} screenX\n * @param {number} screenY\n * @param {number} clientX\n * @param {number} clientY\n * @param {boolean} ctrlKey\n * @param {boolean} altKey\n * @param {boolean} shiftKey\n * @param {boolean} metaKey\n * @param {TouchList} touches\n * @param {TouchList} targetTouches\n * @param {TouchList} changedTouches\n * @param {number} scale\n * @param {number} rotation\n * @return {undefined}\n */\nTouchEvent.prototype.initTouchEvent = function(type, canBubble, cancelable,\n    view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,\n    metaKey, touches, targetTouches, changedTouches, scale, rotation) {};\n\n/**\n * The GestureEvent class encapsulates information about a multi-touch gesture.\n *\n * GestureEvent objects are high-level events that encapsulate the low-level\n * TouchEvent objects. Both GestureEvent and TouchEvent events are sent during\n * a multi-touch sequence. Gesture events contain scaling and rotation\n * information allowing gestures to be combined, if supported by the platform.\n * If not supported, one gesture ends before another starts. Listen for\n * GestureEvent events if you want to respond to gestures only, not process\n * the low-level TouchEvent objects.\n *\n * @see http://developer.apple.com/library/safari/#documentation/UserExperience/Reference/GestureEventClassReference/GestureEvent/GestureEvent.html\n * @extends {UIEvent}\n * @constructor\n */\nfunction GestureEvent() {}\n\n/**\n * The distance between two fingers since the start of an event as a multiplier\n * of the initial distance. The initial value is 1.0. If less than 1.0, the\n * gesture is pinch close (to zoom out). If greater than 1.0, the gesture is\n * pinch open (to zoom in).\n * @type {number}\n */\nGestureEvent.prototype.scale;\n\n/**\n * The delta rotation since the start of an event, in degrees, where clockwise\n * is positive and counter-clockwise is negative. The initial value is 0.0.\n * @type {number}\n */\nGestureEvent.prototype.rotation;\n\n/**\n * The target of this gesture.\n * @type {EventTarget}\n */\nGestureEvent.prototype.target;\n\n/**\n * Initializes a newly created GestureEvent object.\n * @param {string} type\n * @param {boolean} canBubble\n * @param {boolean} cancelable\n * @param {Window} view\n * @param {number} detail\n * @param {number} screenX\n * @param {number} screenY\n * @param {number} clientX\n * @param {number} clientY\n * @param {boolean} ctrlKey\n * @param {boolean} altKey\n * @param {boolean} shiftKey\n * @param {boolean} metaKey\n * @param {EventTarget} target\n * @param {number} scale\n * @param {number} rotation\n * @return {undefined}\n */\nGestureEvent.prototype.initGestureEvent = function(type, canBubble, cancelable,\n    view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,\n    metaKey, target, scale, rotation) {};\n\n\n/**\n * Specifies the JavaScript method to invoke when a gesture is started by\n * two or more fingers touching the surface.\n * @type {?function(!GestureEvent)}\n */\nElement.prototype.ongesturestart;\n\n/**\n * Specifies the JavaScript method to invoke when fingers are moved during a\n * gesture.\n * @type {?function(!GestureEvent)}\n */\nElement.prototype.ongesturechange;\n\n/**\n * Specifies the JavaScript method to invoke when a gesture ends (when there are\n * 0 or 1 fingers touching the surface).\n * @type {?function(!GestureEvent)}\n */\nElement.prototype.ongestureend;\n\n/**\n * Specifies the JavaScript method to invoke when the browser device's\n * orientation changes, i.e.the device is rotated.\n * @type {?function(!Event)}\n * @see http://developer.apple.com/library/IOS/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n */\nWindow.prototype.onorientationchange;\n\n/**\n * Returns the orientation of the browser's device, one of [-90, 0, 90, 180].\n * @type {number}\n * @see http://developer.apple.com/library/IOS/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n */\nWindow.prototype.orientation;\n\n/**\n * @implicitCast\n * @type {boolean}\n */\nHTMLInputElement.prototype.autocorrect;\n\n/**\n * @implicitCast\n * @type {boolean}\n */\nHTMLInputElement.prototype.autocapitalize;\n\n/**\n * @implicitCast\n * @type {boolean}\n */\nHTMLTextAreaElement.prototype.autocorrect;\n\n/**\n * @implicitCast\n * @type {boolean}\n */\nHTMLTextAreaElement.prototype.autocapitalize;\n","externs/mediakeys.js":"/*\n * Copyright 2015 The Closure Compiler authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview MediaKey externs.\n * Based on {@link https://w3c.github.io/encrypted-media/ EME draft 5 December\n * 2019}.\n * @externs\n */\n\n\n/**\n * @typedef {{\n *   contentType: string,\n *   encryptionScheme: (?string|undefined),\n *   robustness: (string|undefined)\n * }}\n * @see https://w3c.github.io/encrypted-media/#mediakeysystemmediacapability-dictionary\n */\nvar MediaKeySystemMediaCapability;\n\n\n/** @typedef {{\n *   label: (string|undefined),\n *   initDataTypes: (!Array|undefined),\n *   audioCapabilities: (!Array|undefined),\n *   videoCapabilities: (!Array|undefined),\n *   distinctiveIdentifier: (string|undefined),\n *   persistentState: (string|undefined),\n *   sessionTypes: (!Array|undefined)\n * }}\n * @see https://w3c.github.io/encrypted-media/#mediakeysystemconfiguration-dictionary\n */\nvar MediaKeySystemConfiguration;\n\n\n/**\n * @param {string} keySystem\n * @param {!Array} supportedConfigurations\n * @return {!Promise}\n * @see https://w3c.github.io/encrypted-media/#navigator-extension-requestmediakeysystemaccess\n */\nNavigator.prototype.requestMediaKeySystemAccess =\n    function(keySystem, supportedConfigurations) {};\n\n\n/** @const {MediaKeys} */\nHTMLMediaElement.prototype.mediaKeys;\n\n\n/**\n * @param {MediaKeys} mediaKeys\n * @return {!Promise}\n * @see https://w3c.github.io/encrypted-media/#dom-htmlmediaelement-setmediakeys\n */\nHTMLMediaElement.prototype.setMediaKeys = function(mediaKeys) {};\n\n\n\n/**\n * @interface\n * @see https://w3c.github.io/encrypted-media/#mediakeysystemaccess-interface\n */\nfunction MediaKeySystemAccess() {}\n\n\n/** @return {!Promise} */\nMediaKeySystemAccess.prototype.createMediaKeys = function() {};\n\n\n/** @return {!MediaKeySystemConfiguration} */\nMediaKeySystemAccess.prototype.getConfiguration = function() {};\n\n\n/** @const {string} */\nMediaKeySystemAccess.prototype.keySystem;\n\n\n\n/**\n * @interface\n * @see https://w3c.github.io/encrypted-media/#mediakeys-interface\n */\nfunction MediaKeys() {}\n\n\n/**\n * @param {string=} opt_sessionType defaults to \"temporary\"\n * @return {!MediaKeySession}\n * @throws {TypeError} if opt_sessionType is invalid.\n */\nMediaKeys.prototype.createSession = function(opt_sessionType) {};\n\n\n/**\n * @param {!BufferSource} serverCertificate\n * @return {!Promise}\n */\nMediaKeys.prototype.setServerCertificate = function(serverCertificate) {};\n\n\n\n/**\n * @interface\n * @see https://w3c.github.io/encrypted-media/#mediakeystatusmap-interface\n */\nfunction MediaKeyStatusMap() {}\n\n\n/** @const {number} */\nMediaKeyStatusMap.prototype.size;\n\n\n/**\n * Array entry 0 is the key, 1 is the value.\n * @return {!Iterator>}\n */\nMediaKeyStatusMap.prototype.entries = function() {};\n\n\n/**\n * The function is called with each value.\n * @param {function(string, !BufferSource)} callback A callback function to run for\n *     each media key. The first parameter is the key status; the second\n *     parameter is the key ID.\n * @return {undefined}\n */\nMediaKeyStatusMap.prototype.forEach = function(callback) {};\n\n\n/**\n * @param {!BufferSource} keyId\n * @return {string|undefined}\n */\nMediaKeyStatusMap.prototype.get = function(keyId) {};\n\n\n/**\n * @param {!BufferSource} keyId\n * @return {boolean}\n */\nMediaKeyStatusMap.prototype.has = function(keyId) {};\n\n\n/**\n * @return {!Iterator}\n */\nMediaKeyStatusMap.prototype.keys = function() {};\n\n\n/**\n * @return {!Iterator}\n */\nMediaKeyStatusMap.prototype.values = function() {};\n\n\n\n/**\n * @interface\n * @extends {EventTarget}\n * @see https://w3c.github.io/encrypted-media/#mediakeysession-interface\n */\nfunction MediaKeySession() {}\n\n\n/** @const {string} */\nMediaKeySession.prototype.sessionId;\n\n\n/** @const {number} */\nMediaKeySession.prototype.expiration;\n\n\n/** @const {!Promise} */\nMediaKeySession.prototype.closed;\n\n\n/** @const {!MediaKeyStatusMap} */\nMediaKeySession.prototype.keyStatuses;\n\n\n/**\n * @param {string} initDataType\n * @param {!BufferSource} initData\n * @return {!Promise}\n */\nMediaKeySession.prototype.generateRequest = function(initDataType, initData) {};\n\n\n/**\n * @param {string} sessionId\n * @return {!Promise}}\n */\nMediaKeySession.prototype.load = function(sessionId) {};\n\n\n/**\n * @param {!BufferSource} response\n * @return {!Promise}\n */\nMediaKeySession.prototype.update = function(response) {};\n\n\n/** @return {!Promise} */\nMediaKeySession.prototype.close = function() {};\n\n\n/** @return {!Promise} */\nMediaKeySession.prototype.remove = function() {};\n\n\n/** @override */\nMediaKeySession.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n\n/** @override */\nMediaKeySession.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n\n/** @override */\nMediaKeySession.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://w3c.github.io/encrypted-media/#dom-mediakeymessageeventinit\n */\nfunction MediaKeyMessageEventInit() {};\n\n/** @type {string} */\nMediaKeyMessageEventInit.prototype.messageType;\n\n/** @type {!ArrayBuffer} */\nMediaKeyMessageEventInit.prototype.message;\n\n\n/**\n * @constructor\n * @param {string} type\n * @param {MediaKeyMessageEventInit} eventInitDict\n * @extends {Event}\n * @see https://w3c.github.io/encrypted-media/#mediakeymessageevent\n */\nfunction MediaKeyMessageEvent(type, eventInitDict) {}\n\n\n/** @const {string} */\nMediaKeyMessageEvent.prototype.messageType;\n\n\n/** @const {!ArrayBuffer} */\nMediaKeyMessageEvent.prototype.message;\n\n\n/** @const {!MediaKeySession} */\nMediaKeyMessageEvent.prototype.target;\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://w3c.github.io/encrypted-media/#dom-mediaencryptedeventinit\n */\nfunction MediaEncryptedEventInit() {};\n\n/** @type {(string | undefined)} */\nMediaEncryptedEventInit.prototype.initDataType;\n\n/** @type {(ArrayBuffer | undefined)} */\nMediaEncryptedEventInit.prototype.initData;\n\n/**\n * @constructor\n * @param {string} type\n * @param {MediaEncryptedEventInit=} opt_eventInitDict\n * @extends {Event}\n * @see https://w3c.github.io/encrypted-media/#mediaencryptedevent\n */\nfunction MediaEncryptedEvent(type, opt_eventInitDict) {}\n\n\n/** @const {string} */\nMediaEncryptedEvent.prototype.initDataType;\n\n\n/** @const {ArrayBuffer} */\nMediaEncryptedEvent.prototype.initData;\n\n\n/** @const {!HTMLMediaElement} */\nMediaEncryptedEvent.prototype.target;\n\n","externs/w3c_mediacapabilities.js":"/*\n * Copyright 2019 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview MediaCapabilities externs.\n * Based on {@link https://w3c.github.io/media-capabilities/ MC draft 6 November\n * 2019}.\n * @externs\n */\n\n/**\n * @typedef {string}\n * @see https://w3c.github.io/media-capabilities/#enumdef-hdrmetadatatype\n */\nvar HdrMetadataType;\n\n/**\n * @typedef {string}\n * @see https://w3c.github.io/media-capabilities/#enumdef-colorgamut\n */\nvar ColorGamut;\n\n/**\n * @typedef {string}\n * @see https://w3c.github.io/media-capabilities/#enumdef-transferfunction\n */\nvar TransferFunction;\n\n/**\n * @typedef {string}\n * @see https://w3c.github.io/media-capabilities/#enumdef-mediadecodingtype\n */\nvar MediaDecodingType;\n\n/**\n * @typedef {string}\n * @see https://w3c.github.io/media-capabilities/#enumdef-mediaencodingtype\n */\nvar MediaEncodingType;\n\n/**\n * @typedef {{\n *   contentType: string,\n *   width: number,\n *   height: number,\n *   bitrate: number,\n *   framerate: number,\n *   hasAlphaChannel: (boolean|undefined),\n *   hdrMetadataType: (!HdrMetadataType|undefined),\n *   colorGamut: (!ColorGamut|undefined),\n *   transferFunction: (!TransferFunction|undefined)\n * }}\n * @see https://w3c.github.io/media-capabilities/#dictdef-videoconfiguration\n */\nvar VideoConfiguration;\n\n// NOTE: channels definition below is not yet stable in the spec as of Dec 2019.\n// \"The channels needs to be defined as a double (2.1, 4.1, 5.1, ...), an\n// unsigned short (number of channels) or as an enum value. The current\n// definition is a placeholder.\"\n/**\n * @typedef {{\n *   contentType: string,\n *   channels: (*|undefined),\n *   bitrate: (number|undefined),\n *   samplerate: (number|undefined),\n *   spatialRendering: (boolean|undefined)\n * }}\n * @see https://w3c.github.io/media-capabilities/#dictdef-audioconfiguration\n */\nvar AudioConfiguration;\n\n// NOTE: encryptionScheme is not yet in the MC spec as of Dec 2019, but has\n// already landed in EME and should be in MC soon.\n// https://github.com/w3c/media-capabilities/issues/100\n/**\n * @typedef {{\n *   robustness: (string|undefined),\n *   encryptionScheme: (string|undefined)\n * }}\n * @see https://w3c.github.io/media-capabilities/#dictdef-keysystemtrackconfiguration\n */\nvar KeySystemTrackConfiguration;\n\n/**\n * @typedef {{\n *   keySystem: string,\n *   initDataType: (string|undefined),\n *   distinctiveIdentifier: (string|undefined),\n *   persistentState: (string|undefined),\n *   sessionTypes: (!Array|undefined),\n *   audio: (!KeySystemTrackConfiguration|undefined),\n *   video: (!KeySystemTrackConfiguration|undefined)\n * }}\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediacapabilitieskeysystemconfiguration\n */\nvar MediaCapabilitiesKeySystemConfiguration;\n\n/**\n * @record\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediaconfiguration\n */\nfunction MediaConfiguration() {}\n\n/** @type {!VideoConfiguration|undefined} */\nMediaConfiguration.prototype.video;\n\n/** @type {!AudioConfiguration|undefined} */\nMediaConfiguration.prototype.audio;\n\n/**\n * @record\n * @extends {MediaConfiguration}\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediadecodingconfiguration\n */\nfunction MediaDecodingConfiguration() {}\n\n/** @type {!MediaDecodingType} */\nMediaDecodingConfiguration.prototype.type;\n\n/** @type {!MediaCapabilitiesKeySystemConfiguration|undefined} */\nMediaDecodingConfiguration.prototype.keySystemConfiguration;\n\n/**\n * @record\n * @extends {MediaConfiguration}\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediaencodingconfiguration\n */\nfunction MediaEncodingConfiguration() {}\n\n/** @type {!MediaEncodingType} */\nMediaEncodingConfiguration.prototype.type;\n\n/**\n * @record\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediacapabilitiesinfo\n */\nfunction MediaCapabilitiesInfo() {}\n\n/** @type {boolean} */\nMediaCapabilitiesInfo.prototype.supported;\n\n/** @type {boolean} */\nMediaCapabilitiesInfo.prototype.smooth;\n\n/** @type {boolean} */\nMediaCapabilitiesInfo.prototype.powerEfficient;\n\n/**\n * @record\n * @extends {MediaCapabilitiesInfo}\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediacapabilitiesdecodinginfo\n */\nfunction MediaCapabilitiesDecodingInfo() {}\n\n/** @type {?MediaKeySystemAccess} */\nMediaCapabilitiesDecodingInfo.prototype.keySystemAccess;\n\n/** @type {!MediaDecodingConfiguration} */\nMediaCapabilitiesDecodingInfo.prototype.configuration;\n\n/**\n * @record\n * @extends {MediaCapabilitiesInfo}\n * @see https://w3c.github.io/media-capabilities/#dictdef-mediacapabilitiesencodinginfo\n */\nfunction MediaCapabilitiesEncodingInfo() {}\n\n/** @type {!MediaEncodingConfiguration} */\nMediaCapabilitiesEncodingInfo.prototype.configuration;\n\n/**\n * @interface\n * @see https://w3c.github.io/media-capabilities/#mediacapabilities\n */\nfunction MediaCapabilities() {}\n\n/**\n * @param {!MediaDecodingConfiguration} configuration\n * @return {!Promise}\n */\nMediaCapabilities.prototype.decodingInfo = function(configuration) {};\n\n/**\n * @param {!MediaEncodingConfiguration} configuration\n * @return {!Promise}\n */\nMediaCapabilities.prototype.encodingInfo = function(configuration) {};\n\n/** @const {?MediaCapabilities} */\nNavigator.prototype.mediaCapabilities;\n\n/** @const {?MediaCapabilities} */\nWorkerNavigator.prototype.mediaCapabilities;\n","externs/mediasource.js":"/*\n * Copyright 2012 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for the Media Source Extensions. Note that the\n * properties available here are the union of several versions of the spec.\n * @see http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html\n *\n * @externs\n * @author [email protected] (Matt Ward)\n */\n\n/**\n * @constructor\n * @implements {EventTarget}\n */\nfunction MediaSource() {}\n\n/** @override */\nMediaSource.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/** @override */\nMediaSource.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nMediaSource.prototype.dispatchEvent = function(evt) {};\n\n/** @type {Array} */\nMediaSource.prototype.sourceBuffers;\n\n/** @type {Array} */\nMediaSource.prototype.activeSourceBuffers;\n\n/** @type {number} */\nMediaSource.prototype.duration;\n\n/**\n * @param {string} type\n * @return {SourceBuffer}\n */\nMediaSource.prototype.addSourceBuffer = function(type) {};\n\n/**\n * @param {SourceBuffer} sourceBuffer\n * @return {undefined}\n */\nMediaSource.prototype.removeSourceBuffer = function(sourceBuffer) {};\n\n/**\n * Updates the live seekable range.\n * @param {number} start\n * @param {number} end\n */\nMediaSource.prototype.setLiveSeekableRange = function(start, end) {};\n\n/**\n * Clears the live seekable range.\n * @return {void}\n */\nMediaSource.prototype.clearLiveSeekableRange = function() {};\n\n/** @type {string} */\nMediaSource.prototype.readyState;\n\n/**\n * @param {string=} opt_error\n * @return {undefined}\n */\nMediaSource.prototype.endOfStream = function(opt_error) {};\n\n/**\n * @param {string} type\n * @return {boolean}\n */\nMediaSource.isTypeSupported = function(type) {};\n\n\n/**\n * @constructor\n * @implements {EventTarget}\n */\nfunction SourceBuffer() {}\n\n/** @override */\nSourceBuffer.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nSourceBuffer.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nSourceBuffer.prototype.dispatchEvent = function(evt) {};\n\n/** @type {string} */\nSourceBuffer.prototype.appendMode;\n\n/** @type {boolean} */\nSourceBuffer.prototype.updating;\n\n/** @type {TimeRanges} */\nSourceBuffer.prototype.buffered;\n\n/** @type {number} */\nSourceBuffer.prototype.timestampOffset;\n\n/** @type {number} */\nSourceBuffer.prototype.appendWindowStart;\n\n/** @type {number} */\nSourceBuffer.prototype.appendWindowEnd;\n\n/**\n * @param {Uint8Array} data\n * @return {undefined}\n */\nSourceBuffer.prototype.append = function(data) {};\n\n/**\n * @param {ArrayBuffer|ArrayBufferView} data\n * @return {undefined}\n */\nSourceBuffer.prototype.appendBuffer = function(data) {};\n\n/**\n * Abort the current segment append sequence.\n * @return {undefined}\n */\nSourceBuffer.prototype.abort = function() {};\n\n/**\n * @param {number} start\n * @param {number} end\n * @return {undefined}\n */\nSourceBuffer.prototype.remove = function(start, end) {};\n\n/**\n * @param {string} type\n * @return {undefined}\n */\nSourceBuffer.prototype.changeType = function(type) {};\n","externs/page_visibility.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Externs for Page Visibility.\n *\n * @see http://www.w3.org/TR/page-visibility\n * @externs\n */\n\n/**\n * Set of possible values: 'hidden', 'visible', 'prerender', 'unloaded'.\n * @typedef {string}\n * @see http://www.w3.org/TR/page-visibility/#VisibilityState\n */\nvar VisibilityState;\n","externs/url.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for URL and URLSearchParams from the spec at\n * https://url.spec.whatwg.org.\n *\n * @externs\n * @author [email protected] (Devlin Cronin)\n */\n\n/**\n * @typedef {Array}\n */\nvar URLSearchParamsTupleType;\n\n/**\n * Represents the query string of a URL.\n *\n * * When `init` is a string, it is basically parsed as a query string\n *   `'name1=value1&name2=value2'`.\n *\n * * When `init` is an array of arrays of string\n *   `([['name1', 'value1'], ['name2', 'value2']])`,\n *   it must contain pairs of strings, where the first item in the pair will be\n *   interpreted as a key and the second as a value.\n *\n *   NOTE: The specification uses Iterable rather than Array, but this is not\n *   supported in Edge 17 - 18.\n *\n * * When `init` is an object, keys and values will be interpreted as such\n *   `({name1: 'value1', name2: 'value2'}).\n *\n * @see https://url.spec.whatwg.org/#interface-urlsearchparams\n * @constructor\n * @implements {Iterable>}\n * @param {(string|!Array|!Object)=}\n *     init\n */\nfunction URLSearchParams(init) {}\n\n/**\n * @param {string} name\n * @param {string} value\n * @return {undefined}\n */\nURLSearchParams.prototype.append = function(name, value) {};\n\n/**\n * @param {string} name\n * @return {undefined}\n */\nURLSearchParams.prototype.delete = function(name) {};\n\n/**\n * @return {!IteratorIterable>}\n * @nosideeffects\n * @see https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/entries\n */\nURLSearchParams.prototype.entries = function() {};\n\n/**\n * @param {string} name\n * @return {?string}\n */\nURLSearchParams.prototype.get = function(name) {};\n\n/**\n * @param {string} name\n * @return {!Array}\n */\nURLSearchParams.prototype.getAll = function(name) {};\n\n/**\n * @param {string} name\n * @return {boolean}\n */\nURLSearchParams.prototype.has = function(name) {};\n\n/**\n * @param {string} name\n * @param {string} value\n * @return {undefined}\n */\nURLSearchParams.prototype.set = function(name, value) {};\n\n/**\n * @return {undefined}\n */\nURLSearchParams.prototype.sort = function() {};\n\n/**\n * @see https://url.spec.whatwg.org\n * @constructor\n * @param {string} url\n * @param {(string|!URL)=} base\n */\nfunction URL(url, base) {}\n\n/** @type {string} */\nURL.prototype.href;\n\n/**\n * @const {string}\n */\nURL.prototype.origin;\n\n/** @type {string} */\nURL.prototype.protocol;\n\n/** @type {string} */\nURL.prototype.username;\n\n/** @type {string} */\nURL.prototype.password;\n\n/** @type {string} */\nURL.prototype.host;\n\n/** @type {string} */\nURL.prototype.hostname;\n\n/** @type {string} */\nURL.prototype.port;\n\n/** @type {string} */\nURL.prototype.pathname;\n\n/** @type {string} */\nURL.prototype.search;\n\n/**\n * @const {!URLSearchParams}\n */\nURL.prototype.searchParams;\n\n/** @type {string} */\nURL.prototype.hash;\n\n/**\n * @param {string} domain\n * @return {string}\n */\nURL.domainToASCII = function(domain) {};\n\n/**\n * @param {string} domain\n * @return {string}\n */\nURL.domainToUnicode = function(domain) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-createObjectURL\n * @param {!File|!Blob|!MediaSource|!MediaStream} obj\n * @return {string}\n */\nURL.createObjectURL = function(obj) {};\n\n/**\n * @see http://www.w3.org/TR/FileAPI/#dfn-revokeObjectURL\n * @param {string} url\n * @return {undefined}\n */\nURL.revokeObjectURL = function(url) {};\n","externs/v8.js":"/*\n * Copyright 2013 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview This file describes the externs API for V8-specific objects.\n * @externs\n */\n\n\n\n/**\n * Stack frame elements in V8.\n * @constructor\n */\nfunction CallSite() {}\n\n\n/**\n * Runs the garbage collector, provided that you start V8 with --expose-gc or\n * Chrome with --js-flags=\"--expose-gc\".\n * See https://v8.dev/docs/memory-leaks\n * @type {undefined|function()}\n */\nCallSite.prototype.gc;\n\n\n/**\n * Returns the value of this.\n * @return {Object|undefined}\n */\nCallSite.prototype.getThis = function() {};\n\n\n/**\n * Returns the type of this as a string. This is the name of the function stored\n * in the constructor field of this, if available, otherwise the object's\n * [[Class]] internal property.\n * @return {string|undefined}\n */\nCallSite.prototype.getTypeName = function() {};\n\n\n/**\n * Returns the current function.\n * @return {!Function|undefined}\n */\nCallSite.prototype.getFunction = function() {};\n\n\n/**\n * Returns the name of the current function, typically its name property. If a\n * name property is not available an attempt will be made to try to infer a name\n * from the function's context.\n * @return {string|undefined}\n */\nCallSite.prototype.getFunctionName = function() {};\n\n\n/**\n * Returns the name of the property of this or one of its prototypes that holds\n * the current function.\n * @return {string|undefined}\n */\nCallSite.prototype.getMethodName = function() {};\n\n\n/**\n * If this function was defined in a script returns the name of the script\n * @return {string|undefined}\n */\nCallSite.prototype.getFileName = function() {};\n\n\n/**\n * If this function was defined in a script returns the current line number.\n * @return {number|undefined}\n */\nCallSite.prototype.getLineNumber = function() {};\n\n\n/**\n * If this function was defined in a script returns the current column number.\n * @return {number|undefined}\n */\nCallSite.prototype.getColumnNumber = function() {};\n\n\n/**\n * If this function was created using a call to eval, returns a CallSite object\n * representing the location where eval was called\n * @return {CallSite|undefined}\n */\nCallSite.prototype.getEvalOrigin = function() {};\n\n\n/**\n * Is this a toplevel invocation, that is, is this the global object?\n * @return {boolean}\n */\nCallSite.prototype.isToplevel = function() {};\n\n\n/**\n * Does this call take place in code defined by a call to eval?\n * @return {boolean}\n */\nCallSite.prototype.isEval = function() {};\n\n\n/**\n * Is this call in native V8 code?\n * @return {boolean}\n */\nCallSite.prototype.isNative = function() {};\n\n\n/**\n * Is this a constructor call?\n * @return {boolean}\n */\nCallSite.prototype.isConstructor = function() {};\n","externs/w3c_abort.js":"/*\n * Copyright 2018 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for AbortController\n * @see https://dom.spec.whatwg.org/#aborting-ongoing-activities\n * @externs\n */\n\n\n\n/**\n * @record\n * @extends {EventTarget}\n * @see https://dom.spec.whatwg.org/#interface-AbortSignal\n */\nfunction AbortSignal() {}\n\n/** @type {boolean} */\nAbortSignal.prototype.aborted;\n\n/** @type {?function(!Event)} */\nAbortSignal.prototype.onabort;\n\n\n\n/**\n * @constructor\n * @see https://dom.spec.whatwg.org/#interface-abortcontroller\n */\nfunction AbortController() {}\n\n/** @const {!AbortSignal} */\nAbortController.prototype.signal;\n\n/** @return {void} */\nAbortController.prototype.abort = function() {};\n","externs/w3c_anim_timing.js":"/*\n * Copyright 2011 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for timing control for script base animations. The\n *  whole file has been fully type annotated.\n *\n * @see http://www.w3.org/TR/animation-timing/\n * @see http://webstuff.nfshost.com/anim-timing/Overview.html\n * @externs\n * @author [email protected] (Brian Cornell)\n */\n\n/**\n * @typedef {function(number): undefined}\n * @see https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#framerequestcallback\n */\nvar FrameRequestCallback;\n\n/**\n * @param {!FrameRequestCallback} callback\n * @param {Element=} opt_element In early versions of this API, the callback\n *     was invoked only if the element was visible.\n * @return {number}\n */\nfunction requestAnimationFrame(callback, opt_element) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction cancelRequestAnimationFrame(handle) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction cancelAnimationFrame(handle) {};\n","externs/nonstandard_anim_timing.js":"/*\n * Copyright 2011 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Nonstandard definitions for timing control for script base animations.\n *\n * @externs\n */\n\n/**\n * @param {!FrameRequestCallback} callback\n * @param {Element=} opt_element\n * @return {number}\n */\nfunction webkitRequestAnimationFrame(callback, opt_element) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction webkitCancelRequestAnimationFrame(handle) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction webkitCancelAnimationFrame(handle) {};\n\n/**\n * @param {?FrameRequestCallback} callback It's legitimate to pass a null\n *     callback and listen on the MozBeforePaint event instead.\n * @param {Element=} opt_element\n * @return {number}\n */\nfunction mozRequestAnimationFrame(callback, opt_element) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction mozCancelRequestAnimationFrame(handle) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction mozCancelAnimationFrame(handle) {};\n\n/**\n * @param {!FrameRequestCallback} callback\n * @param {Element=} opt_element\n * @return {number}\n */\nfunction msRequestAnimationFrame(callback, opt_element) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction msCancelRequestAnimationFrame(handle) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction msCancelAnimationFrame(handle) {};\n\n/**\n * @param {!FrameRequestCallback} callback\n * @param {Element=} opt_element\n * @return {number}\n */\nfunction oRequestAnimationFrame(callback, opt_element) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction oCancelRequestAnimationFrame(handle) {};\n\n/**\n * @param {number} handle\n * @return {undefined}\n */\nfunction oCancelAnimationFrame(handle) {};\n","externs/nonstandard_audio.js":"/*\n * Copyright 2012 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Nonstandard definitions for the API related to audio.\n *\n * @externs\n */\n\n/**\n * Definitions for the Web Audio API with webkit prefix.\n */\n\n/**\n * @constructor\n * @extends {AudioContext}\n */\nfunction webkitAudioContext() {}\n\n/**\n * @param {number} numberOfChannels\n * @param {number} length\n * @param {number} sampleRate\n * @constructor\n * @extends {OfflineAudioContext}\n */\nfunction webkitOfflineAudioContext(numberOfChannels, length, sampleRate) {}\n\n/**\n * @constructor\n * @extends {AudioPannerNode}\n */\nfunction webkitAudioPannerNode() {}\n\n/**\n * @constructor\n * @extends {PannerNode}\n */\nfunction webkitPannerNode() {}\n\n/**\n * Definitions for the Audio API as implemented in Firefox.\n *   Please note that this document describes a non-standard experimental API.\n *   This API is considered deprecated.\n * @see https://developer.mozilla.org/en/DOM/HTMLAudioElement\n */\n\n/**\n * @param {string=} src\n * @constructor\n * @extends {HTMLAudioElement}\n */\nfunction Audio(src) {}\n\n/**\n * @param {number} channels\n * @param {number} rate\n */\nAudio.prototype.mozSetup = function(channels, rate) {};\n\n/**\n * @param {Array|Float32Array} buffer\n */\nAudio.prototype.mozWriteAudio = function(buffer) {};\n\n/**\n * @return {number}\n */\nAudio.prototype.mozCurrentSampleOffset = function() {};\n","externs/w3c_batterystatus.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Battery Status API.\n *  The whole file has been fully type annotated. Created from\n *  https://www.w3.org/TR/battery-status/\n *\n * @externs\n */\n\n\n\n/**\n * @interface\n * @extends {EventTarget}\n */\nfunction BatteryManager() {}\n\n\n/**\n * @type {boolean}\n */\nBatteryManager.prototype.charging;\n\n\n/**\n * @type {number}\n */\nBatteryManager.prototype.chargingTime;\n\n\n/**\n * @type {number}\n */\nBatteryManager.prototype.dischargingTime;\n\n\n/**\n * @type {number}\n */\nBatteryManager.prototype.level;\n\n\n/**\n * @type {?function(!Event): void}\n */\nBatteryManager.prototype.onchargingchange;\n\n\n/**\n * @type {?function(!Event): void}\n */\nBatteryManager.prototype.onchargingtimechange;\n\n\n/**\n * @type {?function(!Event): void}\n */\nBatteryManager.prototype.ondischargingtimechange;\n\n\n/**\n * @type {?function(!Event): void}\n */\nBatteryManager.prototype.onlevelchange;\n\n/**\n * @return {!Promise}\n * @see http://www.w3.org/TR/battery-status/\n */\nNavigator.prototype.getBattery = function() {};\n","externs/w3c_clipboardevent.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's ClipboardEvent API.\n * @see http://www.w3.org/TR/clipboard-apis/\n *\n * @externs\n * @author [email protected] (James Hawkins)\n */\n\n\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/clipboard-apis/#dfn-eventinit\n */\nfunction ClipboardEventInit() {}\n\n/** @type {?DataTransfer|undefined} */\nClipboardEventInit.prototype.clipboardData;\n\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {ClipboardEventInit=} opt_eventInitDict\n */\nfunction ClipboardEvent(type, opt_eventInitDict) {}\n\n\n/** @const {?DataTransfer} */\nClipboardEvent.prototype.clipboardData;\n","externs/w3c_composition_event.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Composition Events specification.\n * @externs\n */\n\n/**\n * The `CompositionEvent` interface provides specific contextual information\n * associated with Composition Events.\n * @see https://www.w3.org/TR/uievents/#interface-compositionevent\n * @record\n * @extends {UIEventInit}\n */\nfunction CompositionEventInit() {}\n\n/**\n * `data` holds the value of the characters generated by an input method. This\n * MAY be a single Unicode character or a non-empty sequence of Unicode\n * characters. This attribute MAY be the empty string. The un-initialized value\n * of this attribute MUST be \"\" (the empty string).\n * @type {string}\n */\nCompositionEventInit.prototype.data;\n\n/**\n * Composition Events provide a means for inputing text in a supplementary or\n * alternate manner than by Keyboard Events, in order to allow the use of\n * characters that might not be commonly available on keyboard. For example,\n * Composition Events might be used to add accents to characters despite their\n * absence from standard US keyboards, to build up logograms of many Asian\n * languages from their base components or categories, to select word choices\n * from a combination of key presses on a mobile device keyboard, or to convert\n * voice commands into text using a speech recognition processor.\n *\n * Conceptually, a composition session consists of one `compositionstart` event,\n * one or more `compositionupdate` events, and one `compositionend` event, with\n * the value of the data attribute persisting between each stage of this event\n * chain during each session.\n *\n * Not all IME systems or devices expose the necessary data to the DOM, so the\n * active composition string (the \"Reading Window\" or \"candidate selection\" menu\n * option) might not be available through this interface, in which case the\n * selection MAY be represented by the empty string.\n *\n * @see https://www.w3.org/TR/uievents/#events-compositionevents\n * @param {string} type\n * @param {!CompositionEventInit=} opt_eventInitDict\n * @extends {UIEvent}\n * @constructor\n */\nfunction CompositionEvent(type, opt_eventInitDict) {}\n\n/**\n * Initializes attributes of a `CompositionEvent` object. This method has the\n * same behavior as `UIEvent.initUIEvent()`. The value of `detail` remains\n * undefined.\n *\n * @see https://www.w3.org/TR/uievents/#idl-interface-CompositionEvent-initializers\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {?Window} viewArg\n * @param {string} dataArg\n * @param {string} localeArg\n * @return {undefined}\n */\nCompositionEvent.prototype.initCompositionEvent = function(\n    typeArg, canBubbleArg, cancelableArg, viewArg, dataArg, localeArg) {};\n\n/**\n * @type {string}\n */\nCompositionEvent.prototype.data;\n\n/**\n * @type {string}\n */\nCompositionEvent.prototype.locale;\n","externs/w3c_css3d.js":"/*\n * Copyright 2010 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's CSS 3D Transforms specification.\n *  The whole file has been fully type annotated. Created from\n *  https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html\n *\n * @externs\n * @author [email protected] (Ryan Fioravanti)\n */\n\n/**\n * @constructor\n * @param {string=} opt_matrix\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#the-cssmatrix-interface\n */\nfunction CSSMatrix(opt_matrix) {}\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m11;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m12;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m13;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m14;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m21;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m22;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m23;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m24;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m31;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m32;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m33;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m34;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m41;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m42;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m43;\n\n/**\n * @type {number}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#three-dimensional-attributes\n */\nCSSMatrix.prototype.m44;\n\n/**\n * @param {string} string\n * @return {void}\n */\nCSSMatrix.prototype.setMatrixValue = function(string) {};\n\n/**\n * @param {!CSSMatrix} secondMatrix\n * @return {!CSSMatrix}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#widl-CSSMatrix-multiply-CSSMatrix-CSSMatrix-other\n */\nCSSMatrix.prototype.multiply = function(secondMatrix) {};\n\n/**\n * @return {CSSMatrix} Returns void if the matrix is non-invertable.\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#widl-CSSMatrix-inverse-CSSMatrix\n */\nCSSMatrix.prototype.inverse = function() {};\n\n/**\n * @param {number=} opt_x Defaults to 0.\n * @param {number=} opt_y Defaults to 0.\n * @param {number=} opt_z Defaults to 0.\n * @return {!CSSMatrix}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#widl-CSSMatrix-translate-CSSMatrix-unrestricted-double-tx-unrestricted-double-ty-unrestricted-double-tz\n */\nCSSMatrix.prototype.translate = function(opt_x, opt_y, opt_z) {};\n\n/**\n * @param {number=} opt_scaleX Defaults to 1.\n * @param {number=} opt_scaleY Defaults to scaleX.\n * @param {number=} opt_scaleZ Defaults to 1.\n * @return {!CSSMatrix}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#widl-CSSMatrix-scale-CSSMatrix-unrestricted-double-scale-unrestricted-double-originX-unrestricted-double-originY\n */\nCSSMatrix.prototype.scale = function(opt_scaleX, opt_scaleY, opt_scaleZ) {};\n\n/**\n * @param {number=} opt_rotX Defaults to 0.\n * @param {number=} opt_rotY Defaults to 0.\n * @param {number=} opt_rotZ Defaults to rotX if rotY is not defined, else 0.\n * @return {!CSSMatrix}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#widl-CSSMatrix-rotate-CSSMatrix-unrestricted-double-angle-unrestricted-double-originX-unrestricted-double-originY\n */\nCSSMatrix.prototype.rotate = function(opt_rotX, opt_rotY, opt_rotZ) {};\n\n/**\n * @param {number=} opt_x Defaults to 0.\n * @param {number=} opt_y Defaults to 0.\n * @param {number=} opt_z Defaults to 0.\n * @param {number=} opt_angle Defaults to 0.\n * @return {!CSSMatrix}\n * @see https://dvcs.w3.org/hg/FXTF/raw-file/tip/matrix/index.html#widl-CSSMatrix-rotateAxisAngle-CSSMatrix-unrestricted-double-x-unrestricted-double-y-unrestricted-double-z-unrestricted-double-angle\n */\nCSSMatrix.prototype.rotateAxisAngle =\n    function(opt_x, opt_y, opt_z, opt_angle) {};\n\n/**\n * @constructor\n * @param {string=} opt_matrix\n * @extends {CSSMatrix}\n * @see http://developer.apple.com/safari/library/documentation/AudioVideo/Reference/WebKitCSSMatrixClassReference/WebKitCSSMatrix/WebKitCSSMatrix.html#//apple_ref/javascript/instm/WebKitCSSMatrix/setMatrixValue\n */\nfunction WebKitCSSMatrix(opt_matrix) {}\n\n/**\n * @constructor\n * @param {string=} opt_matrix\n * @extends {CSSMatrix}\n * @see http://msdn.microsoft.com/en-us/library/windows/apps/hh453593.aspx\n */\nfunction MSCSSMatrix(opt_matrix) {}\n","externs/w3c_elementtraversal.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for DOM Element Traversal interface.\n *  This file depends on w3c_dom1.js.\n *  The whole file has been fully type annotated.\n *  Created from:\n *    http://www.w3.org/TR/ElementTraversal/#ecmascript-bindings\n *\n * @externs\n * @author [email protected] (Erik Arvidsson)\n */\n\n/**\n * @typedef {?(Document|DocumentFragment|Element)}\n * @see https://dom.spec.whatwg.org/#parentnode\n */\nvar ParentNode;\n\n/**\n * @typedef {?(Element|CharacterData)}\n * @see https://dom.spec.whatwg.org/#nondocumenttypechildnode\n */\nvar NonDocumentTypeChildNode;\n\n/**\n * @type {Element}\n * @see https://developer.mozilla.org/En/DOM/Element.firstElementChild\n */\nElement.prototype.firstElementChild;\n\n/**\n * @type {Element}\n * @see https://developer.mozilla.org/En/DOM/Element.lastElementChild\n */\nElement.prototype.lastElementChild;\n\n/**\n * @type {Element}\n * @see https://developer.mozilla.org/En/DOM/Element.previousElementSibling\n */\nElement.prototype.previousElementSibling;\n\n/**\n * @type {Element}\n * @see https://developer.mozilla.org/En/DOM/Element.nextElementSibling\n */\nElement.prototype.nextElementSibling;\n\n/**\n * @type {number}\n * @see https://developer.mozilla.org/En/DOM/Element.childElementCount\n */\nElement.prototype.childElementCount;\n\n/**\n * @type {?Element}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-firstelementchild\n */\nDocument.prototype.firstElementChild;\n\n/**\n * @type {?Element}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-lastelementchild\n */\nDocument.prototype.lastElementChild;\n\n/**\n * @type {number}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-childelementcount\n */\nDocument.prototype.childElementCount;\n\n/**\n * @type {?Element}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-firstelementchild\n */\nDocumentFragment.prototype.firstElementChild;\n\n/**\n * @type {?Element}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-lastelementchild\n */\nDocumentFragment.prototype.lastElementChild;\n\n/**\n * @type {number}\n * @see https://dom.spec.whatwg.org/#dom-parentnode-childelementcount\n */\nDocumentFragment.prototype.childElementCount;\n\n/**\n * @type {?Element}\n * @see https://dom.spec.whatwg.org/#dom-nondocumenttypechildnode-previouselementsibling\n */\nCharacterData.prototype.previousElementSibling;\n\n/**\n * @type {?Element}\n * @see https://dom.spec.whatwg.org/#dom-nondocumenttypechildnode-nextelementsibling\n */\nCharacterData.prototype.nextElementSibling;\n","externs/w3c_eventsource.js":"/*\n * Copyright 2012 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's EventSource API.\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events\n *\n * @externs\n * @author [email protected] (Jeremy Elbourn)\n */\n\n/** @record */\nfunction EventSourceInit() {};\n\n/** @type {(boolean|undefined)} */\nEventSourceInit.prototype.withCredentials;\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @param {string} url\n * @param {EventSourceInit=} opt_eventSourceInitDict\n */\nfunction EventSource(url, opt_eventSourceInitDict) {}\n\n/** @override */\nEventSource.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/** @override */\nEventSource.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nEventSource.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @const {string}\n */\nEventSource.prototype.url;\n\n/** @const {boolean} */\nEventSource.prototype.withCredentials;\n\n/**\n * @const {number}\n */\nEventSource.prototype.CONNECTING;\n\n/**\n * @const {number}\n */\nEventSource.CONNECTING;\n\n/**\n * @const {number}\n */\nEventSource.prototype.OPEN;\n\n/**\n * @const {number}\n */\nEventSource.OPEN;\n\n/**\n * @const {number}\n */\nEventSource.prototype.CLOSED;\n\n/**\n * @const {number}\n */\nEventSource.CLOSED;\n\n/**\n * @const {number}\n */\nEventSource.prototype.readyState;\n\n/**\n * @type {?function(!Event): void}\n */\nEventSource.prototype.onopen = function(e) {};\n\n/**\n * @type {?function(!MessageEvent): void}\n */\nEventSource.prototype.onmessage = function(e) {};\n\n/**\n * @type {?function(!Event): void}\n */\nEventSource.prototype.onerror = function(e) {};\n\n/**\n * @return {undefined}\n */\nEventSource.prototype.close = function() {};\n","externs/w3c_geolocation.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Geolocation specification\n *     http://www.w3.org/TR/geolocation-API/\n * @externs\n * @author [email protected] (Neil Dunn)\n */\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/geolocation-API/#geolocation\n */\nfunction Geolocation() {}\n\n/**\n * @typedef {function(!GeolocationPosition): void}\n */\nvar PositionCallback;\n\n/**\n * @typedef {function(!GeolocationPositionError): void}\n */\nvar PositionErrorCallback;\n\n/**\n * @param {PositionCallback} successCallback\n * @param {PositionErrorCallback=} opt_errorCallback\n * @param {GeolocationPositionOptions=} opt_options\n * @return {undefined}\n */\nGeolocation.prototype.getCurrentPosition = function(successCallback,\n                                                       opt_errorCallback,\n                                                       opt_options) {};\n\n/**\n * @param {PositionCallback} successCallback\n * @param {PositionErrorCallback=} opt_errorCallback\n * @param {GeolocationPositionOptions=} opt_options\n * @return {number}\n */\nGeolocation.prototype.watchPosition = function(successCallback,\n                                                  opt_errorCallback,\n                                                  opt_options) {};\n\n/**\n * @param {number} watchId\n * @return {undefined}\n */\nGeolocation.prototype.clearWatch = function(watchId) {};\n\n\n/**\n * @record\n * @see http://www.w3.org/TR/geolocation-API/#coordinates\n */\nfunction GeolocationCoordinates() {}\n/** @type {number} */\nGeolocationCoordinates.prototype.latitude;\n/** @type {number} */\nGeolocationCoordinates.prototype.longitude;\n/** @type {number} */\nGeolocationCoordinates.prototype.accuracy;\n/** @type {number|null} */\nGeolocationCoordinates.prototype.altitude;\n/** @type {number|null} */\nGeolocationCoordinates.prototype.altitudeAccuracy;\n/** @type {number|null} */\nGeolocationCoordinates.prototype.heading;\n/** @type {number|null} */\nGeolocationCoordinates.prototype.speed;\n\n\n/**\n * @record\n * @see http://www.w3.org/TR/geolocation-API/#position\n */\nfunction GeolocationPosition() {}\n/** @type {GeolocationCoordinates} */\nGeolocationPosition.prototype.coords;\n/** @type {number} */\nGeolocationPosition.prototype.timestamp;\n\n\n/**\n * @record\n * @see http://www.w3.org/TR/geolocation-API/#position-options\n */\nfunction GeolocationPositionOptions() {}\n/** @type {boolean|undefined} */\nGeolocationPositionOptions.prototype.enableHighAccuracy;\n/** @type {number|undefined} */\nGeolocationPositionOptions.prototype.maximumAge;\n/** @type {number|undefined} */\nGeolocationPositionOptions.prototype.timeout;\n\n\n/**\n * @record\n * @see http://www.w3.org/TR/geolocation-API/#position-error\n */\nfunction GeolocationPositionError() {}\n/** @type {number} */\nGeolocationPositionError.prototype.code;\n/** @type {string} */\nGeolocationPositionError.prototype.message;\n/** @const {number} */\nGeolocationPositionError.prototype.UNKNOWN_ERROR;\n/** @const {number} */\nGeolocationPositionError.prototype.PERMISSION_DENIED;\n/** @const {number} */\nGeolocationPositionError.prototype.POSITION_UNAVAILABLE;\n/** @const {number} */\nGeolocationPositionError.prototype.TIMEOUT;\n\n/** @type {Geolocation} */\nNavigator.prototype.geolocation;\n","externs/w3c_indexeddb.js":"/*\n * Copyright 2011 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's IndexedDB API and IndexedDB API 2.0.\n * @see http://www.w3.org/TR/2015/REC-IndexedDB-20150108/\n * @see https://www.w3.org/TR/2017/WD-IndexedDB-2-20170313/\n *\n * @externs\n * @author [email protected] (Guido Tapia)\n * @author [email protected] (Martin Vobruba)\n */\n\n/** @type {!IDBFactory} */\nvar indexedDB;\n\n/** @type {!IDBFactory|undefined} */\nServiceWorkerGlobalScope.prototype.indexedDB;\n\n\n\n/**\n * Possible values: 'readonly', 'readwrite', 'versionchange'\n *\n * @typedef {string}\n * @see https://www.w3.org/TR/IndexedDB/#idl-def-IDBTransactionMode\n */\nvar IDBTransactionMode;\n\n\n/**\n * Possible values: 'pending', 'done'\n *\n * @typedef {string}\n * @see https://www.w3.org/TR/IndexedDB/#idl-def-IDBRequestReadyState\n */\nvar IDBRequestReadyState;\n\n\n/**\n * Possible values: 'next', 'nextunique', 'prev', 'prevunique'\n *\n * @typedef {string}\n * @see https://www.w3.org/TR/IndexedDB/#idl-def-IDBCursorDirection\n */\nvar IDBCursorDirection;\n\n\n/**\n * @record\n * @see https://www.w3.org/TR/IndexedDB/#idl-def-IDBIndexParameters\n */\nfunction IDBIndexParameters(){};\n\n/** @type {(undefined|boolean)} */\nIDBIndexParameters.prototype.unique;\n\n/** @type {(undefined|boolean)} */\nIDBIndexParameters.prototype.multiEntry;\n\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/IndexedDB/#idl-def-IDBVersionChangeEventInit\n */\nfunction IDBVersionChangeEventInit(){};\n\n/** @type {(undefined|number)} */\nIDBVersionChangeEventInit.prototype.oldVersion;\n\n/** @type {(undefined|number|null)} */\nIDBVersionChangeEventInit.prototype.newVersion;\n\n\n\n/**\n * @record\n * @see https://www.w3.org/TR/IndexedDB/#idl-def-IDBObjectStoreParameters\n */\nfunction IDBObjectStoreParameters() {};\n\n/** @type {(undefined|string|!Array|null)} */\nIDBObjectStoreParameters.prototype.keyPath;\n\n/** @type {(undefined|boolean)} */\nIDBObjectStoreParameters.prototype.autoIncrement;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBFactory\n */\nfunction IDBFactory() {}\n\n/**\n * @param {string} name The name of the database to open.\n * @param {number=} opt_version The version at which to open the database.\n * @return {!IDBOpenDBRequest} The IDBRequest object.\n */\nIDBFactory.prototype.open = function(name, opt_version) {};\n\n/**\n * @param {string} name The name of the database to delete.\n * @return {!IDBOpenDBRequest} The IDBRequest object.\n */\nIDBFactory.prototype.deleteDatabase = function(name) {};\n\n/**\n * @param {*} first\n * @param {*} second\n * @return {number}\n */\nIDBFactory.prototype.cmp = function(first, second) {};\n\n\n/**\n * @constructor\n * @template T\n * @implements {EventTarget}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBRequest\n * @see https://www.w3.org/TR/IndexedDB-2/#request-api\n */\nfunction IDBRequest() {}\n\n/** @override */\nIDBRequest.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/** @override */\nIDBRequest.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nIDBRequest.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @type {!IDBRequestReadyState}\n */\nIDBRequest.prototype.readyState; // readonly\n\n/**\n * @type {function(!Event)}\n */\nIDBRequest.prototype.onsuccess = function(e) {};\n\n/**\n * @type {function(!Event)}\n */\nIDBRequest.prototype.onerror = function(e) {};\n\n/** @type {T} */\nIDBRequest.prototype.result;  // readonly\n\n/**\n * @type {number}\n * @deprecated Use \"error\"\n */\nIDBRequest.prototype.errorCode;  // readonly\n\n\n/** @type {?DOMError|?DOMException} */\nIDBRequest.prototype.error; // readonly\n\n/** @type {?IDBObjectStore|?IDBIndex|?IDBCursor} */\nIDBRequest.prototype.source; // readonly\n\n/** @type {?IDBTransaction} */\nIDBRequest.prototype.transaction; // readonly\n\n\n/**\n * @constructor\n * @extends {IDBRequest}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBOpenDBRequest\n */\nfunction IDBOpenDBRequest() {}\n\n/**\n * @type {function(!IDBVersionChangeEvent)}\n */\nIDBOpenDBRequest.prototype.onblocked = function(e) {};\n\n/**\n * @type {function(!IDBVersionChangeEvent)}\n */\nIDBOpenDBRequest.prototype.onupgradeneeded = function(e) {};\n\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBDatabase\n * @see https://www.w3.org/TR/IndexedDB-2/#database-interface\n */\nfunction IDBDatabase() {}\n\n/**\n * @const {string}\n */\nIDBDatabase.prototype.name;\n\n/**\n * @const {number}\n */\nIDBDatabase.prototype.version;\n\n/**\n * @const {!DOMStringList}\n */\nIDBDatabase.prototype.objectStoreNames;\n\n/**\n * @param {string} name The name of the object store.\n * @param {!IDBObjectStoreParameters=} opt_parameters Parameters to be passed\n *     creating the object store.\n * @return {!IDBObjectStore} The created/open object store.\n */\nIDBDatabase.prototype.createObjectStore =\n    function(name, opt_parameters)  {};\n\n/**\n * @param {string} name The name of the object store to remove.\n * @return {undefined}\n */\nIDBDatabase.prototype.deleteObjectStore = function(name) {};\n\n/**\n * @param {(string|!Array|!DOMStringList)} storeNames The stores to open\n *     in this transaction.\n * @param {!IDBTransactionMode=} mode The mode for opening the object stores.\n * @return {!IDBTransaction} The IDBRequest object.\n */\nIDBDatabase.prototype.transaction = function(storeNames, mode) {};\n\n/**\n * Closes the database connection.\n * @return {undefined}\n */\nIDBDatabase.prototype.close = function() {};\n\n/**\n * @type {?function(!Event)}\n */\nIDBDatabase.prototype.onabort;\n\n/**\n * @type {?function(!Event)}\n */\nIDBDatabase.prototype.onclose;\n\n/**\n * @type {?function(!Event)}\n */\nIDBDatabase.prototype.onerror;\n\n/**\n * @type {?function(!IDBVersionChangeEvent)}\n */\nIDBDatabase.prototype.onversionchange;\n\n/** @override */\nIDBDatabase.prototype.addEventListener = function(type, listener, opt_options) {\n};\n\n/** @override */\nIDBDatabase.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nIDBDatabase.prototype.dispatchEvent = function(evt) {};\n\n\n/**\n * Typedef for valid key types according to the w3 specification. Note that this\n * is slightly wider than what is actually allowed, as all Array elements must\n * have a valid key type.\n * @see http://www.w3.org/TR/IndexedDB/#key-construct\n * @see https://www.w3.org/TR/IndexedDB-2/#key-construct\n * @typedef {number|string|!Date|!Array|!BufferSource}\n */\nvar IDBKeyType;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBObjectStore\n * @see https://www.w3.org/TR/IndexedDB-2/#object-store-interface\n */\nfunction IDBObjectStore() {}\n\n/**\n * @type {string}\n */\nIDBObjectStore.prototype.name;\n\n/**\n * @type {*}\n */\nIDBObjectStore.prototype.keyPath;\n\n/**\n * @type {!DOMStringList}\n */\nIDBObjectStore.prototype.indexNames;\n\n/** @type {!IDBTransaction} */\nIDBObjectStore.prototype.transaction;\n\n/** @type {boolean} */\nIDBObjectStore.prototype.autoIncrement;\n\n/**\n * @param {*} value The value to put into the object store.\n * @param {!IDBKeyType=} key The key of this value.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBObjectStore.prototype.put = function(value, key) {};\n\n/**\n * @param {*} value The value to add into the object store.\n * @param {!IDBKeyType=} key The key of this value.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBObjectStore.prototype.add = function(value, key) {};\n\n/**\n * @param {!IDBKeyType|!IDBKeyRange} key The key of this value.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBObjectStore.prototype.delete = function(key) {};\n\n/**\n * @param {!IDBKeyType|!IDBKeyRange} key The key of the document to retrieve.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBObjectStore.prototype.get = function(key) {};\n\n/**\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBObjectStore.prototype.clear = function() {};\n\n/**\n * @param {?IDBKeyRange=} range The range of the cursor.\n *     Nullable because IE <11 has problems with undefined.\n * @param {!IDBCursorDirection=} direction The direction of cursor enumeration.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBObjectStore.prototype.openCursor = function(range, direction) {};\n\n/**\n * @param {string} name The name of the index.\n * @param {string|!Array} keyPath The path to the index key.\n * @param {!IDBIndexParameters=} opt_paramters Optional parameters\n *     for the created index.\n * @return {!IDBIndex} The IDBIndex object.\n */\nIDBObjectStore.prototype.createIndex = function(name, keyPath, opt_paramters) {};\n\n/**\n * @param {string} name The name of the index to retrieve.\n * @return {!IDBIndex} The IDBIndex object.\n */\nIDBObjectStore.prototype.index = function(name) {};\n\n/**\n * @param {string} indexName The name of the index to remove.\n * @return {undefined}\n */\nIDBObjectStore.prototype.deleteIndex = function(indexName) {};\n\n/**\n * @param {(!IDBKeyType|IDBKeyRange)=} key The key of this value.\n * @return {!IDBRequest} The IDBRequest object.\n * @see http://www.w3.org/TR/IndexedDB/#widl-IDBObjectStore-count\n */\nIDBObjectStore.prototype.count = function(key) {};\n\n/**\n * @param {(!IDBKeyType|IDBKeyRange)=} query\n * @return {!IDBRequest} The IDBRequest object.\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbobjectstore-getkey\n */\nIDBObjectStore.prototype.getKey = function(query) {};\n\n/**\n * @param {(!IDBKeyType|IDBKeyRange)=} query\n * @param {number=} count\n * @return {!IDBRequest} The IDBRequest object.\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbobjectstore-getall\n */\nIDBObjectStore.prototype.getAll = function(query, count) {};\n\n/**\n * @param {(!IDBKeyType|IDBKeyRange)=} query\n * @param {number=} count\n * @return {!IDBRequest} The IDBRequest object.\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbobjectstore-getallkeys\n */\nIDBObjectStore.prototype.getAllKeys = function(query, count) {};\n\n/**\n * @param {(!IDBKeyType|IDBKeyRange)=} query\n * @param {!IDBCursorDirection=} direction\n * @return {!IDBRequest} The IDBRequest object.\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbobjectstore-openkeycursor\n */\nIDBObjectStore.prototype.openKeyCursor = function(query, direction) {};\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBIndex\n * @see https://www.w3.org/TR/IndexedDB-2/#index-interface\n */\nfunction IDBIndex() {}\n\n/**\n * @type {string}\n */\nIDBIndex.prototype.name;\n\n/**\n * @const {!IDBObjectStore}\n */\nIDBIndex.prototype.objectStore;\n\n/**\n * @const {*}\n */\nIDBIndex.prototype.keyPath;\n\n/**\n * @const {boolean}\n */\nIDBIndex.prototype.multiEntry;\n\n/**\n * @const {boolean}\n */\nIDBIndex.prototype.unique;\n\n/**\n * @param {(!IDBKeyType|?IDBKeyRange)=} range The range of the cursor.\n *     Nullable because IE <11 has problems with undefined.\n * @param {!IDBCursorDirection=} direction The direction of cursor enumeration.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBIndex.prototype.openCursor = function(range, direction) {};\n\n/**\n * @param {(!IDBKeyType|?IDBKeyRange)=} range The range of the cursor.\n *     Nullable because IE <11 has problems with undefined.\n * @param {!IDBCursorDirection=} direction The direction of cursor enumeration.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBIndex.prototype.openKeyCursor = function(range, direction) {};\n\n/**\n * @param {!IDBKeyType|!IDBKeyRange} key The id of the object to retrieve.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBIndex.prototype.get = function(key) {};\n\n/**\n * @param {!IDBKeyType|!IDBKeyRange} key The id of the object to retrieve.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBIndex.prototype.getKey = function(key) {};\n\n/**\n * @param {(!IDBKeyType|!IDBKeyRange)=} query\n * @param {number=} count\n * @return {!IDBRequest}\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbindex-getall\n */\nIDBIndex.prototype.getAll = function(query, count) {};\n\n/**\n * @param {(!IDBKeyType|!IDBKeyRange)=} query\n * @param {number=} count\n * @return {!IDBRequest}\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbindex-getallkeys\n */\nIDBIndex.prototype.getAllKeys = function(query, count) {};\n\n/**\n * @param {(!IDBKeyType|!IDBKeyRange)=} opt_key\n * @return {!IDBRequest}\n */\nIDBIndex.prototype.count = function(opt_key) {};\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBCursor\n * @see https://www.w3.org/TR/IndexedDB-2/#cursor-interface\n */\nfunction IDBCursor() {}\n\n/**\n * @const {(!IDBObjectStore|!IDBIndex)}\n */\nIDBCursor.prototype.source;\n\n/**\n * @const {!IDBCursorDirection}\n */\nIDBCursor.prototype.direction;\n\n/**\n * @const {!IDBKeyType}\n */\nIDBCursor.prototype.key;\n\n/**\n * @const {!IDBKeyType}\n */\nIDBCursor.prototype.primaryKey;\n\n/**\n * @param {*} value The new value for the current object in the cursor.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBCursor.prototype.update = function(value) {};\n\n/**\n * Note: Must be quoted to avoid parse error.\n * @param {!IDBKeyType=} key Continue enumerating the cursor from the specified\n *     key (or next).\n * @return {undefined}\n */\nIDBCursor.prototype.continue = function(key) {};\n\n/**\n * @param {!IDBKeyType} key\n * @param {!IDBKeyType} primaryKey\n * @return {undefined}\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbcursor-continueprimarykey\n */\nIDBCursor.prototype.continuePrimaryKey = function(key, primaryKey) {};\n\n/**\n * @param {number} count Number of times to iterate the cursor.\n * @return {undefined}\n */\nIDBCursor.prototype.advance = function(count) {};\n\n/**\n * Note: Must be quoted to avoid parse error.\n * @return {!IDBRequest} The IDBRequest object.\n */\nIDBCursor.prototype.delete = function() {};\n\n\n/**\n * @constructor\n * @extends {IDBCursor}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBCursorWithValue\n */\nfunction IDBCursorWithValue() {}\n\n/** @type {*} */\nIDBCursorWithValue.prototype.value; // readonly\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBTransaction\n * @see https://www.w3.org/TR/IndexedDB-2/#transaction\n */\nfunction IDBTransaction() {}\n\n/**\n * @const {!DOMStringList}\n */\nIDBTransaction.prototype.objectStoreNames;\n\n/**\n * @const {!IDBTransactionMode}\n */\nIDBTransaction.prototype.mode;\n\n/**\n * @const {!IDBDatabase}\n */\nIDBTransaction.prototype.db;\n\n/**\n * @type {!DOMError|!DOMException}\n */\nIDBTransaction.prototype.error;\n\n/**\n * @param {string} name The name of the object store to retrieve.\n * @return {!IDBObjectStore} The object store.\n */\nIDBTransaction.prototype.objectStore = function(name) {};\n\n/**\n * Aborts the transaction.\n * @return {undefined}\n */\nIDBTransaction.prototype.abort = function() {};\n\n/**\n * Commits the transaction.\n * @return {undefined}\n */\nIDBTransaction.prototype.commit = function() {};\n\n/**\n * @type {?function(!Event)}\n */\nIDBTransaction.prototype.onabort;\n\n/**\n * @type {?function(!Event)}\n */\nIDBTransaction.prototype.oncomplete;\n\n/**\n * @type {?function(!Event)}\n */\nIDBTransaction.prototype.onerror;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBKeyRange\n * @see https://www.w3.org/TR/IndexedDB-2/#keyrange\n */\nfunction IDBKeyRange() {}\n\n/**\n * @const {*}\n */\nIDBKeyRange.prototype.lower;\n\n/**\n * @const {*}\n */\nIDBKeyRange.prototype.upper;\n\n/**\n * @const {boolean}\n */\nIDBKeyRange.prototype.lowerOpen;\n\n/**\n * @const {boolean}\n */\nIDBKeyRange.prototype.upperOpen;\n\n/**\n * @param {!IDBKeyType} value The single key value of this range.\n * @return {!IDBKeyRange} The key range.\n */\nIDBKeyRange.only = function(value) {};\n\n/**\n * @param {!IDBKeyType} bound Creates a lower bound key range.\n * @param {boolean=} open Open the key range.\n * @return {!IDBKeyRange} The key range.\n */\nIDBKeyRange.lowerBound = function(bound, open) {};\n\n/**\n * @param {!IDBKeyType} bound Creates an upper bound key range.\n * @param {boolean=} open Open the key range.\n * @return {!IDBKeyRange} The key range.\n */\nIDBKeyRange.upperBound = function(bound, open) {};\n\n/**\n * @param {!IDBKeyType} left The left bound value.\n * @param {!IDBKeyType} right The right bound value.\n * @param {boolean=} openLeft Whether the left bound value should be excluded.\n * @param {boolean=} openRight Whether the right bound value should be excluded.\n * @return {!IDBKeyRange} The key range.\n */\nIDBKeyRange.bound = function(left, right, openLeft, openRight) {};\n\n/**\n * @param {!IDBKeyType} key\n * @return {boolean}\n * @see https://www.w3.org/TR/IndexedDB-2/#dom-idbkeyrange-includes\n */\nIDBKeyRange.prototype.includes = function(key) {};\n\n\n/**\n * @param {string} type\n * @param {!IDBVersionChangeEventInit=} opt_eventInit\n * @constructor\n * @extends {Event}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBVersionChangeEvent\n */\nfunction IDBVersionChangeEvent(type, opt_eventInit) {}\n\n/**\n * @const {number}\n */\nIDBVersionChangeEvent.prototype.oldVersion;\n\n/**\n * @const {?number}\n */\nIDBVersionChangeEvent.prototype.newVersion;\n","externs/nonstandard_indexeddb.js":"/*\n * Copyright 2011 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Browser specific definitions for W3C's IndexedDB API\n * @externs\n */\n\n/** @type {!IDBFactory|undefined} */\nWindow.prototype.moz_indexedDB;\n\n/** @type {!IDBFactory|undefined} */\nWindow.prototype.mozIndexedDB;\n\n/** @type {!IDBFactory|undefined} */\nWindow.prototype.webkitIndexedDB;\n\n/** @type {!IDBFactory|undefined} */\nWindow.prototype.msIndexedDB;\n\n/**\n * @constructor\n * @extends {IDBRequest}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBRequest\n * @see https://www.w3.org/TR/IndexedDB-2/#request-api\n */\nfunction webkitIDBRequest() {}\n\n/**\n * @constructor\n * @extends {IDBCursor}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBCursor\n * @see https://www.w3.org/TR/IndexedDB-2/#cursor-interface\n */\nfunction webkitIDBCursor() {}\n\n/**\n * @constructor\n * @extends {IDBTransaction}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBTransaction\n * @see https://www.w3.org/TR/IndexedDB-2/#transaction\n */\nfunction webkitIDBTransaction() {}\n\n/**\n * @constructor\n * @extends {IDBKeyRange}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBKeyRange\n * @see https://www.w3.org/TR/IndexedDB-2/#keyrange\n */\nfunction webkitIDBKeyRange() {}\n\n/**\n * @param {string} type\n * @param {!IDBVersionChangeEventInit=} eventInit\n * @constructor\n * @extends {IDBVersionChangeEvent}\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBVersionChangeEvent\n */\nfunction webkitIDBVersionChangeEvent(type, eventInit) {}\n\n/**\n * @const {string}\n */\nwebkitIDBVersionChangeEvent.prototype.version;\n","externs/w3c_midi.js":"/*\n * Copyright 2014 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview W3C Web MIDI specification.\n * @see http://www.w3.org/TR/webmidi/\n *\n * @externs\n */\n\n\n/**\n * @param {!MIDIOptions=} opt_options\n * @return {!Promise.}\n */\nnavigator.requestMIDIAccess = function(opt_options) {};\n\n\n/**\n * @typedef {{\n *   sysex: boolean\n * }}\n */\nvar MIDIOptions;\n\n\n\n/**\n * @interface\n */\nvar MIDIInputMap = function() {};\n\n\n/**\n * @const {number}\n */\nMIDIInputMap.prototype.size;\n\n\n/**\n * @param {function(string)} iterator\n */\nMIDIInputMap.prototype.keys = function(iterator) {};\n\n\n/**\n * @param {function(!Array.<*>)} iterator\n */\nMIDIInputMap.prototype.entries = function(iterator) {};\n\n\n/**\n * @param {function(!MIDIInput)} iterator\n */\nMIDIInputMap.prototype.values = function(iterator) {};\n\n\n/**\n * @param {string} key\n * @return {!MIDIInput}\n */\nMIDIInputMap.prototype.get = function(key) {};\n\n\n/**\n * @param {string} key\n * @return {boolean}\n */\nMIDIInputMap.prototype.has = function(key) {};\n\n\n\n/**\n * @interface\n */\nvar MIDIOutputMap = function() {};\n\n\n/**\n * @const {number}\n */\nMIDIOutputMap.prototype.size;\n\n\n/**\n * @param {function(string)} iterator\n */\nMIDIOutputMap.prototype.keys = function(iterator) {};\n\n\n/**\n * @param {function(!Array.<*>)} iterator\n */\nMIDIOutputMap.prototype.entries = function(iterator) {};\n\n\n/**\n * @param {function(!MIDIOutput)} iterator\n */\nMIDIOutputMap.prototype.values = function(iterator) {};\n\n\n/**\n * @param {string} key\n * @return {!MIDIOutput}\n */\nMIDIOutputMap.prototype.get = function(key) {};\n\n\n/**\n * @param {string} key\n * @return {boolean}\n */\nMIDIOutputMap.prototype.has = function(key) {};\n\n\n\n/**\n * @interface\n * @extends {EventTarget}\n */\nvar MIDIAccess = function() {};\n\n\n/**\n * @const {!MIDIInputMap}\n */\nMIDIAccess.prototype.inputs;\n\n\n/**\n * @const {!MIDIOutputMap}\n */\nMIDIAccess.prototype.outputs;\n\n\n/**\n * @const {function(!MIDIConnectionEvent)}\n */\nMIDIAccess.prototype.onconnect;\n\n\n/**\n * @type {function(!MIDIConnectionEvent)}\n */\nMIDIAccess.prototype.ondisconnect;\n\n\n/**\n * @const {boolean}\n */\nMIDIAccess.prototype.sysexEnabled;\n\n\n\n/**\n * @interface\n * @extends {EventTarget}\n */\nvar MIDIPort = function() {};\n\n\n/**\n * @const {string}\n */\nMIDIPort.prototype.id;\n\n\n/**\n * @const {string}\n */\nMIDIPort.prototype.manufacturer;\n\n\n/**\n * @const {string}\n */\nMIDIPort.prototype.name;\n\n\n/**\n * @const {string}\n */\nMIDIPort.prototype.type;\n\n\n/**\n * @const {string}\n */\nMIDIPort.prototype.version;\n\n\n/**\n * @type {function(!MIDIConnectionEvent)}\n */\nMIDIPort.prototype.ondisconnect;\n\n\n\n/**\n * @interface\n * @extends {MIDIPort}\n */\nvar MIDIInput = function() {};\n\n\n/**\n * @type {function(!MIDIMessageEvent)}\n */\nMIDIInput.prototype.onmidimessage;\n\n\n\n/**\n * @interface\n * @extends {MIDIPort}\n */\nvar MIDIOutput = function() {};\n\n\n/**\n * @param {!Uint8Array} data\n * @param {number=} opt_timestamp\n */\nMIDIOutput.prototype.send = function(data, opt_timestamp) {};\n\n\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {!MIDIMessageEventInit=} opt_init\n */\nvar MIDIMessageEvent = function(type, opt_init) {};\n\n\n/**\n * @const {number}\n */\nMIDIMessageEvent.prototype.receivedTime;\n\n\n/**\n * @const {!Uint8Array}\n */\nMIDIMessageEvent.prototype.data;\n\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/webmidi/#midimessageeventinit-interface\n */\nfunction MIDIMessageEventInit() {}\n\n/** @type {undefined|number} */\nMIDIMessageEventInit.prototype.receivedTime;\n\n/** @type {undefined|!Uint8Array} */\nMIDIMessageEventInit.prototype.data;\n\n\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {!MIDIConnectionEventInit=} opt_init\n */\nvar MIDIConnectionEvent = function(type, opt_init) {};\n\n\n/**\n * @const {MIDIPort}\n */\nMIDIConnectionEvent.prototype.port;\n\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/webmidi/#idl-def-MIDIConnectionEventInit\n */\nfunction MIDIConnectionEventInit() {}\n\n/** @type {undefined|!MIDIPort} */\nMIDIConnectionEventInit.prototype.port;\n","externs/w3c_navigation_timing.js":"/*\n * Copyright 2011 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Navigation Timing specification.\n *\n * Created from\n * @see http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html\n * @see http://w3c-test.org/webperf/specs/ResourceTiming\n * @see http://www.w3.org/TR/performance-timeline\n * @see http://www.w3.org/TR/user-timing/\n *\n * @externs\n * @author [email protected] (René Kyllingstad)\n */\n\n/** @constructor */\nfunction PerformanceTiming() {}\n/** @type {number} */ PerformanceTiming.prototype.navigationStart;\n/** @type {number} */ PerformanceTiming.prototype.unloadEventStart;\n/** @type {number} */ PerformanceTiming.prototype.unloadEventEnd;\n/** @type {number} */ PerformanceTiming.prototype.redirectStart;\n/** @type {number} */ PerformanceTiming.prototype.redirectEnd;\n/** @type {number} */ PerformanceTiming.prototype.fetchStart;\n/** @type {number} */ PerformanceTiming.prototype.domainLookupStart;\n/** @type {number} */ PerformanceTiming.prototype.domainLookupEnd;\n/** @type {number} */ PerformanceTiming.prototype.connectStart;\n/** @type {number} */ PerformanceTiming.prototype.connectEnd;\n/** @type {number} */ PerformanceTiming.prototype.secureConnectionStart;\n/** @type {number} */ PerformanceTiming.prototype.requestStart;\n/** @type {number} */ PerformanceTiming.prototype.responseStart;\n/** @type {number} */ PerformanceTiming.prototype.responseEnd;\n/** @type {number} */ PerformanceTiming.prototype.domLoading;\n/** @type {number} */ PerformanceTiming.prototype.domInteractive;\n/** @type {number} */ PerformanceTiming.prototype.domContentLoadedEventStart;\n/** @type {number} */ PerformanceTiming.prototype.domContentLoadedEventEnd;\n/** @type {number} */ PerformanceTiming.prototype.domComplete;\n/** @type {number} */ PerformanceTiming.prototype.loadEventStart;\n/** @type {number} */ PerformanceTiming.prototype.loadEventEnd;\n\n/** @constructor */\nfunction PerformanceEntry() {}\n/** @type {string} */ PerformanceEntry.prototype.name;\n/** @type {string} */ PerformanceEntry.prototype.entryType;\n/** @type {number} */ PerformanceEntry.prototype.startTime;\n/** @type {number} */ PerformanceEntry.prototype.duration;\n\n/**\n * https://www.w3.org/TR/resource-timing-2/#performanceresourcetiming\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction PerformanceResourceTiming() {}\n/** @type {number} */ PerformanceResourceTiming.prototype.redirectStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.redirectEnd;\n/** @type {number} */ PerformanceResourceTiming.prototype.fetchStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.domainLookupStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.domainLookupEnd;\n/** @type {number} */ PerformanceResourceTiming.prototype.connectStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.connectEnd;\n/** @type {number} */\nPerformanceResourceTiming.prototype.secureConnectionStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.requestStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.responseStart;\n/** @type {number} */ PerformanceResourceTiming.prototype.responseEnd;\n/** @type {string} */ PerformanceResourceTiming.prototype.initiatorType;\n/** @type {number|undefined} */\nPerformanceResourceTiming.prototype.transferSize;\n/** @type {number|undefined} */\nPerformanceResourceTiming.prototype.encodedBodySize;\n/** @type {number|undefined} */\nPerformanceResourceTiming.prototype.decodedBodySize;\n/** @type {number|undefined} */\nPerformanceResourceTiming.prototype.workerStart;\n/** @type {string} */ PerformanceResourceTiming.prototype.nextHopProtocol;\n\n/**\n * Possible values are 'navigate', 'reload', 'back_forward', and 'prerender'.\n * See https://w3c.github.io/navigation-timing/#sec-performance-navigation-types\n * @typedef {string}\n */\nvar NavigationType;\n\n/**\n * https://w3c.github.io/navigation-timing/#sec-PerformanceNavigationTiming\n * @constructor\n * @extends {PerformanceResourceTiming}\n */\nfunction PerformanceNavigationTiming() {}\n/** @type {number} */ PerformanceNavigationTiming.prototype.unloadEventStart;\n/** @type {number} */ PerformanceNavigationTiming.prototype.unloadEventEnd;\n/** @type {number} */ PerformanceNavigationTiming.prototype.domInteractive;\n/** @type {number} */ PerformanceNavigationTiming.prototype\n    .domContentLoadedEventStart;\n/** @type {number} */ PerformanceNavigationTiming.prototype\n    .domContentLoadedEventEnd;\n/** @type {number} */ PerformanceNavigationTiming.prototype.domComplete;\n/** @type {number} */ PerformanceNavigationTiming.prototype.loadEventStart;\n/** @type {number} */ PerformanceNavigationTiming.prototype.loadEventEnd;\n/** @type {NavigationType} */ PerformanceNavigationTiming.prototype.type;\n/** @type {number} */ PerformanceNavigationTiming.prototype.redirectCount;\n\n/**\n * https://w3c.github.io/paint-timing/#sec-PerformancePaintTiming\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction PerformancePaintTiming() {}\n\n/** @constructor */\nfunction PerformanceNavigation() {}\n/** @const {number} */ PerformanceNavigation.TYPE_NAVIGATE;\n/** @const {number} */ PerformanceNavigation.prototype.TYPE_NAVIGATE;\n/** @const {number} */ PerformanceNavigation.TYPE_RELOAD;\n/** @const {number} */ PerformanceNavigation.prototype.TYPE_RELOAD;\n/** @const {number} */ PerformanceNavigation.TYPE_BACK_FORWARD;\n/** @const {number} */ PerformanceNavigation.prototype.TYPE_BACK_FORWARD;\n/** @const {number} */ PerformanceNavigation.TYPE_RESERVED;\n/** @const {number} */ PerformanceNavigation.prototype.TYPE_RESERVED;\n/** @type {number} */ PerformanceNavigation.prototype.type;\n/** @type {number} */ PerformanceNavigation.prototype.redirectCount;\n\n/**\n * https://w3c.github.io/longtasks/#taskattributiontiming\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction TaskAttributionTiming() {}\n/** @type {string} */ TaskAttributionTiming.prototype.containerId;\n/** @type {string} */ TaskAttributionTiming.prototype.containerName;\n/** @type {string} */ TaskAttributionTiming.prototype.containerSrc;\n/** @type {string} */ TaskAttributionTiming.prototype.containerType;\n\n/**\n * https://w3c.github.io/longtasks/#performancelongtasktiming\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction PerformanceLongTaskTiming() {}\n/** @type {!Array} */\nPerformanceLongTaskTiming.prototype.attribution;\n\n/**\n * https://wicg.github.io/layout-instability/#sec-layout-shift\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction LayoutShift() {}\n/** @type {number} */ LayoutShift.prototype.value;\n/** @type {boolean} */ LayoutShift.prototype.hadRecentInput;\n/** @type {number} */ LayoutShift.prototype.lastInputTime;\n\n/**\n * https://wicg.github.io/largest-contentful-paint/#largestcontentfulpaint\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction LargestContentfulPaint() {}\n/** @type {number} */ LargestContentfulPaint.prototype.renderTime;\n/** @type {number} */ LargestContentfulPaint.prototype.loadTime;\n/** @type {number} */ LargestContentfulPaint.prototype.size;\n/** @type {string} */ LargestContentfulPaint.prototype.id;\n/** @type {string} */ LargestContentfulPaint.prototype.url;\n/** @type {?Element} */ LargestContentfulPaint.prototype.element;\n\n/**\n * https://wicg.github.io/event-timing/#sec-performance-event-timing\n * @constructor\n * @extends {PerformanceEntry}\n */\nfunction PerformanceEventTiming() {}\n/** @type {number} */ PerformanceEventTiming.prototype.processingStart;\n/** @type {number} */ PerformanceEventTiming.prototype.processingEnd;\n/** @type {boolean} */ PerformanceEventTiming.prototype.cancelable;\n\n/** @constructor */\nfunction Performance() {}\n\n/** @type {PerformanceTiming} */\nPerformance.prototype.timing;\n\n/** @type {PerformanceNavigation} */\nPerformance.prototype.navigation;\n\n/** @type {number} */\nPerformance.prototype.timeOrigin;\n\n\n/**\n * Clears the buffer used to store the current list of\n * PerformanceResourceTiming resources.\n * @return {undefined}\n */\nPerformance.prototype.clearResourceTimings = function() {};\n\n/**\n * A callback that is invoked when the resourcetimingbufferfull event is fired.\n * @type {?function(Event)}\n */\nPerformance.prototype.onresourcetimingbufferfull = function() {};\n\n/**\n * Set the maximum number of PerformanceResourceTiming resources that may be\n * stored in the buffer.\n * @param {number} maxSize\n * @return {undefined}\n */\nPerformance.prototype.setResourceTimingBufferSize = function(maxSize) {};\n\n/**\n * @return {!Array} A copy of the PerformanceEntry list,\n *     in chronological order with respect to startTime.\n * @nosideeffects\n */\nPerformance.prototype.getEntries = function() {};\n\n/**\n * @param {string} entryType Only return `PerformanceEntry`s with this\n *     entryType.\n * @return {!Array} A copy of the PerformanceEntry list,\n *     in chronological order with respect to startTime.\n * @nosideeffects\n */\nPerformance.prototype.getEntriesByType = function(entryType) {};\n\n/**\n * @param {string} name Only return `PerformanceEntry`s with this name.\n * @param {string=} opt_entryType Only return `PerformanceEntry`s with\n *     this entryType.\n * @return {!Array} PerformanceEntry list in chronological\n *     order with respect to startTime.\n * @nosideeffects\n */\nPerformance.prototype.getEntriesByName = function(name, opt_entryType) {};\n\n/**\n * @return {number}\n * @nosideeffects\n */\nPerformance.prototype.now = function() {};\n\n/**\n * @param {string} markName\n * @return {undefined}\n */\nPerformance.prototype.mark = function(markName) {};\n\n/**\n * @param {string=} opt_markName\n * @return {undefined}\n */\nPerformance.prototype.clearMarks = function(opt_markName) {};\n\n/**\n * @param {string} measureName\n * @param {string=} opt_startMark\n * @param {string=} opt_endMark\n * @return {undefined}\n */\nPerformance.prototype.measure = function(\n    measureName, opt_startMark, opt_endMark) {};\n\n/**\n * @param {string=} opt_measureName\n * @return {undefined}\n */\nPerformance.prototype.clearMeasures = function(opt_measureName) {};\n\n/** @type {Performance} */\nWindow.prototype.performance;\n\n/**\n * @type {!Performance}\n * @suppress {duplicate}\n */\nvar performance;\n\n/**\n * @constructor\n * @extends {Performance}\n */\nfunction WorkerPerformance() {}\n\n/**\n * @typedef {function(!PerformanceObserverEntryList, !PerformanceObserver): void}\n */\nvar PerformanceObserverCallback;\n\n/**\n * See:\n * https://w3c.github.io/performance-timeline/#the-performanceobserver-interface\n * @constructor\n * @param {!PerformanceObserverCallback} callback\n */\nfunction PerformanceObserver(callback) {}\n\n/**\n * @param {!PerformanceObserverInit} options\n */\nPerformanceObserver.prototype.observe = function(options) {};\n\n/** @return {void} */\nPerformanceObserver.prototype.disconnect = function() {};\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/takeRecords\n * @return {!PerformanceObserverEntryList}\n */\nPerformanceObserver.prototype.takeRecords = function() {};\n\n/** @const {!Array} */\nPerformanceObserver.prototype.supportedEntryTypes;\n\n/**\n * @record\n */\nfunction PerformanceObserverInit() {}\n\n/** @type {undefined|!Array} */\nPerformanceObserverInit.prototype.entryTypes;\n/** @type {undefined|string} */\nPerformanceObserverInit.prototype.type;\n/** @type {undefined|boolean} */\nPerformanceObserverInit.prototype.buffered;\n\n/**\n * @constructor\n */\nfunction PerformanceObserverEntryList() {}\n\n/** @return {!Array} */\nPerformanceObserverEntryList.prototype.getEntries = function() {};\n/**\n * @param {string} type\n * @return {!Array}\n */\nPerformanceObserverEntryList.prototype.getEntriesByName = function(type) {};\n/**\n * @param {string} name\n * @param {string=} opt_type\n * @return {!Array}\n */\nPerformanceObserverEntryList.prototype.getEntriesByType = function(\n    name, opt_type) {};\n","externs/nonstandard_navigation_timing.js":"/*\n * Copyright 2011 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Nonstandard Definitions for W3C's Navigation Timing\n * specification.\n *\n * @externs\n */\n\n// Nonstandard. Only available in Blink.\n// Returns more granular results with the --enable-memory-info flag.\n/** @type {MemoryInfo} */ Performance.prototype.memory;\n\n/**\n * Clear out the buffer of performance timing events for webkit browsers.\n * @return {undefined}\n */\nPerformance.prototype.webkitClearResourceTimings = function() {};\n\n/**\n * @return {number}\n * @nosideeffects\n */\nPerformance.prototype.webkitNow = function() {};\n","externs/w3c_netinfo.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Externs for the Network Information API.\n * @externs\n */\n\n/**\n * @see http://wicg.github.io/netinfo/#-dfn-networkinformation-dfn-interface\n * @constructor\n */\nfunction NetworkInformation() {}\n\n/** @type {ConnectionType} */\nNetworkInformation.prototype.type;\n\n/** @type {EffectiveConnectionType} */\nNetworkInformation.prototype.effectiveType;\n\n/** @type {Megabit} */\nNetworkInformation.prototype.downlinkMax;\n\n/** @type {Megabit} */\nNetworkInformation.prototype.downlink;\n\n/** @type {Millisecond} */\nNetworkInformation.prototype.rtt;\n\n/** @type {?function(Event)} */\nNetworkInformation.prototype.onchange;\n\n/** @type {boolean} */\nNetworkInformation.prototype.saveData;\n\n/**\n * @typedef {number}\n */\nvar Megabit;\n\n/**\n * @typedef {number}\n */\nvar Millisecond;\n\n/**\n * Enum of:\n * 'bluetooth',\n * 'cellular',\n * 'ethernet',\n * 'mixed',\n * 'none',\n * 'other',\n * 'unknown',\n * 'wifi',\n * 'wimax'\n * @typedef {string}\n */\nvar ConnectionType;\n\n/**\n * Enum of:\n * '2g',\n * '3g',\n * '4g',\n * 'slow-2g'\n * @typedef {string}\n */\nvar EffectiveConnectionType;\n\n/** @type {!NetworkInformation} */\nNavigator.prototype.connection;\n","externs/w3c_payment_request.js":"/*\n * Copyright 2019 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Payment Request API.\n * @see https://w3c.github.io/payment-request/\n *\n * @externs\n */\n\n/**\n * @constructor\n * @param {!Array} methodData\n * @param {!PaymentDetailsInit} details\n * @param {!PaymentOptions=} options\n * @implements {EventTarget}\n * @see https://w3c.github.io/payment-request/#paymentrequest-interface\n */\nfunction PaymentRequest(methodData, details, options) {}\n/**\n * @param {!Promise=} detailsPromise\n * @return {!Promise}\n */\nPaymentRequest.prototype.show = function(detailsPromise) {};\n/** @return {!Promise} */\nPaymentRequest.prototype.abort = function() {};\n/** @return {!Promise} */\nPaymentRequest.prototype.canMakePayment = function() {};\n/** @return {!Promise} */\nPaymentRequest.prototype.hasEnrolledInstrument = function() {};\n/** @const {string} */\nPaymentRequest.prototype.id;\n/** @const {?PaymentAddress} */\nPaymentRequest.prototype.shippingAddress;\n/** @const {?string} */\nPaymentRequest.prototype.shippingOption;\n/** @const {?string} */\nPaymentRequest.prototype.shippingType;\n/** @type {?function(!Event)} */\nPaymentRequest.prototype.onmerchantvalidation;\n/** @type {?function(!Event)} */\nPaymentRequest.prototype.onshippingaddresschange;\n/** @type {?function(!Event)} */\nPaymentRequest.prototype.onshippingoptionchange;\n/** @type {?function(!Event)} */\nPaymentRequest.prototype.onpaymentmethodchange;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentmethoddata-dictionary\n */\nfunction PaymentMethodData() {};\n/** @type {string} */\nPaymentMethodData.prototype.supportedMethods;\n/** @type {!Object|undefined} */\nPaymentMethodData.prototype.data;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentcurrencyamount-dictionary\n */\nfunction PaymentCurrencyAmount() {};\n/** @type {string} */\nPaymentCurrencyAmount.prototype.currency;\n/** @type {string} */\nPaymentCurrencyAmount.prototype.value;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentdetailsbase-dictionary\n */\nfunction PaymentDetailsBase() {};\n/** @type {!Array|undefined} */\nPaymentDetailsBase.prototype.displayItems;\n/** @type {!Array|undefined} */\nPaymentDetailsBase.prototype.shippingOptions;\n/** @type {!Array|undefined} */\nPaymentDetailsBase.prototype.modifiers;\n\n/**\n * @extends {PaymentDetailsBase}\n * @record\n * @see https://w3c.github.io/payment-request/#paymentdetailsinit-dictionary\n */\nfunction PaymentDetailsInit() {};\n/** @type {string|undefined} */\nPaymentDetailsInit.prototype.id;\n/** @type {!PaymentItem} */\nPaymentDetailsInit.prototype.total;\n\n/**\n * @extends {PaymentDetailsBase}\n * @record\n * @see https://w3c.github.io/payment-request/#paymentdetailsupdate-dictionary\n */\nfunction PaymentDetailsUpdate() {};\n/** @type {string|undefined} */\nPaymentDetailsUpdate.prototype.error;\n/** @type {!PaymentItem|undefined} */\nPaymentDetailsUpdate.prototype.total;\n/** @type {!AddressErrors|undefined} */\nPaymentDetailsUpdate.prototype.shippingAddressErrors;\n/** @type {!PayerErrors|undefined} */\nPaymentDetailsUpdate.prototype.payerErrors;\n/** @type {!Object|undefined} */\nPaymentDetailsUpdate.prototype.paymentMethodErrors;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentdetailsmodifier-dictionary\n */\nfunction PaymentDetailsModifier() {};\n/** @type {string} */\nPaymentDetailsModifier.prototype.supportedMethods;\n/** @type {!PaymentItem|undefined} */\nPaymentDetailsModifier.prototype.total;\n/** @type {!Array|undefined} */\nPaymentDetailsModifier.prototype.additionalDisplayItems;\n/** @type {!Object|undefined} */\nPaymentDetailsModifier.prototype.data;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentoptions-dictionary\n */\nfunction PaymentOptions() {};\n/** @type {boolean|undefined} */\nPaymentOptions.prototype.requestPayerName;\n/** @type {boolean|undefined} */\nPaymentOptions.prototype.requestBillingAddress;\n/** @type {boolean|undefined} */\nPaymentOptions.prototype.requestPayerEmail;\n/** @type {boolean|undefined} */\nPaymentOptions.prototype.requestPayerPhone;\n/** @type {boolean|undefined} */\nPaymentOptions.prototype.requestShipping;\n/** @type {string|undefined} */\nPaymentOptions.prototype.shippingType;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentitem-dictionary\n */\nfunction PaymentItem() {};\n/** @type {string} */\nPaymentItem.prototype.label;\n/** @type {!PaymentCurrencyAmount} */\nPaymentItem.prototype.amount;\n/** @type {boolean|undefined} */\nPaymentItem.prototype.pending;\n\n/**\n * @interface\n * @see https://w3c.github.io/payment-request/#paymentaddress-interface\n */\nfunction PaymentAddress() {}\n/**\n * @return {Object}\n * @override\n */\nPaymentAddress.prototype.toJSON = function() {};\n/** @const {string|undefined} */\nPaymentAddress.prototype.city;\n/** @const {string|undefined} */\nPaymentAddress.prototype.country;\n/** @const {string|undefined} */\nPaymentAddress.prototype.dependentLocality;\n/** @const {string|undefined} */\nPaymentAddress.prototype.organization;\n/** @const {string|undefined} */\nPaymentAddress.prototype.phone;\n/** @const {string|undefined} */\nPaymentAddress.prototype.postalCode;\n/** @const {string|undefined} */\nPaymentAddress.prototype.recipient;\n/** @const {string|undefined} */\nPaymentAddress.prototype.region;\n/** @const {string|undefined} */\nPaymentAddress.prototype.sortingCode;\n/** @const {!Array|undefined} */\nPaymentAddress.prototype.addressLine;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#addressinit-dictionary\n */\nfunction AddressInit() {};\n/** @type {string|undefined} */\nAddressInit.prototype.country;\n/** @type {!Array|undefined} */\nAddressInit.prototype.addressLine;\n/** @type {string|undefined} */\nAddressInit.prototype.region;\n/** @type {string|undefined} */\nAddressInit.prototype.city;\n/** @type {string|undefined} */\nAddressInit.prototype.dependentLocality;\n/** @type {string|undefined} */\nAddressInit.prototype.postalCode;\n/** @type {string|undefined} */\nAddressInit.prototype.sortingCode;\n/** @type {string|undefined} */\nAddressInit.prototype.organization;\n/** @type {string|undefined} */\nAddressInit.prototype.recipient;\n/** @type {string|undefined} */\nAddressInit.prototype.phone;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#addresserrors-dictionary\n */\nfunction AddressErrors() {};\n/** @type {string|undefined} */\nAddressErrors.prototype.addressLine;\n/** @type {string|undefined} */\nAddressErrors.prototype.city;\n/** @type {string|undefined} */\nAddressErrors.prototype.country;\n/** @type {string|undefined} */\nAddressErrors.prototype.dependentLocality;\n/** @type {string|undefined} */\nAddressErrors.prototype.organization;\n/** @type {string|undefined} */\nAddressErrors.prototype.phone;\n/** @type {string|undefined} */\nAddressErrors.prototype.postalCode;\n/** @type {string|undefined} */\nAddressErrors.prototype.recipient;\n/** @type {string|undefined} */\nAddressErrors.prototype.region;\n/** @type {string|undefined} */\nAddressErrors.prototype.sortingCode;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentshippingoption-dictionary\n */\nfunction PaymentShippingOption() {};\n/** @type {string} */\nPaymentShippingOption.prototype.id;\n/** @type {string} */\nPaymentShippingOption.prototype.label;\n/** @type {!PaymentCurrencyAmount} */\nPaymentShippingOption.prototype.amount;\n/** @type {boolean|undefined} */\nPaymentShippingOption.prototype.selected;\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @see https://w3c.github.io/payment-request/#paymentresponse-interface\n */\nfunction PaymentResponse() {}\n/**\n * @return {!Object}\n * @override\n */\nPaymentResponse.prototype.toJSON = function() {};\n/** @const {string} */\nPaymentResponse.prototype.requestId;\n/** @const {string} */\nPaymentResponse.prototype.methodName;\n/** @const {!Object} */\nPaymentResponse.prototype.details;\n/** @const {?PaymentAddress} */\nPaymentResponse.prototype.shippingAddress;\n/** @const {?string} */\nPaymentResponse.prototype.shippingOption;\n/** @const {?string} */\nPaymentResponse.prototype.payerName;\n/** @const {?string} */\nPaymentResponse.prototype.payerEmail;\n/** @const {?string} */\nPaymentResponse.prototype.payerPhone;\n/**\n * @param {string=} result\n * @return {!Promise}\n */\nPaymentResponse.prototype.complete = function(result) {};\n/**\n * @param {!PaymentValidationErrors=} errorFields\n * @return {!Promise}\n */\nPaymentResponse.prototype.retry = function(errorFields) {};\n/** @type {?function(!Event)} */\nPaymentResponse.prototype.onpayerdetailchange;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#paymentvalidationerrors-dictionary\n */\nfunction PaymentValidationErrors() {};\n/** @type {!PayerErrors|undefined} */\nPaymentValidationErrors.prototype.payer;\n/** @type {!AddressErrors|undefined} */\nPaymentValidationErrors.prototype.shippingAddress;\n/** @type {string|undefined} */\nPaymentValidationErrors.prototype.error;\n/** @type {!Object|undefined} */\nPaymentValidationErrors.prototype.paymentMethod;\n\n/**\n * @record\n * @see https://w3c.github.io/payment-request/#payererrors-dictionary\n */\nfunction PayerErrors() {};\n/** @type {string|undefined} */\nPayerErrors.prototype.email;\n/** @type {string|undefined} */\nPayerErrors.prototype.name;\n/** @type {string|undefined} */\nPayerErrors.prototype.phone;\n\n/**\n * @constructor\n * @param {string} type\n * @param {!MerchantValidationEventInit=} eventInitDict\n * @extends {Event}\n * @see https://w3c.github.io/payment-request/#merchantvalidationevent-interface\n */\nfunction MerchantValidationEvent(type, eventInitDict) {};\n/** @const {string} */\nMerchantValidationEvent.prototype.methodName;\n/** @const {string} */\nMerchantValidationEvent.prototype.validationURL;\n/**\n * @param {!Promise} merchantSessionPromise\n * @return {undefined}\n */\nMerchantValidationEvent.prototype.complete = function(\n    merchantSessionPromise) {};\n\n/**\n * @extends {EventInit}\n * @record\n * @see https://w3c.github.io/payment-request/#merchantvalidationeventinit-dictionary\n */\nfunction MerchantValidationEventInit() {};\n/** @type {string|undefined} */\nMerchantValidationEventInit.prototype.methodName;\n/** @type {string|undefined} */\nMerchantValidationEventInit.prototype.validationURL;\n\n/**\n * @constructor\n * @param {string} type\n * @param {!PaymentMethodChangeEventInit=} eventInitDict\n * @extends {PaymentRequestUpdateEvent}\n * @see https://w3c.github.io/payment-request/#paymentmethodchangeevent-interface\n */\nfunction PaymentMethodChangeEvent(type, eventInitDict) {};\n/** @const {string} */\nPaymentMethodChangeEvent.prototype.methodName;\n/** @const {?Object} */\nPaymentMethodChangeEvent.prototype.methodDetails;\n\n/**\n * @extends {PaymentRequestUpdateEventInit}\n * @record\n * @see https://w3c.github.io/payment-request/#paymentmethodchangeeventinit-dictionary\n */\nfunction PaymentMethodChangeEventInit() {};\n/** @type {string|undefined} */\nPaymentMethodChangeEventInit.prototype.methodName;\n/** @type {?Object|undefined} */\nPaymentMethodChangeEventInit.prototype.methodDetails;\n\n/**\n * @constructor\n * @param {string} type\n * @param {!PaymentRequestUpdateEventInit=} eventInitDict\n * @extends {Event}\n * @see https://w3c.github.io/payment-request/#paymentrequestupdateevent-interface\n */\nfunction PaymentRequestUpdateEvent(type, eventInitDict) {};\n/**\n * @param {!Promise} detailsPromise\n * @return {undefined}\n */\nPaymentRequestUpdateEvent.prototype.updateWith = function(detailsPromise) {};\n\n/**\n * @extends {EventInit}\n * @record\n * @see https://w3c.github.io/payment-request/#paymentrequestupdateeventinit-dictionary\n */\nfunction PaymentRequestUpdateEventInit() {};\n","externs/w3c_permissions.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Permissions API.\n * @see https://w3c.github.io/permissions/\n *\n * @externs\n */\n\n\n/**\n * @typedef {{name: PermissionName}}\n * @see https://w3c.github.io/permissions/#permission-descriptor\n */\nvar PermissionDescriptor;\n\n\n/**\n * @typedef {{name: PermissionName, userVisibleOnly: boolean}}\n * @see https://w3c.github.io/permissions/#push\n */\nvar PushPermissionDescriptor;\n\n\n/**\n * @typedef {{name: PermissionName, sysex: boolean}}\n * @see https://w3c.github.io/permissions/#midi\n */\nvar MidiPermissionDescriptor;\n\n\n/**\n * Set of possible values: 'geolocation', 'notifications', 'push', 'midi'.\n * @typedef {string}\n * @see https://w3c.github.io/permissions/#idl-def-PermissionName\n */\nvar PermissionName;\n\n\n/**\n * Set of possible values: 'granted', 'denied', 'prompt'.\n * @typedef {string}\n * @see https://w3c.github.io/permissions/#idl-def-PermissionState\n */\nvar PermissionState;\n\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @see https://w3c.github.io/permissions/#status-of-a-permission\n */\nfunction PermissionStatus() {}\n\n/** @type {PermissionState} */\nPermissionStatus.prototype.state;\n\n/**\n * @type {PermissionState}\n * @deprecated, use PermissionStatus.state for newer clients\n */\nPermissionStatus.prototype.status;\n\n/** @type {?function(!Event)} */\nPermissionStatus.prototype.onchange;\n\n/** @override */\nPermissionStatus.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nPermissionStatus.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nPermissionStatus.prototype.dispatchEvent = function(evt) {};\n\n\n/**\n * @constructor\n * @see https://w3c.github.io/permissions/#idl-def-permissions\n */\nfunction Permissions() {}\n\n/**\n * @param {PermissionDescriptor} permission The permission to look up\n * @return {!Promise}\n * @see https://w3c.github.io/permissions/#dom-permissions-query\n */\nPermissions.prototype.query = function(permission) {};\n\n\n/** @type {Permissions} */\nNavigator.prototype.permissions;\n","externs/w3c_pointerlock.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Pointer Lock API.\n * @see https://w3c.github.io/pointerlock/\n *\n * @externs\n */\n\n/**\n * TODO(bradfordcsmith): update the link when PR is merged\n * @see https://github.com/w3c/pointerlock/pull/49/\n * @record\n */\nfunction PointerLockOptions() {}\n\n/** @type {undefined|boolean} */\nPointerLockOptions.prototype.unadjustedMovement;\n\n/**\n * @see https://w3c.github.io/pointerlock/#widl-Element-requestPointerLock-void\n * @param {!PointerLockOptions=} options\n * @return {void|!Promise}\n */\nElement.prototype.requestPointerLock = function(options) {};\n\n/**\n * @see https://w3c.github.io/pointerlock/#widl-Document-pointerLockElement\n * @type {?Element}\n */\nDocument.prototype.pointerLockElement;\n\n/**\n * @see https://w3c.github.io/pointerlock/#widl-Document-exitPointerLock-void\n * @return {void}\n */\nDocument.prototype.exitPointerLock = function() {};\n\n/**\n * @see https://w3c.github.io/pointerlock/#widl-MouseEvent-movementX\n * @type {number}\n */\nMouseEvent.prototype.movementX;\n\n/**\n * @see https://w3c.github.io/pointerlock/#widl-MouseEvent-movementY\n * @type {number}\n */\nMouseEvent.prototype.movementY;\n","externs/w3c_range.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's range specification.\n *  This file depends on w3c_dom2.js.\n *  The whole file has been fully type annotated.\n *  Created from\n *   http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html\n *\n * @externs\n * @author [email protected] (Steve Yegge)\n */\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Interface\n */\nfunction Range() {}\n\n// constants on the constructor\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.START_TO_START;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.START_TO_END;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.END_TO_END;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.END_TO_START;\n\n// constants repeated on the prototype\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.prototype.START_TO_START;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.prototype.START_TO_END;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.prototype.END_TO_END;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-compareHow\n */\nRange.prototype.END_TO_START;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-attr-startParent\n */\nRange.prototype.startContainer;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-attr-startOffset\n */\nRange.prototype.startOffset;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-attr-endParent\n */\nRange.prototype.endContainer;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-attr-endOffset\n */\nRange.prototype.endOffset;\n\n/**\n * @type {boolean}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-attr-collapsed\n */\nRange.prototype.collapsed;\n\n/**\n * @type {Node}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-attr-commonParent\n */\nRange.prototype.commonAncestorContainer;\n\n/**\n * @param {Node} refNode\n * @param {number} offset\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-setStart\n */\nRange.prototype.setStart = function(refNode, offset) {};\n\n/**\n * @param {Node} refNode\n * @param {number} offset\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-setEnd\n */\nRange.prototype.setEnd = function(refNode, offset) {};\n\n/**\n * @param {Node} refNode\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-setStartBefore\n */\nRange.prototype.setStartBefore = function(refNode) {};\n\n/**\n * @param {Node} refNode\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-setStartAfter\n */\nRange.prototype.setStartAfter = function(refNode) {};\n\n/**\n * @param {Node} refNode\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-setEndBefore\n */\nRange.prototype.setEndBefore = function(refNode) {};\n\n/**\n * @param {Node} refNode\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-setEndAfter\n */\nRange.prototype.setEndAfter = function(refNode) {};\n\n/**\n * @param {boolean} toStart\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-collapse\n */\nRange.prototype.collapse = function(toStart) {};\n\n/**\n * @param {Node} refNode\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-selectNode\n */\nRange.prototype.selectNode = function(refNode) {};\n\n/**\n * @param {Node} refNode\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-selectNodeContents\n */\nRange.prototype.selectNodeContents = function(refNode) {};\n\n/**\n * @param {number} how\n * @param {Range} sourceRange\n * @return {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-compareBoundaryPoints\n */\nRange.prototype.compareBoundaryPoints = function(how, sourceRange) {};\n\n/**\n * @return {number}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-deleteContents\n */\nRange.prototype.deleteContents = function() {};\n\n/**\n * @return {DocumentFragment}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-extractContents\n */\nRange.prototype.extractContents = function() {};\n\n/**\n * @return {DocumentFragment}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-cloneContents\n */\nRange.prototype.cloneContents = function() {};\n\n/**\n * @param {Node} newNode\n * @return {DocumentFragment}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-insertNode\n */\nRange.prototype.insertNode = function(newNode) {};\n\n/**\n * @param {Node} newParent\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-surroundContents\n */\nRange.prototype.surroundContents = function(newParent) {};\n\n/**\n * @return {Range}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-clone\n */\nRange.prototype.cloneRange = function() {};\n\n/**\n * @return {undefined}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-Range-method-detach\n */\nRange.prototype.detach = function() {};\n\n// Introduced in DOM Level 2:\n/**\n * @interface\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-DocumentRange-idl\n */\nfunction DocumentRange() {}\n\n/**\n * @return {Range}\n * @see http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level2-DocumentRange-method-createRange\n */\nDocumentRange.prototype.createRange = function() {};\n","externs/w3c_referrer_policy.js":"/*\n * Copyright 2018 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's referrer policy specification.\n * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-delivery\n * @externs\n */\n\n/** @type {string} */\nHTMLAnchorElement.prototype.referrerPolicy;\n\n/** @type {string} */\nHTMLAreaElement.prototype.referrerPolicy;\n\n/** @type {string} */\nHTMLImageElement.prototype.referrerPolicy;\n\n/** @type {string} */\nHTMLIFrameElement.prototype.referrerPolicy;\n\n/** @type {string} */\nHTMLLinkElement.prototype.referrerPolicy;\n","externs/w3c_requestidlecallback.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for cooperative scheduling of background tasks in\n * the browser. This spec is still very likely to change.\n *\n * @see https://w3c.github.io/requestidlecallback/\n * @see https://developers.google.com/web/updates/2015/08/27/using-requestidlecallback?hl=en\n * @externs\n */\n\n\n/**\n * @typedef {{\n *   timeout: (number|undefined)\n * }}\n */\nvar IdleCallbackOptions;\n\n\n/**\n * Schedules a callback to run when the browser is idle.\n * @param {function(!IdleDeadline): void} callback Called when the browser is idle.\n * @param {number|IdleCallbackOptions=} opt_options If set, gives the browser a time in ms by which\n *     it must execute the callback. No timeout enforced otherwise.\n * @return {number} A handle that can be used to cancel the scheduled callback.\n */\nfunction requestIdleCallback(callback, opt_options) {}\n\n\n/**\n * Cancels a callback scheduled to run when the browser is idle.\n * @param {number} handle The handle returned by `requestIdleCallback` for\n *     the scheduled callback to cancel.\n * @return {undefined}\n */\nfunction cancelIdleCallback(handle) {}\n\n\n\n/**\n * An interface for an object passed into the callback for\n * `requestIdleCallback` that remains up-to-date on the amount of idle\n * time left in the current time slice.\n * @interface\n */\nfunction IdleDeadline() {}\n\n\n/**\n * @return {number} The amount of idle time (milliseconds) remaining in the\n *     current time slice. Will always be positive or 0.\n */\nIdleDeadline.prototype.timeRemaining = function() {};\n\n\n/**\n * Whether the callback was forced to run due to a timeout. Specifically,\n * whether the callback was invoked by the idle callback timeout algorithm:\n * https://w3c.github.io/requestidlecallback/#dfn-invoke-idle-callback-timeout-algorithm\n * @type {boolean}\n */\nIdleDeadline.prototype.didTimeout;\n","externs/w3c_rtc.js":"/*\n * Copyright 2012 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for components of the WebRTC browser API.\n * @see https://www.w3.org/TR/webrtc/\n * @see https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-19\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API\n * @see https://www.w3.org/TR/mediacapture-streams/\n *\n * @externs\n * @author [email protected] (Benjamin M. Schwartz)\n */\n\n/**\n * @typedef {string}\n * @see {https://www.w3.org/TR/mediacapture-streams/\n *     #idl-def-MediaStreamTrackState}\n * In WebIDL this is an enum with values 'live', 'mute', and 'ended',\n * but there is no mechanism in Closure for describing a specialization of\n * the string type.\n */\nvar MediaStreamTrackState;\n\n/**\n * @interface\n */\nfunction SourceInfo() {}\n\n/** @const {string} */\nSourceInfo.prototype.kind;\n\n/** @const {string} */\nSourceInfo.prototype.id;\n\n/** @const {?string} */\nSourceInfo.prototype.label;\n\n/** @const {boolean} */\nSourceInfo.prototype.facing;\n\n/**\n * @interface\n * @see https://w3c.github.io/mediacapture-image/#mediasettingsrange-section\n */\nfunction MediaSettingsRange() {}\n\n/**\n * @const {number}\n */\nMediaSettingsRange.prototype.max;\n\n/**\n * @const {number}\n */\nMediaSettingsRange.prototype.min;\n\n/**\n * @const {number}\n */\nMediaSettingsRange.prototype.step;\n\n/**\n * @interface\n * @see https://www.w3.org/TR/mediacapture-streams/#idl-def-MediaTrackCapabilities\n * @see https://w3c.github.io/mediacapture-image/#mediatrackcapabilities-section\n */\nfunction MediaTrackCapabilities() {}\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.width;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.height;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.aspectRatio;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.frameRate;\n\n/** @type {!Array} */\nMediaTrackCapabilities.prototype.facingMode;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.volume;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.sampleRate;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.sampleSize;\n\n/** @type {!Array} */\nMediaTrackCapabilities.prototype.echoCancellation;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.latency;\n\n/** @type {number} */\nMediaTrackCapabilities.prototype.channelCount;\n\n/** @type {string} */\nMediaTrackCapabilities.prototype.deviceId;\n\n/** @type {string} */\nMediaTrackCapabilities.prototype.groupId;\n\n/** @type {!Array} */\nMediaTrackCapabilities.prototype.whiteBalanceMode;\n\n/** @type {!Array} */\nMediaTrackCapabilities.prototype.exposureMode;\n\n/** @type {!Array} */\nMediaTrackCapabilities.prototype.focusMode;\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.exposureCompensation;\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.colorTemperature\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.iso\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.brightness\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.contrast\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.saturation\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.sharpness\n\n/** @type {!MediaSettingsRange} */\nMediaTrackCapabilities.prototype.zoom\n\n/** @type {boolean} */\nMediaTrackCapabilities.prototype.torch\n\n/**\n * @interface\n * @see https://www.w3.org/TR/mediacapture-streams/#media-track-settings\n * @see https://w3c.github.io/mediacapture-image/#mediatracksettings-section\n */\nfunction MediaTrackSettings() {}\n\n/** @type {number} */\nMediaTrackSettings.prototype.width;\n\n/** @type {number} */\nMediaTrackSettings.prototype.height;\n\n/** @type {number} */\nMediaTrackSettings.prototype.aspectRatio;\n\n/** @type {number} */\nMediaTrackSettings.prototype.frameRate;\n\n/** @type {string} */\nMediaTrackSettings.prototype.facingMode;\n\n/** @type {number} */\nMediaTrackSettings.prototype.volume;\n\n/** @type {number} */\nMediaTrackSettings.prototype.sampleRate;\n\n/** @type {number} */\nMediaTrackSettings.prototype.sampleSize;\n\n/** @type {boolean} */\nMediaTrackSettings.prototype.echoCancellation;\n\n/** @type {number} */\nMediaTrackSettings.prototype.latency;\n\n/** @type {number} */\nMediaTrackSettings.prototype.channelCount;\n\n/** @type {string} */\nMediaTrackSettings.prototype.deviceId;\n\n/** @type {string} */\nMediaTrackSettings.prototype.groupId;\n\n/** @type {string} */\nMediaTrackSettings.prototype.whiteBalanceMode;\n\n/** @type {string} */\nMediaTrackSettings.prototype.exposureMode;\n\n/** @type {string} */\nMediaTrackSettings.prototype.focusMode;\n\n/** @type {!Array<{x: number, y: number}>} */\nMediaTrackSettings.prototype.pointsOfInterest;\n\n/** @type {number} */\nMediaTrackSettings.prototype.exposureCompensation;\n\n/** @type {number} */\nMediaTrackSettings.prototype.colorTemperature\n\n/** @type {number} */\nMediaTrackSettings.prototype.iso\n\n/** @type {number} */\nMediaTrackSettings.prototype.brightness\n\n/** @type {number} */\nMediaTrackSettings.prototype.contrast\n\n/** @type {number} */\nMediaTrackSettings.prototype.saturation\n\n/** @type {number} */\nMediaTrackSettings.prototype.sharpness\n\n/** @type {number} */\nMediaTrackSettings.prototype.zoom\n\n/** @type {boolean} */\nMediaTrackSettings.prototype.torch\n\n\n/**\n * @interface\n * @see https://w3c.github.io/mediacapture-main/#media-track-supported-constraints\n */\nfunction MediaTrackSupportedConstraints() {}\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.width;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.height;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.aspectRatio;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.frameRate;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.facingMode;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.volume;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.sampleRate;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.sampleSize;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.echoCancellation;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.autoGainControl;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.noiseSuppression;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.latency;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.channelCount;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.deviceId;\n\n/** @type {boolean|undefined} */\nMediaTrackSupportedConstraints.prototype.groupId;\n\n\n/**\n * @interface\n * @extends {EventTarget}\n * @see https://www.w3.org/TR/mediacapture-streams/#mediastreamtrack\n */\nfunction MediaStreamTrack() {}\n\n/**\n * @const {string}\n */\nMediaStreamTrack.prototype.kind;\n\n/**\n * @const {string}\n */\nMediaStreamTrack.prototype.id;\n\n/**\n * @const {string}\n */\nMediaStreamTrack.prototype.label;\n\n/**\n * @type {boolean}\n */\nMediaStreamTrack.prototype.enabled;\n\n/**\n * @const {boolean}\n */\nMediaStreamTrack.prototype.muted;\n\n/**\n * @type {string}\n * @see https://crbug.com/653531\n * @see https://wicg.github.io/mst-content-hint/\n */\nMediaStreamTrack.prototype.contentHint;\n\n/**\n * @const {boolean}\n */\nMediaStreamTrack.prototype.remote;\n\n/**\n * @type {MediaStreamTrackState}\n * Read only.\n */\nMediaStreamTrack.prototype.readyState;\n\n/**\n * @type {?function(!Event)}\n */\nMediaStreamTrack.prototype.onmute;\n\n/**\n * @type {?function(!Event)}\n */\nMediaStreamTrack.prototype.onunmute;\n\n/**\n * @type {?function(!Event)}\n */\nMediaStreamTrack.prototype.onended;\n\n/**\n * @type {?function(!Event)}\n */\nMediaStreamTrack.prototype.onoverconstrained;\n\n/**\n * Applies the specified set of constraints to the track, if any specified; or\n * if no constraints are specified, removes all constraints from the track.\n *\n * @param {MediaTrackConstraints=} constraints Constraints to apply to the\n *   track.\n * @return {!Promise} A |Promise| that is resolved when the constraints\n *   have been applied, or rejected if there was an error applying the\n *   constraints.\n */\nMediaStreamTrack.prototype.applyConstraints = function(constraints) {};\n\n/**\n * @return {!MediaStreamTrack}\n */\nMediaStreamTrack.prototype.clone = function() {};\n\n/** @return {void} */\nMediaStreamTrack.prototype.stop = function() {};\n\n/** @return {!MediaTrackCapabilities} */\nMediaStreamTrack.prototype.getCapabilities = function() {};\n\n/** @return {!MediaTrackConstraints} */\nMediaStreamTrack.prototype.getConstraints = function() {};\n\n/** @return {!MediaTrackSettings} */\nMediaStreamTrack.prototype.getSettings = function() {};\n\n/**\n * @typedef {{track: MediaStreamTrack}}\n */\nvar MediaStreamTrackEventInit;\n\n\n/**\n * @param {string} type\n * @param {!MediaStreamTrackEventInit} eventInitDict\n * @constructor\n * @extends {Event}\n * @see https://www.w3.org/TR/mediacapture-streams/#mediastreamtrackevent\n */\nfunction MediaStreamTrackEvent(type, eventInitDict) {}\n\n/**\n * @const {!MediaStreamTrack}\n */\nMediaStreamTrackEvent.prototype.track;\n\n/**\n * @param {!MediaStream|!Array=} streamOrTracks\n * @constructor\n * @implements {EventTarget}\n * @see https://www.w3.org/TR/mediacapture-streams/#mediastream\n */\nfunction MediaStream(streamOrTracks) {}\n\n/**\n * @override\n */\nMediaStream.prototype.addEventListener = function(type, listener,\n    opt_useCapture) {};\n\n/**\n * @override\n */\nMediaStream.prototype.removeEventListener = function(type, listener,\n    opt_useCapture) {};\n\n/**\n * @override\n * @return {boolean}\n */\nMediaStream.prototype.dispatchEvent = function(evt) {};\n\n/**\n * TODO(bemasc): Remove this property.\n * @deprecated\n * @const {string}\n */\nMediaStream.prototype.label;\n\n/**\n * @const {string}\n */\nMediaStream.prototype.id;\n\n/**\n * @return {!Array}\n */\nMediaStream.prototype.getAudioTracks = function() {};\n\n/**\n * @return {!Array}\n */\nMediaStream.prototype.getVideoTracks = function() {};\n\n/**\n * @return {!Array}\n */\nMediaStream.prototype.getTracks = function() {};\n\n/**\n * @param {string} trackId\n * @return {MediaStreamTrack}\n */\nMediaStream.prototype.getTrackById = function(trackId) {};\n\n/**\n * @param {!MediaStreamTrack} track\n * @return {undefined}\n */\nMediaStream.prototype.addTrack = function(track) {};\n\n/**\n * @param {!MediaStreamTrack} track\n * @return {undefined}\n */\nMediaStream.prototype.removeTrack = function(track) {};\n\n/**\n * @return {!MediaStream}\n */\nMediaStream.prototype.clone = function() {};\n\n/**\n * @deprecated\n * @type {boolean}\n */\nMediaStream.prototype.ended;\n\n/**\n * @deprecated\n * @type {?function(!Event)}\n */\nMediaStream.prototype.onended;\n\n/**\n * @type {boolean}\n */\nMediaStream.prototype.active;\n\n/**\n * @type {?function(!Event)}\n */\nMediaStream.prototype.onactive;\n\n/**\n * @type {?function(!Event)}\n */\nMediaStream.prototype.oninactive;\n\n/**\n * @type {?function(!MediaStreamTrackEvent)}\n */\nMediaStream.prototype.onaddtrack;\n\n/**\n * @type {?function(!MediaStreamTrackEvent)}\n */\nMediaStream.prototype.onremovetrack;\n\n/**\n * @deprecated\n * TODO(bemasc): Remove this method once browsers have updated to\n * MediaStreamTrack.stop().\n * @return {undefined}\n */\nMediaStream.prototype.stop = function() {};\n\n/**\n * @typedef {{tone: string}}\n * @see https://www.w3.org/TR/webrtc/#dom-rtcdtmftonechangeeventinit\n */\nvar RTCDTMFToneChangeEventInit;\n\n\n/**\n * @param {string} type\n * @param {!RTCDTMFToneChangeEventInit} eventInitDict\n * @constructor\n * @extends {Event}\n * @see https://www.w3.org/TR/webrtc/#dom-rtcdtmftonechangeevent\n */\nfunction RTCDTMFToneChangeEvent(type, eventInitDict) {}\n\n/**\n * @const {string}\n */\nRTCDTMFToneChangeEvent.prototype.tone;\n\n\n/**\n * @interface\n * @see https://www.w3.org/TR/webrtc/#rtcdtmfsender\n */\nfunction RTCDTMFSender() {}\n\n/**\n * @param {string} tones\n * @param {number=} opt_duration\n * @param {number=} opt_interToneGap\n */\nRTCDTMFSender.prototype.insertDTMF =\n    function(tones, opt_duration, opt_interToneGap) {};\n\n/**\n * @type {?boolean}\n */\nRTCDTMFSender.prototype.canInsertDTMF;\n\n/**\n * @type {?function(!RTCDTMFToneChangeEvent)}\n */\nRTCDTMFSender.prototype.ontonechange;\n\n/**\n * @const {string}\n */\nRTCDTMFSender.prototype.toneBuffer;\n\n\n/**\n * @typedef {{\n *   mimeType: string,\n *   clockRate: number,\n *   channels: (number|undefined),\n *   sdpFmtpLine: (string|undefined),\n * }}\n *\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpcodeccapability\n */\nvar RTCRtpCodecCapability;\n\n\n/**\n * @typedef {{\n *   uri: string,\n * }}\n *\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpheaderextensioncapability\n */\nvar RTCRtpHeaderExtensionCapability;\n\n\n/**\n * @typedef {{\n *   codecs: !Array,\n *   headerExtensions: !Array,\n * }}\n *\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpcapabilities\n */\nvar RTCRtpCapabilities;\n\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/webrtc/#rtcrtpsender-interface\n */\nfunction RTCRtpSender() {}\n\n/**\n * @const {!RTCDTMFSender}\n */\nRTCRtpSender.prototype.dtmf;\n\n/**\n * @const {!MediaStreamTrack}\n */\nRTCRtpSender.prototype.track;\n\n/**\n * @param {?MediaStreamTrack} track\n * @return {!Promise}\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpsender\n */\nRTCRtpSender.prototype.replaceTrack = function(track) {};\n\n\n/**\n * @return {!RTCRtpSendParameters}\n */\nRTCRtpSender.prototype.getParameters = function() {};\n\n\n/**\n * @param {!RTCRtpSendParameters} params\n * @return {!Promise}\n */\nRTCRtpSender.prototype.setParameters = function(params) {};\n\n\n/**\n * @return {!Promise}\n */\nRTCRtpSender.prototype.getStats = function() {};\n\n/**\n * @param {string} kind\n * @return {?RTCRtpCapabilities}\n */\nRTCRtpSender.getCapabilities = function(kind) {};\n\n\n/**\n * @record\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpsendparameters\n */\nfunction RTCRtpSendParameters() {}\n\n/**\n * @type {string|undefined}\n */\nRTCRtpSendParameters.prototype.transactionId;\n\n/**\n * @type {!Array}\n */\nRTCRtpSendParameters.prototype.encodings;\n\n/**\n * Possible string values are \"maintain-framerate\", \"maintain-resolution\", and\n * \"balanced\".\n * @type {string|undefined}\n */\nRTCRtpSendParameters.prototype.degradationPreference;\n\n\n/**\n * @interface\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpcontributingsource\n */\nfunction RTCRtpContributingSource() {}\n\n/**\n * @type {?number}\n */\nRTCRtpContributingSource.prototype.source;\n\n/**\n * @type {?Date|number}\n */\nRTCRtpContributingSource.prototype.timestamp;\n\n/**\n * @type {number|undefined}\n */\nRTCRtpContributingSource.prototype.audioLevel;\n\n/**\n * This is a relatively new field and browsers may not yet be compliant to the\n * spec.\n * @type {?number}\n * @see https://w3c.github.io/webrtc-pc/#dom-rtcrtpcontributingsource-rtptimestamp\n */\nRTCRtpContributingSource.prototype.rtpTimestamp;\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/webrtc/#rtcrtpreceiver-interface\n */\nfunction RTCRtpReceiver() {}\n\n/**\n * @const {!MediaStreamTrack}\n */\nRTCRtpReceiver.prototype.track;\n\n/**\n * @return {!Array}\n */\nRTCRtpReceiver.prototype.getContributingSources = function() {};\n\n/**\n * @return {!Array}\n */\nRTCRtpReceiver.prototype.getSynchronizationSources = function() {};\n\n\n/**\n * @return {!Promise}\n */\nRTCRtpReceiver.prototype.getStats = function() {};\n\n/**\n * Deprecated, the remnant from Chrome Origin Trial experiment:\n * https://developers.chrome.com/origintrials/#/view_trial/1463669878895411201\n * It was embedded into Chrome M79 permamently under name\n * |playoutDelayHint|. We keep it for now for consistency with Chrome\n * clients below M79. Once Origin Trial expires on 4th December 2019, it can\n * be safely removed. TODO(b/144272224) clean it up.\n * @see https://github.com/henbos/webrtc-timing/issues/1\n * @type {?number|undefined}\n */\nRTCRtpReceiver.prototype.jitterBufferDelayHint;\n\n/**\n * Chrome exclusive hint to control jitter buffer delay. Measured in seconds.\n * @see https://henbos.github.io/webrtc-extensions/#dfn-playoutdelayhint\n * @type {?number|undefined}\n */\nRTCRtpReceiver.prototype.playoutDelayHint;\n\n/**\n * Get most optimistic view of the capabilities of the system for sending media\n * of the given kind.\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpreceiver-getcapabilities\n * @param {!string} kind Media kind: 'video' or 'audio'.\n * @return {!RTCRtpCapabilities}\n */\nRTCRtpReceiver.getCapabilities = function(kind) {};\n\n/**\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtptransceiverinit\n * @record\n */\nfunction RTCRtpTransceiverInit() {}\n\n/**\n * The direction of the `RTCRtpTransceiver`. Defaults to \"sendrecv\".\n * @type {?RTCRtpTransceiverDirection|undefined}\n */\nRTCRtpTransceiverInit.prototype.direction;\n\n/**\n * The streams to add to the tranceiver's sender.\n * @type {?Array|undefined}\n */\nRTCRtpTransceiverInit.prototype.streams;\n\n/**\n * @type {?Array|undefined}\n */\nRTCRtpTransceiverInit.prototype.sendEncodings;\n\n/**\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtpencodingparameters\n * @record\n */\nfunction RTCRtpEncodingParameters() {}\n\n/**\n * @type {?number|undefined}\n */\nRTCRtpEncodingParameters.prototype.codecPayloadType;\n\n/**\n * Possible values are \"disabled\" and \"enabled\".\n * @type {?string|undefined}\n */\nRTCRtpEncodingParameters.prototype.dtx;\n\n/**\n * @type {?boolean|undefined}\n */\nRTCRtpEncodingParameters.prototype.active;\n\n/**\n * Possible values are \"very-low\", \"low\" (default), \"medium\", and \"high\".\n * @type {?string|undefined}\n */\nRTCRtpEncodingParameters.prototype.priority;\n\n/**\n * Possible values are \"very-low\", \"low\" (default), \"medium\", and \"high\".\n * @see https://w3c.github.io/webrtc-dscp-exp/\n * @type {?string|undefined}\n */\nRTCRtpEncodingParameters.prototype.networkPriority;\n\n/**\n * @type {?number|undefined}\n */\nRTCRtpEncodingParameters.prototype.ptime;\n\n/**\n * @type {?number|undefined}\n */\nRTCRtpEncodingParameters.prototype.maxBitrate;\n\n/**\n * @type {?number|undefined}\n */\nRTCRtpEncodingParameters.prototype.maxFramerate;\n\n/**\n * @type {?string|number}\n */\nRTCRtpEncodingParameters.prototype.rid;\n\n/**\n * @type {?number|number}\n */\nRTCRtpEncodingParameters.prototype.scaleResolutionDownBy;\n\n/**\n * @interface\n * @see https://www.w3.org/TR/webrtc/#rtcrtptransceiver-interface\n */\nfunction RTCRtpTransceiver() {}\n\n/**\n * @const {?string}\n */\nRTCRtpTransceiver.prototype.mid;\n\n/**\n * @const {boolean}\n */\nRTCRtpTransceiver.prototype.stopped;\n\n/**\n * @type {!RTCRtpTransceiverDirection}\n */\nRTCRtpTransceiver.prototype.direction;\n\n/**\n * @const {?RTCRtpTransceiverDirection}\n */\nRTCRtpTransceiver.prototype.currentDirection;\n\n/**\n * @param {!RTCRtpTransceiverDirection} direction\n */\nRTCRtpTransceiver.prototype.setDirection = function(direction) {};\n\n/**\n */\nRTCRtpTransceiver.prototype.stop = function() {};\n\n/**\n * @const {?RTCRtpSender}\n */\nRTCRtpTransceiver.prototype.sender;\n\n/**\n * @const {?RTCRtpReceiver}\n */\nRTCRtpTransceiver.prototype.receiver;\n\n/**\n * @param {!Array} codecs\n */\nRTCRtpTransceiver.prototype.setCodecPreferences = function(codecs) {};\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-longrange\n * @record\n */\nfunction LongRange() {}\n\n/**\n * @type {number|undefined}\n */\nLongRange.prototype.max;\n\n/**\n * @type {number|undefined}\n */\nLongRange.prototype.min;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-doublerange\n * @record\n */\nfunction DoubleRange() {}\n\n/**\n * @type {number|undefined}\n */\nDoubleRange.prototype.max;\n\n/**\n * @type {number|undefined}\n */\nDoubleRange.prototype.min;\n\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constrainbooleanparameters\n * @record\n */\nfunction ConstrainBooleanParameters() {}\n\n/**\n * @type {boolean|undefined}\n */\nConstrainBooleanParameters.prototype.exact;\n\n/**\n * @type {boolean|undefined}\n */\nConstrainBooleanParameters.prototype.ideal;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constraindomstringparameters\n * @record\n */\nfunction ConstrainDOMStringParameters() {}\n\n/**\n * @type {string|Array|undefined}\n */\nConstrainDOMStringParameters.prototype.exact;\n\n/**\n * @type {string|Array|undefined}\n */\nConstrainDOMStringParameters.prototype.ideal;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constraindoublerange\n * @record\n * @extends {DoubleRange}\n */\nfunction ConstrainDoubleRange() {}\n\n/**\n * @type {number|undefined}\n */\nConstrainDoubleRange.prototype.exact;\n\n/**\n * @type {number|undefined}\n */\nConstrainDoubleRange.prototype.ideal;\n\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constrainlongrange\n * @record\n * @extends {LongRange}\n */\nfunction ConstrainLongRange() {}\n\n/**\n * @type {number|undefined}\n */\nConstrainLongRange.prototype.exact;\n\n/**\n * @type {number|undefined}\n */\nConstrainLongRange.prototype.ideal;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constrainboolean\n * @typedef {boolean|ConstrainBooleanParameters}\n */\nvar ConstrainBoolean;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constraindomString\n * @typedef {string|Array|ConstrainDOMStringParameters}\n */\nvar ConstrainDOMString;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constraindouble\n * @typedef {number|ConstrainDoubleRange}\n */\nvar ConstrainDouble;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-constrainlong\n * @typedef {number|ConstrainLongRange}\n */\nvar ConstrainLong;\n\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#dom-mediatrackconstraintset\n * @record\n * @private\n */\nfunction MediaTrackConstraintSet() {}\n\n/**\n * @type {ConstrainBoolean|undefined}\n */\nMediaTrackConstraintSet.prototype.autoGainControl;\n\n/**\n * @type {ConstrainDouble|undefined}\n */\nMediaTrackConstraintSet.prototype.aspectRatio;\n\n/**\n * @type {ConstrainLong|undefined}\n */\nMediaTrackConstraintSet.prototype.channelCount;\n\n/**\n * @type {ConstrainDOMString|undefined}\n */\nMediaTrackConstraintSet.prototype.deviceId;\n\n/**\n * @type {ConstrainBoolean|undefined}\n */\nMediaTrackConstraintSet.prototype.echoCancellation;\n\n/**\n * @type {ConstrainDOMString|undefined}\n */\nMediaTrackConstraintSet.prototype.facingMode;\n\n/**\n * @type {ConstrainDouble|undefined}\n */\nMediaTrackConstraintSet.prototype.frameRate;\n\n/**\n * @type {ConstrainDOMString|undefined}\n */\nMediaTrackConstraintSet.prototype.groupId;\n\n/**\n * @type {ConstrainLong|undefined}\n */\nMediaTrackConstraintSet.prototype.height;\n\n/**\n * @type {ConstrainDouble|undefined}\n */\nMediaTrackConstraintSet.prototype.latency;\n\n/**\n * @type {ConstrainBoolean|undefined}\n */\nMediaTrackConstraintSet.prototype.noiseSuppression;\n\n/**\n * @type {ConstrainLong|undefined}\n */\nMediaTrackConstraintSet.prototype.sampleRate;\n\n/**\n * @type {ConstrainLong|undefined}\n */\nMediaTrackConstraintSet.prototype.sampleSize;\n\n/**\n * @type {ConstrainDouble|undefined}\n */\nMediaTrackConstraintSet.prototype.volume;\n\n/**\n * @type {ConstrainLong|undefined}\n */\nMediaTrackConstraintSet.prototype.width;\n\n\n/**\n * @record\n * @extends {MediaTrackConstraintSet}\n */\nfunction MediaTrackConstraints() {}\n\n/**\n * @type {Array|undefined}\n */\nMediaTrackConstraints.prototype.advanced;\n\n/**\n * @see https://w3c.github.io/mediacapture-main/getusermedia.html#media-track-constraints\n * @record\n */\nfunction MediaStreamConstraints() {}\n\n/**\n * @type {boolean|MediaTrackConstraints|undefined}\n */\nMediaStreamConstraints.prototype.audio;\n\n/**\n * @type {boolean|MediaTrackConstraints|undefined}\n */\nMediaStreamConstraints.prototype.video;\n\n/**\n * @see {http://dev.w3.org/2011/webrtc/editor/getusermedia.html#\n *     navigatorusermediaerror-and-navigatorusermediaerrorcallback}\n * @interface\n */\nfunction NavigatorUserMediaError() {}\n\n/**\n * @const {number}\n * @deprecated Removed from the standard and some browsers.\n */\nNavigatorUserMediaError.prototype.PERMISSION_DENIED;\n\n/**\n * @type {number}\n * @deprecated Removed from the standard and some browsers.\n * Read only.\n */\nNavigatorUserMediaError.prototype.code;\n\n/**\n * @type {string}\n * Read only.\n */\nNavigatorUserMediaError.prototype.name;\n\n/**\n * @type {?string}\n * Read only.\n */\nNavigatorUserMediaError.prototype.message;\n\n/**\n * @type {?string}\n * Read only.\n */\nNavigatorUserMediaError.prototype.constraintName;\n\n/**\n * @param {string} type\n * @param {!Object} eventInitDict\n * @constructor\n */\nfunction MediaStreamEvent(type, eventInitDict) {}\n\n/**\n * @const {?MediaStream}\n */\nMediaStreamEvent.prototype.stream;\n\n/**\n * @record\n * @see https://www.w3.org/TR/mediastream-recording/#dictdef-mediarecorderoptions\n */\nfunction MediaRecorderOptions() {}\n\n/** @type {(string|undefined)} */\nMediaRecorderOptions.prototype.mimeType\n\n/** @type {(number|undefined)} */\nMediaRecorderOptions.prototype.audioBitsPerSecond\n\n/** @type {(number|undefined)} */\nMediaRecorderOptions.prototype.videoBitsPerSecond\n\n/** @type {(number|undefined)} */\nMediaRecorderOptions.prototype.bitsPerSecond\n\n/**\n * @see https://www.w3.org/TR/mediastream-recording/#mediarecorder-api\n * @param {!MediaStream} stream\n * @param {MediaRecorderOptions=} options\n * @implements {EventTarget}\n * @constructor\n */\nfunction MediaRecorder(stream, options) {}\n\n/**\n * @override\n */\nMediaRecorder.prototype.addEventListener = function(type, listener,\n    opt_useCapture) {};\n\n/**\n * @override\n */\nMediaRecorder.prototype.removeEventListener = function(type, listener,\n    opt_useCapture) {};\n\n/**\n * @override\n * @return {boolean}\n */\nMediaRecorder.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @type {!MediaStream}\n */\nMediaRecorder.prototype.stream;\n\n/**\n * @type {string}\n */\nMediaRecorder.prototype.mimeType;\n\n/**\n * @type {string}\n */\nMediaRecorder.prototype.state;\n\n/**\n * @type {(function(!Event)|undefined)}\n */\nMediaRecorder.prototype.onstart;\n\n/**\n * @type {(function(!Event)|undefined)}\n */\nMediaRecorder.prototype.onstop;\n\n/**\n * @type {(function(!Event)|undefined)}\n */\nMediaRecorder.prototype.ondataavailable;\n\n/**\n * @type {(function(!Event)|undefined)}\n */\nMediaRecorder.prototype.onpause;\n\n/**\n * @type {(function(!Event)|undefined)}\n */\nMediaRecorder.prototype.onresume;\n\n/**\n * @type {(function(!Event)|undefined)}\n */\nMediaRecorder.prototype.onerror;\n\n/**\n * @type {number}\n */\nMediaRecorder.prototype.videoBitsPerSecond;\n\n/**\n * @type {number}\n */\nMediaRecorder.prototype.audioBitsPerSecond;\n\n/**\n * @param {number=} timeslice\n */\nMediaRecorder.prototype.start = function(timeslice) {};\n\n/** @return {void} */\nMediaRecorder.prototype.stop = function() {};\n\n/** @return {void} */\nMediaRecorder.prototype.pause = function() {};\n\n/** @return {void} */\nMediaRecorder.prototype.resume = function() {};\n\n/** @return {void} */\nMediaRecorder.prototype.requestData = function() {};\n\n/**\n * @param {string} type\n * @return {boolean}\n */\nMediaRecorder.isTypeSupported = function(type) {};\n\n/**\n * @constructor\n * @extends {Event}\n * @param {string} type\n * @param {{data: !Blob, timecode: (number|undefined)}} eventInitDict\n * @see https://www.w3.org/TR/mediastream-recording/#blobevent-section\n */\nfunction BlobEvent(type, eventInitDict) {}\n\n/** @type {!Blob} */\nBlobEvent.prototype.data;\n\n/** @type {number} */\nBlobEvent.prototype.timecode;\n\n/**\n * @interface\n * @see https://w3c.github.io/mediacapture-image/##photosettings-section\n */\nfunction PhotoSettings() {}\n\n/**\n * @type {string}\n */\nPhotoSettings.prototype.fillLightMode;\n\n/**\n * @type {number}\n */\nPhotoSettings.prototype.imageHeight;\n\n/**\n * @type {number}\n */\nPhotoSettings.prototype.imageWidth;\n\n/**\n * @type {boolean}\n */\nPhotoSettings.prototype.redEyeReduction;\n\n/**\n * @interface\n * @see https://w3c.github.io/mediacapture-image/##photocapabilities-section\n */\nfunction PhotoCapabilities() {}\n\n/**\n * @const {string}\n */\nPhotoCapabilities.prototype.redEyeReduction;\n\n/**\n * @const {!MediaSettingsRange}\n */\nPhotoCapabilities.prototype.imageHeight;\n\n/**\n * @const {!MediaSettingsRange}\n */\nPhotoCapabilities.prototype.imageWidth;\n\n/**\n * @const {!Array}\n */\nPhotoCapabilities.prototype.fillLightMode;\n\n/**\n * @see https://w3c.github.io/mediacapture-image/\n * @param {!MediaStreamTrack} videoTrack\n * @constructor\n */\nfunction ImageCapture(videoTrack) {}\n\n/**\n * @param {!PhotoSettings=} photoSettings\n * @return {!Promise}\n */\nImageCapture.prototype.takePhoto = function(photoSettings) {};\n\n/**\n * @return {!Promise}\n */\nImageCapture.prototype.getPhotoCapabilities = function() {};\n\n/**\n * @return {!Promise}\n */\nImageCapture.prototype.grabFrame = function() {};\n\n/**\n * @const {!MediaStreamTrack}\n */\nImageCapture.prototype.track;\n\n/**\n * @see https://www.w3.org/TR/webrtc/#rtctrackevent\n * @param {string} type\n * @param {!Object} eventInitDict\n * @constructor\n */\nfunction RTCTrackEvent(type, eventInitDict) {}\n\n/**\n * @const {?RTCRtpReceiver}\n */\nRTCTrackEvent.prototype.receiver;\n\n/**\n * @const {?MediaStreamTrack}\n */\nRTCTrackEvent.prototype.track;\n\n/**\n * @const {?Array}\n */\nRTCTrackEvent.prototype.streams;\n\n/**\n * @const {?RTCRtpTransceiver}\n */\nRTCTrackEvent.prototype.transceiver;\n\n/**\n * @typedef {string}\n * @see https://www.w3.org/TR/mediacapture-streams/#idl-def-MediaDeviceKind\n * In WebIDL this is an enum with values 'audioinput', 'audiooutput', and\n * 'videoinput', but there is no mechanism in Closure for describing a\n * specialization of the string type.\n */\nvar MediaDeviceKind;\n\n/**\n * Possible values are \"sendrecv\", \"sendonly\", \"recvonly\", and \"inactive\".\n * @typedef {string}\n * @see https://www.w3.org/TR/webrtc/#dom-rtcrtptransceiverdirection\n */\nvar RTCRtpTransceiverDirection;\n\n/**\n * @interface\n */\nfunction MediaDeviceInfo() {}\n\n/** @const {string} */\nMediaDeviceInfo.prototype.deviceId;\n\n/** @const {!MediaDeviceKind} */\nMediaDeviceInfo.prototype.kind;\n\n/** @const {string} */\nMediaDeviceInfo.prototype.label;\n\n/** @const {string} */\nMediaDeviceInfo.prototype.groupId;\n\n/**\n * @interface\n * @extends {EventTarget}\n * @see https://www.w3.org/TR/mediacapture-streams/#mediadevices\n */\nfunction MediaDevices() {}\n\n/**\n * @return {!Promise>}\n */\nMediaDevices.prototype.enumerateDevices = function() {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n * @param {!MediaStreamConstraints} constraints\n * @return {!Promise}\n */\nMediaDevices.prototype.getUserMedia = function(constraints) {}\n\n/**\n * @see https://w3c.github.io/mediacapture-screen-share/#dom-mediadevices-getdisplaymedia\n * @param {!MediaStreamConstraints=} constraints\n * @return {!Promise}\n */\nMediaDevices.prototype.getDisplayMedia = function(constraints) {}\n\n/**\n * @see https://w3c.github.io/mediacapture-main/#dom-mediadevices-getsupportedconstraints\n * @return {!MediaTrackSupportedConstraints}\n */\nMediaDevices.prototype.getSupportedConstraints = function()  {}\n\n/** @const {!MediaDevices} */\nNavigator.prototype.mediaDevices;\n\n/**\n * @typedef {string}\n * @see https://www.w3.org/TR/webrtc/#rtcsdptype\n * In WebIDL this is an enum with values 'offer', 'pranswer', and 'answer',\n * but there is no mechanism in Closure for describing a specialization of\n * the string type.\n */\nvar RTCSdpType;\n\n/**\n * @param {!Object=} descriptionInitDict The RTCSessionDescriptionInit\n * dictionary.  This optional argument may have type\n * {type:RTCSdpType, sdp:string}, but neither of these keys are required to be\n * present, and other keys are ignored, so the closest Closure type is Object.\n * @constructor\n * @see https://www.w3.org/TR/webrtc/#rtcsessiondescription-class\n */\nfunction RTCSessionDescription(descriptionInitDict) {}\n\n/**\n * @type {?RTCSdpType}\n * @see https://www.w3.org/TR/webrtc/#dom-rtcsessiondescription-type\n */\nRTCSessionDescription.prototype.type;\n\n/**\n * @type {?string}\n * @see https://www.w3.org/TR/webrtc/#dom-rtcsessiondescription-sdp\n */\nRTCSessionDescription.prototype.sdp;\n\n/**\n * TODO(bemasc): Remove this definition once it is removed from the browser.\n * @param {string} label The label index (audio/video/data -> 0,1,2)\n * @param {string} sdp The ICE candidate in SDP text form\n * @constructor\n */\nfunction IceCandidate(label, sdp) {}\n\n/**\n * @return {string}\n */\nIceCandidate.prototype.toSdp = function() {};\n\n/**\n * @type {?string}\n */\nIceCandidate.prototype.label;\n\n/** @record */\nfunction RTCIceCandidateInit() {};\n\n/** @type {?string|undefined} */\nRTCIceCandidateInit.prototype.candidate;\n\n/** @type {(?string|undefined)} */\nRTCIceCandidateInit.prototype.sdpMid;\n\n/** @type {(?number|undefined)} */\nRTCIceCandidateInit.prototype.sdpMLineIndex;\n\n/** @type {(string|undefined)} */\nRTCIceCandidateInit.prototype.usernameFragment;\n\n/**\n * @param {!RTCIceCandidateInit=} candidateInitDict  The RTCIceCandidateInit dictionary.\n * @constructor\n * @see https://www.w3.org/TR/webrtc/#rtcicecandidate-interface\n */\nfunction RTCIceCandidate(candidateInitDict) {}\n\n/**\n * @type {?string}\n */\nRTCIceCandidate.prototype.candidate;\n\n/**\n * @type {?string}\n */\nRTCIceCandidate.prototype.sdpMid;\n\n/**\n * @type {?number}\n */\nRTCIceCandidate.prototype.sdpMLineIndex;\n\n/**\n * @typedef {{urls: string}|{urls: !Array}}\n * @private\n * @see https://www.w3.org/TR/webrtc/#rtciceserver-dictionary\n * This dictionary type also has an optional key {credential: ?string}.\n */\nvar RTCIceServerRecord_;\n\n/**\n * @interface\n * @private\n */\nfunction RTCIceServerInterface_() {}\n\n/**\n * @type {string|!Array}\n */\nRTCIceServerInterface_.prototype.urls;\n\n/**\n * @type {?string}\n */\nRTCIceServerInterface_.prototype.username;\n\n/**\n * @type {?string}\n */\nRTCIceServerInterface_.prototype.credential;\n\n/**\n * This type, and several below it, are constructed as unions between records\n *\n * @typedef {RTCIceServerRecord_|RTCIceServerInterface_}\n * @private\n */\nvar RTCIceServer;\n\n/**\n * @typedef {{\n *   iceServers: !Array,\n *   sdpSemantics: (string|undefined)\n * }}\n * @private\n */\nvar RTCConfigurationRecord_;\n\n/**\n * @interface\n * @private\n */\nfunction RTCConfigurationInterface_() {}\n\n/**\n * @type {!Array}\n */\nRTCConfigurationInterface_.prototype.iceServers;\n\n/**\n * Allows specifying the SDP semantics. Valid values are \"plan-b\" and\n * \"unified-plan\".\n *\n * @see {@link https://webrtc.org/web-apis/chrome/unified-plan/}\n * @type {string|undefined}\n */\nRTCConfigurationInterface_.prototype.sdpSemantics;\n\n/**\n * @typedef {RTCConfigurationRecord_|RTCConfigurationInterface_}\n */\nvar RTCConfiguration;\n\n/**\n * @typedef {function(!RTCSessionDescription)}\n */\nvar RTCSessionDescriptionCallback;\n\n/**\n * @typedef {function(string)}\n */\nvar RTCPeerConnectionErrorCallback;\n\n/**\n * @typedef {function()}\n */\nvar RTCVoidCallback;\n\n/**\n * @typedef {string}\n */\nvar RTCSignalingState;\n\n/**\n * @typedef {string}\n */\nvar RTCIceConnectionState;\n\n/**\n * @typedef {string}\n */\nvar RTCIceGatheringState;\n\n/**\n * @see https://www.w3.org/TR/webrtc/#rtcpeerconnectionstate-enum\n * @typedef {string}\n */\nvar RTCPeerConnectionState;\n\n/**\n * @param {string} type\n * @param {!Object} eventInitDict\n * @constructor\n */\nfunction RTCPeerConnectionIceEvent(type, eventInitDict) {}\n\n/**\n * @const {RTCIceCandidate}\n */\nRTCPeerConnectionIceEvent.prototype.candidate;\n\n// Note: The specification of RTCStats types is still under development.\n// Declarations here will be updated and removed to follow the development of\n// modern browsers, breaking compatibility with older versions as they become\n// obsolete.\n/**\n * @see https://www.w3.org/TR/webrtc/#dom-rtcstats\n * @interface\n */\nfunction RTCStats() {}\n\n/**\n * @const {?Date|number}\n */\nRTCStats.prototype.timestamp;\n\n/**\n * https://www.w3.org/TR/webrtc-stats/#rtcstatstype-str*\n * @const {string}\n */\nRTCStats.prototype.type;\n\n/**\n * @const {string}\n */\nRTCStats.prototype.id;\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcrtpstreamstats\n * @interface\n * @extends {RTCStats}\n */\nfunction RTCRtpStreamStats() {}\n\n/** @const {number} */\nRTCRtpStreamStats.prototype.ssrc;\n\n/** @const {string} */\nRTCRtpStreamStats.prototype.kind;\n\n/**\n * Safari 13 still uses .mediaType instead of .kind.\n * @const {string}\n */\nRTCRtpStreamStats.prototype.mediaType;\n\n/** @const {string} */\nRTCRtpStreamStats.prototype.transportId;\n\n/** @const {string} */\nRTCRtpStreamStats.prototype.codecId;\n\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcreceivedrtpstreamstats\n * @interface\n * @extends {RTCRtpStreamStats}\n */\nfunction RTCReceivedRtpStreamStats() {}\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.packetsReceived;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.packetsLost;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.jitter;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.packetsDiscarded;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.packetsRepaired;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.burstPacketsLost;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.burstPacketsDiscarded;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.burstLossCount;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.burstDiscardCount;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.burstLossRate;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.burstDiscardRate;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.gapLossRate;\n\n/** @const {number} */\nRTCReceivedRtpStreamStats.prototype.gapDiscardRate;\n\n\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats\n * @interface\n * @extends {RTCReceivedRtpStreamStats}\n */\nfunction RTCInboundRtpStreamStats() {}\n\n/** @const {string} */\nRTCInboundRtpStreamStats.prototype.trackId;\n\n/** @const {string} */\nRTCInboundRtpStreamStats.prototype.receiverId;\n\n/** @const {string} */\nRTCInboundRtpStreamStats.prototype.remoteId;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.framesDecoded;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.keyFramesDecoded;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.frameWidth;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.frameHeight;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.frameBitDepth;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.framesPerSecond;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.qpSum;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.totalDecodeTime;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.totalInterframeDelay;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.totalSquaredInterFrameDelay;\n\n/** @const {boolean} */\nRTCInboundRtpStreamStats.prototype.voiceActivityFlag;\n\n/** @const {?Date|number} */\nRTCInboundRtpStreamStats.prototype.lastPacketReceivedTimestamp;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.averageRtcpInterval;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.headerBytesReceived;\n\n/**\n * Not available in Safari 13, Firefox 69 (Chrome 81+ only).\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.fecPacketsReceived;\n\n/**\n * Not available in Safari 13, Firefox 69 (Chrome 81+ only).\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.fecPacketsDiscarded;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.bytesReceived;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.packetsFailedDecryption;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.packetsDuplicated;\n\n// TODO: record perDscpPacketsReceived;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.nackCount;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.firCount;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.pliCount;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.sliCount;\n\n/** @const {?Date|number} */\nRTCInboundRtpStreamStats.prototype.estimatedPlayoutTimestamp;\n\n/**\n * Firefox specific value.\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.bitrateMean;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.jitterBufferDelay;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.jitterBufferEmittedCount;\n\n/**\n * Experimental chrome stats under this origin trial:\n * https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/hE2B1iItPDk\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.jitterBufferFlushes;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.totalSamplesReceived;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.samplesDecodedWithSilk;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.samplesDecodedWithCelt;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.concealedSamples;\n\n/**\n * Not available in Safari 13.\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.silentConcealedSamples;\n\n/**\n * Not available in Safari 13.\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.concealmentEvents;\n\n/**\n * Not available in Safari 13.\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.insertedSamplesForDeceleration\n\n/**\n * Not available in Safari 13.\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.removedSamplesForAcceleration;\n\n/**\n * Experimental chrome stats under this origin trial:\n * https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/hE2B1iItPDk\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.delayedPacketOutageSamples;\n\n/**\n * Safari still reprorting it as inbound-rtp, it supposed to be in remote part.\n * @const {number|undefined}\n */\nRTCInboundRtpStreamStats.prototype.fractionLost;\n\n/** @const {number} */\nRTCInboundRtpStreamStats.prototype.audioLevel;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.totalAudioEnergy;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.totalSamplesDuration;\n\n/** @const {number|undefined} */\nRTCInboundRtpStreamStats.prototype.framesReceived;\n\n/** @const {string|undefined} */\nRTCInboundRtpStreamStats.prototype.decoderImplementation;\n\n\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteinboundrtpstreamstats\n * @interface\n * @extends {RTCReceivedRtpStreamStats}\n */\nfunction RTCRemoteInboundRtpStreamStats() {}\n\n/** @const {string} */\nRTCRemoteInboundRtpStreamStats.prototype.localId;\n\n/** @const {number} */\nRTCRemoteInboundRtpStreamStats.prototype.roundTripTime;\n\n/** @const {number} */\nRTCRemoteInboundRtpStreamStats.prototype.fractionLost;\n\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcsentrtpstreamstats\n * @interface\n * @extends {RTCRtpStreamStats}\n */\nfunction RTCSentRtpStreamStats() {}\n\n/** @const {number} */\nRTCSentRtpStreamStats.prototype.packetsSent;\n\n/** @const {number} */\nRTCSentRtpStreamStats.prototype.packetsDiscardedOnSend;\n\n/** @const {number} */\nRTCSentRtpStreamStats.prototype.fecPacketsSent;\n\n/** @const {number} */\nRTCSentRtpStreamStats.prototype.bytesSent;\n\n/** @const {number} */\nRTCSentRtpStreamStats.prototype.bytesDiscardedOnSend;\n\n\n/**\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcoutboundrtpstreamstats\n * @interface\n * @extends {RTCSentRtpStreamStats}\n */\nfunction RTCOutboundRtpStreamStats() {}\n\n/** @const {string} */\nRTCOutboundRtpStreamStats.prototype.trackId;\n\n/** @const {string} */\nRTCOutboundRtpStreamStats.prototype.senderId;\n\n/** @const {string} */\nRTCOutboundRtpStreamStats.prototype.remoteId;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.lastPacketSentTimestamp;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.targetBitrate;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.framesEncoded;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.totalEncodeTime;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.averageRTCPInterval;\n\n/** @const {number|undefined} */\nRTCOutboundRtpStreamStats.prototype.qualityLimitationResolutionChanges;\n\n/** @const {string|undefined} */\nRTCOutboundRtpStreamStats.prototype.qualityLimitationReason;\n\n/** @const {string} */\nRTCOutboundRtpStreamStats.prototype.mediaSourceId;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.frameWidth;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.frameHeight;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.qpSum;\n\n/**\n * Firefox specific value.\n * @const {number|undefined}\n */\nRTCOutboundRtpStreamStats.prototype.bitrateMean;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.nackCount;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.firCount;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.pliCount;\n\n/** @const {number} */\nRTCOutboundRtpStreamStats.prototype.sliCount;\n\n/** @const {string|undefined} */\nRTCOutboundRtpStreamStats.prototype.encoderImplementation;\n\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats\n * @interface\n * @extends {RTCSentRtpStreamStats}\n */\nfunction RTCRemoteOutboundRtpStreamStats() {}\n\n/** @const {string} */\nRTCRemoteOutboundRtpStreamStats.prototype.localId;\n\n/** @const {?Date|number} */\nRTCRemoteOutboundRtpStreamStats.prototype.remoteTimestamp;\n\n\n/**\n * @see https://www.w3.org/TR/webrtc-stats/#transportstats-dict*\n * @interface\n * @extends {RTCStats}\n */\nfunction RTCTransportStats() {}\n\n/** @type {number} */\nRTCTransportStats.prototype.packetsSent;\n\n/** @type {number} */\nRTCTransportStats.prototype.packetsReceived;\n\n/** @type {number} */\nRTCTransportStats.prototype.bytesSent;\n\n/** @type {number} */\nRTCTransportStats.prototype.bytesReceived;\n\n/** @type {string} */\nRTCTransportStats.prototype.rtcpTransportStatsId;\n\n/**\n * @type {string}\n * Set of possible string values: 'unknown', 'controlling', 'controlled'.\n */\nRTCTransportStats.prototype.iceRole;\n\n/**\n * @type {string}\n * Set of possible string values: 'new', 'connecting', 'connected',\n * 'closed', 'failed'.\n */\nRTCTransportStats.prototype.dtlsState;\n\n/** @type {string} */\nRTCTransportStats.prototype.selectedCandidatePairId;\n\n/** @type {string} */\nRTCTransportStats.prototype.localCertificateId;\n\n/** @type {string} */\nRTCTransportStats.prototype.remoteCertificateId;\n\n/** @type {string} */\nRTCTransportStats.prototype.tlsVersion;\n\n/** @type {string} */\nRTCTransportStats.prototype.dtlsCipher;\n\n/** @type {string} */\nRTCTransportStats.prototype.srtpCipher;\n\n/** @type {string} */\nRTCTransportStats.prototype.tlsGroup;\n\n/** @type {number} */\nRTCTransportStats.prototype.selectedCandidatePairChanges;\n\n\n/**\n * @see https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats\n * @interface\n * @extends {RTCStats}\n */\nfunction RTCMediaSourceStats() {}\n\n/** @const {string} */\nRTCMediaSourceStats.prototype.trackIdentifier;\n\n/** @const {string} */\nRTCMediaSourceStats.prototype.kind;\n\n/**\n * @see https://w3c.github.io/webrtc-stats/#dom-rtcvideosourcestats\n * @interface\n * @extends {RTCMediaSourceStats}\n */\nfunction RTCVideoSourceStats() {}\n\n/** @const {number} */\nRTCVideoSourceStats.prototype.width;\n\n/** @const {number} */\nRTCVideoSourceStats.prototype.height;\n\n/** @const {number} */\nRTCVideoSourceStats.prototype.bitDepth;\n\n/** @const {number} */\nRTCVideoSourceStats.prototype.frames;\n\n/** @const {number} */\nRTCVideoSourceStats.prototype.framesPerSecond;\n\n/**\n * @see https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats\n * @interface\n * @extends {RTCMediaSourceStats}\n */\nfunction RTCAudioSourceStats() {}\n\n/** @const {number} */\nRTCAudioSourceStats.prototype.audioLevel;\n\n/** @const {number} */\nRTCAudioSourceStats.prototype.totalAudioEnergy;\n\n/** @const {number} */\nRTCAudioSourceStats.prototype.totalSamplesDuration;\n\n/** @const {number} */\nRTCAudioSourceStats.prototype.echoReturnLoss;\n\n/** @const {number} */\nRTCAudioSourceStats.prototype.echoReturnLossEnhancement;\n\n\n/**\n * @interface\n * @extends {Iterable>}\n * @see https://w3c.github.io/webrtc-pc/#rtcstatsreport-object\n */\nfunction RTCStatsReport() {}\n\n/**\n * @const {?Date|number}\n */\nRTCStatsReport.prototype.timestamp;\n\n/**\n * @return {!Array}\n */\nRTCStatsReport.prototype.names = function() {};\n\n/**\n * @param {string} name\n * @return {string}\n */\nRTCStatsReport.prototype.stat = function(name) {};\n\n/**\n * @deprecated\n * @const {RTCStatsReport}\n */\nRTCStatsReport.prototype.local;\n\n/**\n * @deprecated\n * @const {RTCStatsReport}\n */\nRTCStatsReport.prototype.remote;\n\n/**\n * @const {string}\n */\nRTCStatsReport.prototype.type;\n\n/**\n * @const {string}\n */\nRTCStatsReport.prototype.id;\n\n// Note: Below are Map like methods supported by WebRTC statistics\n// specification-compliant RTCStatsReport. Currently only implemented by\n// Mozilla.\n// See https://www.w3.org/TR/webrtc/#rtcstatsreport-object for definition.\n/**\n * @param {function(this:SCOPE, !RTCStats, string, MAP)} callback\n * @param {SCOPE=} opt_thisObj The value of \"this\" inside callback function.\n * @this {MAP}\n * @template MAP,SCOPE\n */\nRTCStatsReport.prototype.forEach = function(callback, opt_thisObj) {};\n\n/**\n * @param {string} key\n * @return {!IteratorIterable>}\n */\nRTCStatsReport.prototype.entries = function(key) {};\n\n/**\n * @param {string} key\n * @return {!RTCStats}\n */\nRTCStatsReport.prototype.get = function(key) {};\n\n/**\n * @return {!IteratorIterable}\n */\nRTCStatsReport.prototype.keys = function() {};\n\n/**\n * @return {!IteratorIterable}\n */\nRTCStatsReport.prototype.values = function() {};\n\n/**\n * @param {string} key\n * @return {boolean}\n */\nRTCStatsReport.prototype.has = function(key) {};\n\n/**\n * @const {number}\n */\nRTCStatsReport.prototype.size;\n\n/**\n * @return {!Iterator>}\n */\nRTCStatsReport.prototype[Symbol.iterator] = function() {};\n\n\n/**\n * TODO(bemasc): Remove this type once it is no longer in use.  It has already\n * been removed from the specification.\n * @typedef {RTCStatsReport}\n * @deprecated\n */\nvar RTCStatsElement;\n\n/**\n * @interface\n */\nfunction RTCStatsResponse() {}\n\n/**\n * @return {!Array}\n */\nRTCStatsResponse.prototype.result = function() {};\n\n/**\n * @typedef {function(!RTCStatsResponse, MediaStreamTrack=)}\n */\nvar RTCStatsCallback;\n\n/**\n * This type is not yet standardized, so the properties here only represent\n * the current capabilities of libjingle (and hence Chromium).\n * TODO(bemasc): Add a link to the relevant standard once MediaConstraint has a\n * standard definition.\n *\n * @interface\n * @private\n */\nfunction MediaConstraintSetInterface_() {}\n\n/**\n * @type {?boolean}\n */\nMediaConstraintSetInterface_.prototype.OfferToReceiveAudio;\n\n/**\n * @type {?boolean}\n */\nMediaConstraintSetInterface_.prototype.OfferToReceiveVideo;\n\n/**\n * @type {?boolean}\n */\nMediaConstraintSetInterface_.prototype.DtlsSrtpKeyAgreement;\n\n/**\n * @type {?boolean}\n */\nMediaConstraintSetInterface_.prototype.RtpDataChannels;\n\n/**\n * TODO(bemasc): Make this type public once it is defined in a standard.\n *\n * @typedef {Object|MediaConstraintSetInterface_}\n * @private\n */\nvar MediaConstraintSet_;\n\n/**\n * @interface\n * @private\n */\nfunction MediaConstraintsInterface_() {}\n\n/**\n * @type {?MediaConstraintSet_}\n */\nMediaConstraintsInterface_.prototype.mandatory;\n\n/**\n * @type {?Array}\n */\nMediaConstraintsInterface_.prototype.optional;\n\n/**\n * This type is used extensively in\n * {@see http://dev.w3.org/2011/webrtc/editor/webrtc.html} but is not yet\n * defined.\n *\n * @typedef {Object|MediaConstraintsInterface_}\n */\nvar MediaConstraints;\n\n/**\n * @interface\n * @extends {EventTarget}\n * @see https://w3c.github.io/webrtc-pc/#dom-rtcdatachannel\n */\nfunction RTCDataChannel() {}\n\n/**\n * @const {string}\n */\nRTCDataChannel.prototype.label;\n\n/**\n * @const {boolean}\n */\nRTCDataChannel.prototype.reliable;\n\n/**\n * An enumerated string type (RTCDataChannelState) with values:\n * \"connecting\", \"open\", \"closing\", and \"closed\".\n * @type {string}\n * Read only.\n */\nRTCDataChannel.prototype.readyState;\n\n/**\n * @type {number}\n * Read only.\n */\nRTCDataChannel.prototype.bufferedAmount;\n\n/**\n * @type {number}\n */\nRTCDataChannel.prototype.bufferedAmountLowThreshold;\n\n/**\n * @type {?function(!Event)}\n */\nRTCDataChannel.prototype.onopen;\n\n/**\n * @type {?function(!Event)}\n */\nRTCDataChannel.prototype.onerror;\n\n/**\n * @type {?function(!Event)}\n */\nRTCDataChannel.prototype.onclose;\n\nRTCDataChannel.prototype.close = function() {};\n\n/**\n * @type {?function(!MessageEvent<*>)}\n */\nRTCDataChannel.prototype.onmessage;\n\n/**\n * @type {?function(!Event)}\n */\nRTCDataChannel.prototype.onbufferedamountlow;\n\n/**\n * @type {string}\n */\nRTCDataChannel.prototype.binaryType;\n\n/**\n * @param {string|!Blob|!ArrayBuffer|!ArrayBufferView} data\n * @return {undefined}\n */\nRTCDataChannel.prototype.send = function(data) {};\n\n/**\n * @constructor\n * @extends {Event}\n * @private\n */\nfunction RTCDataChannelEvent() {}\n\n/**\n * @type {!RTCDataChannel}\n * Read only.\n */\nRTCDataChannelEvent.prototype.channel;\n\n/**\n * @typedef {{reliable: boolean}}\n */\nvar RTCDataChannelInitRecord_;\n\n/**\n * @interface\n * @private\n */\nfunction RTCDataChannelInitInterface_() {}\n\n/**\n * @type {boolean}\n */\nRTCDataChannelInitInterface_.prototype.reliable;\n\n/**\n * @typedef {{\n *   ordered: (boolean|undefined),\n *   maxPacketLifeTime: (number|undefined),\n *   maxRetransmits: (number|undefined),\n *   protocol: (string|undefined),\n *   negotiated: (boolean|undefined),\n *   id: (number|undefined),\n *   priority: (string|undefined),\n * }}\n * see https://www.w3.org/TR/webrtc/#dom-rtcdatachannelinit for documentation\n * Type inconsistencies due to Closure limitations:\n * maxPacketLifeTime should be UnsignedShort\n * maxRetransmits should be UnsignedShort\n * protocol should be USVString\n * id should be UnsignedShort\n * In WebIDL priority is an enum with values 'very-low', 'low',\n * 'medium' and 'high', but there is no mechanism in Closure for describing\n * a specialization of the string type.\n */\nvar RTCDataChannelInitDictionary_;\n\n/**\n * @typedef {RTCDataChannelInitInterface_|RTCDataChannelInitRecord_|RTCDataChannelInitDictionary_}\n */\nvar RTCDataChannelInit;\n\n/**\n * @typedef {{expires: number}}\n */\nvar RTCCertificate;\n\n/**\n * @param {RTCConfiguration} configuration\n * @param {!MediaConstraints=} constraints\n * @constructor\n * @implements {EventTarget}\n * @see https://www.w3.org/TR/webrtc/#interface-definition\n */\nfunction RTCPeerConnection(configuration, constraints) {}\n\n/**\n * @param {Object} keygenAlgorithm\n * @return {Promise}\n */\nRTCPeerConnection.generateCertificate = function (keygenAlgorithm) {};\n\n/**\n * @override\n */\nRTCPeerConnection.prototype.addEventListener = function(\n    type, listener, opt_useCapture) {};\n\n/**\n * @override\n */\nRTCPeerConnection.prototype.removeEventListener = function(\n    type, listener, opt_useCapture) {};\n\n/**\n * @override\n * @return {boolean}\n */\nRTCPeerConnection.prototype.dispatchEvent = function(evt) {};\n\n\n// NB: Until closure annotations support overloading, many of the following\n// functions take odd unions of parameter types.  This is to support the various\n// api differences between browsers.  Generally, returning a promise means you\n// don't take callback function parameters and draw any further parameters\n// forward, and vice versa.\n\n/**\n * @param {(!RTCSessionDescriptionCallback|!MediaConstraints)=}\n *    successCallbackOrConstraints\n * @param {!RTCPeerConnectionErrorCallback=} errorCallback\n * @param {!MediaConstraints=} constraints\n * @return {!Promise|undefined}\n */\nRTCPeerConnection.prototype.createOffer = function(successCallbackOrConstraints,\n    errorCallback, constraints) {};\n\n/**\n * @param {(!RTCSessionDescriptionCallback|!MediaConstraints)=}\n *    successCallbackOrConstraints\n * @param {!RTCPeerConnectionErrorCallback=} errorCallback\n * @param {!MediaConstraints=} constraints\n * @return {!Promise|undefined}\n */\nRTCPeerConnection.prototype.createAnswer =\n    function(successCallbackOrConstraints, errorCallback, constraints) {};\n\n/**\n * @param {!RTCSessionDescription} description\n * @param {!RTCVoidCallback=} successCallback\n * @param {!RTCPeerConnectionErrorCallback=} errorCallback\n * @return {!Promise}\n */\nRTCPeerConnection.prototype.setLocalDescription = function(description,\n    successCallback, errorCallback) {};\n\n/**\n * @param {!RTCSessionDescription} description\n * @param {!RTCVoidCallback=} successCallback\n * @param {!RTCPeerConnectionErrorCallback=} errorCallback\n * @return {!Promise}\n */\nRTCPeerConnection.prototype.setRemoteDescription = function(description,\n    successCallback, errorCallback) {};\n\n/**\n * @type {?RTCSessionDescription}\n * Read only.\n */\nRTCPeerConnection.prototype.localDescription;\n\n/**\n * @type {?RTCSessionDescription}\n * Read only.\n */\nRTCPeerConnection.prototype.remoteDescription;\n\n/**\n * @type {RTCSignalingState}\n * Read only.\n */\nRTCPeerConnection.prototype.signalingState;\n\n/**\n * @param {?RTCConfiguration=} configuration\n * @param {?MediaConstraints=} constraints\n * @return {undefined}\n */\nRTCPeerConnection.prototype.updateIce = function(configuration, constraints) {};\n\n/**\n * Void in Chrome for now, a promise that you can then/catch in Firefox.\n * @param {!RTCIceCandidate} candidate\n * @param {!RTCVoidCallback=} successCallback\n * @param {function(DOMException)=} errorCallback\n * @return {!Promise|undefined}\n */\nRTCPeerConnection.prototype.addIceCandidate = function(candidate, successCallback, errorCallback) {};\n\n/**\n * @type {!RTCIceGatheringState}\n * Read only.\n */\nRTCPeerConnection.prototype.iceGatheringState;\n\n/**\n * @type {!RTCIceConnectionState}\n * Read only.\n */\nRTCPeerConnection.prototype.iceConnectionState;\n\n/**\n * @type {!RTCPeerConnectionState}\n * Read only.\n */\nRTCPeerConnection.prototype.connectionState;\n\n/**\n * @return {!Array}\n */\nRTCPeerConnection.prototype.getLocalStreams = function() {};\n\n/**\n * @return {!Array}\n */\nRTCPeerConnection.prototype.getRemoteStreams = function() {};\n\n/**\n * @param {string} streamId\n * @return {MediaStream}\n */\nRTCPeerConnection.prototype.getStreamById = function(streamId) {};\n\n/**\n * @return {!Array}\n */\nRTCPeerConnection.prototype.getSenders = function() {};\n\n/**\n * @return {!Array}\n */\nRTCPeerConnection.prototype.getReceivers = function() {};\n\n/**\n * @param {?string} label\n * @param {RTCDataChannelInit=} dataChannelDict\n * @return {!RTCDataChannel}\n */\nRTCPeerConnection.prototype.createDataChannel =\n    function(label, dataChannelDict) {};\n/**\n * @param {!MediaStream} stream\n * @param {!MediaConstraints=} constraints\n * @return {undefined}\n */\nRTCPeerConnection.prototype.addStream = function(stream, constraints) {};\n\n/**\n * @param {!MediaStream} stream\n * @return {undefined}\n */\nRTCPeerConnection.prototype.removeStream = function(stream) {};\n\n/**\n * @param {!MediaStreamTrack} track\n * @param {!MediaStream} stream\n * @param {...MediaStream} var_args Additional streams.\n * @return {!RTCRtpSender}\n */\nRTCPeerConnection.prototype.addTrack = function(track, stream, var_args) {};\n\n/**\n * @param {!MediaStreamTrack|string} trackOrKind\n * @param {?RTCRtpTransceiverInit=} init\n * @return {!RTCRtpTransceiver}\n */\nRTCPeerConnection.prototype.addTransceiver = function(trackOrKind, init) {};\n\n/**\n * Returns the list of transceivers are currently attached to this peer.\n *\n * @return {!Array}\n */\nRTCPeerConnection.prototype.getTransceivers = function() {};\n\n/**\n * @return {!RTCConfiguration}\n */\nRTCPeerConnection.prototype.getConfiguration = function() {};\n\n/**\n * @param {!RTCConfiguration} configuration\n * @return {undefined}\n */\nRTCPeerConnection.prototype.setConfiguration = function(configuration) {};\n\n/**\n * @param {!RTCRtpSender} sender\n * @return {undefined}\n */\nRTCPeerConnection.prototype.removeTrack = function(sender) {};\n\n// TODO(bemasc): Add identity provider stuff once implementations exist\n\n// TODO(rjogrady): Per w3c spec, getStats() should always return a Promise.\n// Remove RTCStatsReport from the return value once Firefox supports that.\n/**\n * Firefox' getstats is synchronous and returns a much simpler\n * {!RTCStatsReport} Map-like object.\n * @param {!RTCStatsCallback=} successCallback\n * @param {MediaStreamTrack=} selector\n * @return {undefined|!RTCStatsReport|!Promise}\n */\nRTCPeerConnection.prototype.getStats = function(successCallback, selector) {};\n\nRTCPeerConnection.prototype.close = function() {};\n\n/**\n * @type {?function(!Event)}\n */\nRTCPeerConnection.prototype.onnegotiationneeded;\n\n/**\n * @type {?function(!RTCPeerConnectionIceEvent)}\n */\nRTCPeerConnection.prototype.onicecandidate;\n\n/**\n * @type {?function(!Event)}\n */\nRTCPeerConnection.prototype.onicegatheringstatechange;\n\n/**\n * @type {?function(!Event)}\n */\nRTCPeerConnection.prototype.onsignalingstatechange;\n\n/**\n * @type {?function(!MediaStreamEvent)}\n */\nRTCPeerConnection.prototype.onaddstream;\n\n/**\n * @type {?function(!RTCTrackEvent)}\n */\nRTCPeerConnection.prototype.ontrack;\n\n/**\n * @type {?function(!MediaStreamEvent)}\n */\nRTCPeerConnection.prototype.onremovestream;\n\n/**\n * @type {?function(!Event)}\n */\nRTCPeerConnection.prototype.oniceconnectionstatechange;\n\n/**\n * @type {?function(!RTCDataChannelEvent)}\n */\nRTCPeerConnection.prototype.ondatachannel;\n\n/**\n * @type {?function(!Event)}\n */\nRTCPeerConnection.prototype.onconnectionstatechange;\n","externs/nonstandard_rtc.js":"/*\n * Copyright 2019 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Nonstandard definitions for components of the WebRTC browser\n * API.\n *\n * @externs\n */\n\n/**\n * @type {function(new: MediaStream,\n *                 (!MediaStream|!Array)=)}\n */\nvar webkitMediaStream;\n\n/**\n * @param {MediaStreamConstraints} constraints A MediaStreamConstraints object.\n * @param {function(!MediaStream)} successCallback\n *     A NavigatorUserMediaSuccessCallback function.\n * @param {function(!NavigatorUserMediaError)=} errorCallback A\n *     NavigatorUserMediaErrorCallback function.\n * @see http://dev.w3.org/2011/webrtc/editor/getusermedia.html\n * @see https://www.w3.org/TR/mediacapture-streams/\n * @return {undefined}\n */\nNavigator.prototype.webkitGetUserMedia = function(\n    constraints, successCallback, errorCallback) {};\n\n/** @const */\nvar webkitRTCPeerConnection = RTCPeerConnection;\n","externs/w3c_screen_orientation.js":"/*\n * Copyright 2016 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Screen Orientation API.\n * @see https://w3c.github.io/screen-orientation/\n *\n * @externs\n */\n\n/**\n * @interface\n * @extends {EventTarget}\n * @see https://w3c.github.io/screen-orientation/#screenorientation-interface\n */\nvar ScreenOrientation = function() {};\n\n/**\n * @param {string} orientation\n * @return {!Promise}\n */\nScreenOrientation.prototype.lock = function(orientation) {};\n\n/** @return {void} */\nScreenOrientation.prototype.unlock = function() {};\n\n/** @const {string} */\nScreenOrientation.prototype.type;\n\n/** @const {number} */\nScreenOrientation.prototype.angle;\n\n/** @type {?function(!Event)} */\nScreenOrientation.prototype.onchange;\n\n/**\n * @type {?ScreenOrientation}\n * @see https://w3c.github.io/screen-orientation/#extensions-to-the-screen-interface\n */\nScreen.prototype.orientation;\n","externs/w3c_selectors.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Selectors API.\n *  This file depends on w3c_dom1.js.\n *  @see http://www.w3.org/TR/selectors-api2/\n *\n * @externs\n * @author [email protected] (Mihai Parparita)\n */\n\n/**\n * @param {string} selectors\n * @return {?Element}\n * @override\n * @nosideeffects\n */\nDocument.prototype.querySelector = function(selectors) {};\n\n/**\n * @param {string} selectors\n * @return {!NodeList}\n * @override\n * @nosideeffects\n */\nDocument.prototype.querySelectorAll = function(selectors) {};\n\n/**\n * @param {string} selectors\n * @return {?Element}\n * @override\n * @nosideeffects\n */\nElement.prototype.querySelector = function(selectors) {};\n\n/**\n * @param {string} selectors\n * @return {!NodeList}\n * @override\n * @nosideeffects\n */\nElement.prototype.querySelectorAll = function(selectors) {};\n\n/**\n * https://dom.spec.whatwg.org/#dom-element-closest\n * https://developer.mozilla.org/en-US/docs/Web/API/Element.closest\n * @param {string} selectors\n * @return {?Element}\n * @nosideeffects\n */\nElement.prototype.closest = function(selectors) {};\n\n/**\n * https://dom.spec.whatwg.org/#dom-element-matches\n * https://developer.mozilla.org/en-US/docs/Web/API/Element.matches\n * @param {string} selectors\n * @return {boolean}\n * @nosideeffects\n */\nElement.prototype.matches = function(selectors) {};\n\n/**\n * @param {string} selectors\n * @param {(Node|NodeList)=} refNodes\n * @return {boolean}\n * @nosideeffects\n */\nElement.prototype.matchesSelector = function(selectors, refNodes) {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/Node.mozMatchesSelector\n * @param {string} selectors\n * @return {boolean}\n * @nosideeffects\n */\nElement.prototype.mozMatchesSelector = function(selectors) {};\n\n/**\n * @see http://developer.apple.com/library/safari/documentation/WebKit/Reference/ElementClassRef/Element/Element.html\n * @param {string} selectors\n * @return {boolean}\n * @nosideeffects\n */\nElement.prototype.webkitMatchesSelector = function(selectors) {};\n\n/**\n * @see http://msdn.microsoft.com/en-us/library/ff975201.aspx\n * @param {string} selectors\n * @return {boolean}\n * @nosideeffects\n */\nElement.prototype.msMatchesSelector = function(selectors) {};\n\n/**\n * @see http://www.opera.com/docs/changelogs/windows/1150/\n * @param {string} selectors\n * @return {boolean}\n * @nosideeffects\n */\nElement.prototype.oMatchesSelector = function(selectors) {};\n","externs/w3c_serviceworker.js":"/*\n * Copyright 2014 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Externs for service worker.\n *\n * @see http://www.w3.org/TR/service-workers/\n * @externs\n */\n\n/**\n * @see http://www.w3.org/TR/service-workers/#service-worker-interface\n * @constructor\n * @extends {Worker}\n */\nfunction ServiceWorker() {}\n\n/** @type {string} */\nServiceWorker.prototype.scriptURL;\n\n/** @type {ServiceWorkerState} */\nServiceWorker.prototype.state;\n\n/** @type {?function(!Event)} */\nServiceWorker.prototype.onstatechange;\n\n/**\n *  Set of possible string values: 'installing', 'installed', 'activating',\n * 'activated', 'redundant'.\n *  @typedef {string}\n */\nvar ServiceWorkerState;\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#navigationpreloadmanager\n * @constructor\n */\nfunction NavigationPreloadManager() {}\n\n/** @return {!Promise} */\nNavigationPreloadManager.prototype.enable = function() {};\n\n/** @return {!Promise} */\nNavigationPreloadManager.prototype.disable = function() {};\n\n/**\n * @param {string=} value\n * @return {!Promise}\n */\nNavigationPreloadManager.prototype.setHeaderValue = function(value) {};\n\n/** @return {!Promise} */\nNavigationPreloadManager.prototype.getState = function() {};\n\n/**\n *  @typedef {{\n *   enabled: (boolean|undefined),\n *   headerValue: (string|undefined)\n * }}\n */\nvar NavigationPreloadState;\n\n/** @record */\nfunction PushSubscriptionOptions() {}\n\n/** @type {ArrayBuffer|undefined} */\nPushSubscriptionOptions.prototype.applicationServerKey;\n\n/** @type {boolean|undefined} */\nPushSubscriptionOptions.prototype.userVisibleOnly;\n\n/** @record */\nfunction PushSubscriptionOptionsInit() {}\n\n/** @type {BufferSource|string|undefined} */\nPushSubscriptionOptionsInit.prototype.applicationServerKey;\n\n/** @type {boolean|undefined} */\nPushSubscriptionOptionsInit.prototype.userVisibleOnly;\n\n\n/**\n * @see https://w3c.github.io/push-api/\n * @constructor\n */\nfunction PushSubscription() {}\n\n/** @type {string} */\nPushSubscription.prototype.endpoint;\n\n/**\n * Please note there is an intent to deprecate this field in Chrome 43 or 44.\n * See https://www.chromestatus.com/feature/5283829761703936.\n * @type {string}\n */\nPushSubscription.prototype.subscriptionId;\n\n/** @type {!PushSubscriptionOptions} */\nPushSubscription.prototype.options;\n\n/** @return {!Promise} */\nPushSubscription.prototype.unsubscribe = function() {};\n\n/** @enum {string} */\n// This is commented out since it has not been implemented yet in Chrome beta.\n// Uncomment once it is available.\n// var PushPermissionStatus  = {\n//  GRANTED: 'granted',\n//  DENIED: 'denied',\n//  DEFAULT: 'default'\n//};\n\n/**\n * @see https://w3c.github.io/push-api/#idl-def-PushManager\n * @constructor\n */\nfunction PushManager() {}\n\n/**\n * @param {PushSubscriptionOptionsInit=} opt_options\n * @return {!Promise}\n */\nPushManager.prototype.subscribe = function(opt_options) {};\n\n/** @return {!Promise} */\nPushManager.prototype.getSubscription = function() {};\n\n/** @return {!Promise} */\n// This is commented out since it has not been implemented yet in Chrome beta.\n// Uncomment once it is available.\n// PushManager.prototype.hasPermission = function() {};\n\n/**\n * @see https://wicg.github.io/BackgroundSync/spec/#sync-manager-interface\n * @constructor\n */\nfunction SyncManager() {}\n\n/**\n * @param {string} tag\n * @return {!Promise}\n */\nSyncManager.prototype.register = function(tag) {}\n\n/**\n * @return {!Promise>}\n */\nSyncManager.prototype.getTags = function() {}\n\n/**\n * @see https://wicg.github.io/BackgroundSync/spec/#sync-event\n * @constructor\n * @extends{ExtendableEvent}\n */\nfunction SyncEvent() {}\n\n/** @type {string} */\nSyncEvent.prototype.tag;\n\n/** @type {boolean} */\nSyncEvent.prototype.lastChance;\n\n/**\n * @see http://www.w3.org/TR/push-api/#idl-def-PushMessageData\n * @constructor\n */\nfunction PushMessageData() {}\n\n/** @return {!ArrayBuffer} */\nPushMessageData.prototype.arrayBuffer = function() {};\n\n/** @return {!Blob} */\nPushMessageData.prototype.blob = function() {};\n\n/** @return {*} */\nPushMessageData.prototype.json = function() {};\n\n/** @return {string} */\nPushMessageData.prototype.text = function() {};\n\n\n/**\n * @see http://www.w3.org/TR/push-api/#idl-def-PushEvent\n * @constructor\n * @param {string} type\n * @param {!ExtendableEventInit=} opt_eventInitDict\n * @extends {ExtendableEvent}\n */\nfunction PushEvent(type, opt_eventInitDict) {}\n\n/** @type {?PushMessageData} */\nPushEvent.prototype.data;\n\n\n/**\n * @see http://www.w3.org/TR/service-workers/#service-worker-registration-interface\n * @interface\n * @extends {EventTarget}\n */\nfunction ServiceWorkerRegistration() {}\n\n/** @type {ServiceWorker} */\nServiceWorkerRegistration.prototype.installing;\n\n/** @type {ServiceWorker} */\nServiceWorkerRegistration.prototype.waiting;\n\n/** @type {ServiceWorker} */\nServiceWorkerRegistration.prototype.active;\n\n/** @type {NavigationPreloadManager} */\nServiceWorkerRegistration.prototype.navigationPreload;\n\n/** @type {string} */\nServiceWorkerRegistration.prototype.scope;\n\n/** @return {!Promise} */\nServiceWorkerRegistration.prototype.unregister = function() {};\n\n/** @type {?function(!Event)} */\nServiceWorkerRegistration.prototype.onupdatefound;\n\n/** @return {!Promise} */\nServiceWorkerRegistration.prototype.update = function() {};\n\n/**\n * @see https://w3c.github.io/push-api/\n * @type {!PushManager}\n */\nServiceWorkerRegistration.prototype.pushManager;\n\n/**\n * @see https://notifications.spec.whatwg.org/#service-worker-api\n * @param {string} title\n * @param {NotificationOptions=} opt_options\n * @return {!Promise}\n */\nServiceWorkerRegistration.prototype.showNotification =\n    function(title, opt_options) {};\n\n/**\n * @see https://notifications.spec.whatwg.org/#service-worker-api\n * @param {!GetNotificationOptions=} opt_filter\n * @return {!Promise>}\n */\nServiceWorkerRegistration.prototype.getNotifications = function(opt_filter) {};\n\n/**\n * @see https://wicg.github.io/BackgroundSync/spec/#service-worker-registration-extensions\n * @type {!SyncManager}\n */\nServiceWorkerRegistration.prototype.sync;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#service-worker-container-interface\n * @interface\n * @extends {EventTarget}\n */\nfunction ServiceWorkerContainer() {}\n\n/** @type {?ServiceWorker} */\nServiceWorkerContainer.prototype.controller;\n\n/** @type {!Promise} */\nServiceWorkerContainer.prototype.ready;\n\n/**\n * @param {string} scriptURL\n * @param {RegistrationOptions=} opt_options\n * @return {!Promise}\n */\nServiceWorkerContainer.prototype.register = function(scriptURL, opt_options) {};\n\n/**\n * @param {string=} opt_documentURL\n * @return {!Promise}\n */\nServiceWorkerContainer.prototype.getRegistration = function(opt_documentURL) {};\n\n/**\n * @return {!Promise>}\n */\nServiceWorkerContainer.prototype.getRegistrations = function() {};\n\n/** @type {?function(!Event): void} */\nServiceWorkerContainer.prototype.oncontrollerchange;\n\n/** @type {?function(!ExtendableMessageEvent): void} */\nServiceWorkerContainer.prototype.onmessage;\n\n/** @type {?function(!ErrorEvent): void} */\nServiceWorkerContainer.prototype.onerror;\n\n/**\n * @typedef {{scope: (string|undefined), useCache: (boolean|undefined), updateViaCache: (string|undefined)}}\n */\nvar RegistrationOptions;\n\n/** @type {!ServiceWorkerContainer} */\nNavigator.prototype.serviceWorker;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#service-worker-global-scope-interface\n * @interface\n * @extends {WorkerGlobalScope}\n */\nfunction ServiceWorkerGlobalScope() {}\n\n/** @type {!Cache} */\nServiceWorkerGlobalScope.prototype.scriptCache;\n\n/** @type {!CacheStorage} */\nServiceWorkerGlobalScope.prototype.caches;\n\n/** @type {!ServiceWorkerClients} */\nServiceWorkerGlobalScope.prototype.clients;\n\n/** @type {string} */\nServiceWorkerGlobalScope.prototype.scope;\n\n/** @type {!ServiceWorkerRegistration} */\nServiceWorkerGlobalScope.prototype.registration;\n\n/** @return {!Promise} */\nServiceWorkerGlobalScope.prototype.skipWaiting = function() {};\n\n/** @type {!Console} */\nServiceWorkerGlobalScope.prototype.console;\n\n/** @type {?function(!InstallEvent)} */\nServiceWorkerGlobalScope.prototype.oninstall;\n\n/** @type {?function(!ExtendableEvent)} */\nServiceWorkerGlobalScope.prototype.onactivate;\n\n/** @type {?function(!FetchEvent)} */\nServiceWorkerGlobalScope.prototype.onfetch;\n\n/**\n * TODO(mtragut): This handler should get a custom event in the future.\n * @type {?function(!Event)}\n */\nServiceWorkerGlobalScope.prototype.onbeforeevicted;\n\n/**\n * TODO(mtragut): This handler should get a custom event in the future.\n * @type {?function(!Event)}\n */\nServiceWorkerGlobalScope.prototype.onevicted;\n\n/** @type {?function(!MessageEvent)} */\nServiceWorkerGlobalScope.prototype.onmessage;\n\n/**\n * While not strictly correct, this should be effectively correct. Notification\n * is the Notification constructor but calling it from the Service Worker throws\n * (https://notifications.spec.whatwg.org/#constructors) so its only use is as\n * an object holding some static properties (note that requestPermission is only\n * exposed to window context - https://notifications.spec.whatwg.org/#api).\n *\n * @type {{\n *   permission: string,\n *   maxActions: number,\n * }}\n */\nServiceWorkerGlobalScope.prototype.Notification;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#service-worker-client-interface\n * @constructor\n */\nfunction ServiceWorkerClient() {}\n\n/** @type {!Promise} */\nServiceWorkerClient.prototype.ready;\n\n/** @type {boolean} */\nServiceWorkerClient.prototype.hidden;\n\n/** @type {boolean} */\nServiceWorkerClient.prototype.focused;\n\n/** @type {VisibilityState} */\nServiceWorkerClient.prototype.visibilityState;\n\n/** @type {string} */\nServiceWorkerClient.prototype.url;\n\n/** @type {string} */\nServiceWorkerClient.prototype.id;\n\n/**\n * // TODO(mtragut): Possibly replace the type with enum ContextFrameType once\n * the enum is defined.\n * @type {string}\n */\nServiceWorkerClient.prototype.frameType;\n\n/**\n * @param {*} message\n * @param {(!Array|undefined)=} opt_transfer\n * @return {undefined}\n */\nServiceWorkerClient.prototype.postMessage = function(message, opt_transfer) {};\n\n/** @return {!Promise} */\nServiceWorkerClient.prototype.focus = function() {};\n\n/**\n * @param {string} url\n * @return {!Promise}\n */\nServiceWorkerClient.prototype.navigate = function(url) {};\n\n/**\n * @see http://www.w3.org/TR/service-workers/#service-worker-clients-interface\n * @interface\n */\nfunction ServiceWorkerClients() {}\n\n/**\n * Deprecated in Chrome M43+, use matchAll instead. Reference:\n * https://github.com/slightlyoff/ServiceWorker/issues/610.\n * TODO(joeltine): Remove when getAll is fully deprecated.\n * @param {ServiceWorkerClientQueryOptions=} opt_options\n * @return {!Promise>}\n */\nServiceWorkerClients.prototype.getAll = function(opt_options) {};\n\n/**\n * @param {ServiceWorkerClientQueryOptions=} opt_options\n * @return {!Promise>}\n */\nServiceWorkerClients.prototype.matchAll = function(opt_options) {};\n\n/**\n * @return {!Promise}\n */\nServiceWorkerClients.prototype.claim = function() {};\n\n/**\n * @param {string} url\n * @return {!Promise}\n */\nServiceWorkerClients.prototype.openWindow = function(url) {};\n\n/**\n * @param {string} id\n * @return {!Promise}\n */\nServiceWorkerClients.prototype.get = function(id) {};\n\n/** @typedef {{includeUncontrolled: (boolean|undefined)}} */\nvar ServiceWorkerClientQueryOptions;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#cache-interface\n * @interface\n */\nfunction Cache() {}\n\n/**\n * @param {!RequestInfo} request\n * @param {CacheQueryOptions=} opt_options\n * @return {!Promise}\n */\nCache.prototype.match = function(request, opt_options) {};\n\n/**\n * @param {RequestInfo=} opt_request\n * @param {CacheQueryOptions=} opt_options\n * @return {!Promise>}\n */\nCache.prototype.matchAll = function(opt_request, opt_options) {};\n\n/**\n * @param {!RequestInfo} request\n * @return {!Promise}\n */\nCache.prototype.add = function(request) {};\n\n/**\n * @param {!Array} requests\n * @return {!Promise}\n */\nCache.prototype.addAll = function(requests) {};\n\n/**\n * @param {!RequestInfo} request\n * @param {!Response} response\n * @return {!Promise}\n */\nCache.prototype.put = function(request, response) {};\n\n/**\n * @param {!RequestInfo} request\n * @param {CacheQueryOptions=} opt_options\n * @return {!Promise}\n */\nCache.prototype.delete = function(request, opt_options) {};\n\n/**\n * @param {RequestInfo=} opt_request\n * @param {CacheQueryOptions=} opt_options\n * @return {!Promise>}\n */\nCache.prototype.keys = function(opt_request, opt_options) {};\n\n/**\n * @typedef {{\n *   ignoreSearch: (boolean|undefined),\n *   ignoreMethod: (boolean|undefined),\n *   ignoreVary: (boolean|undefined),\n *   prefixMatch: (boolean|undefined),\n *   cacheName: (string|undefined)\n * }}\n */\nvar CacheQueryOptions;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#cache-storage-interface\n * @interface\n */\nfunction CacheStorage() {}\n\n/**\n * Window instances have a property called caches which implements CacheStorage\n * @see https://www.w3.org/TR/service-workers/#cache-objects\n * @type {!CacheStorage}\n */\nWindow.prototype.caches;\n\n/**\n * @param {!RequestInfo} request\n * @param {CacheQueryOptions=} opt_options\n * @return {!Promise}\n */\nCacheStorage.prototype.match = function(request, opt_options) {};\n\n/**\n * @param {string} cacheName\n * @return {!Promise}\n */\nCacheStorage.prototype.has = function(cacheName) {};\n\n/**\n * @param {string} cacheName\n * @return {!Promise}\n */\nCacheStorage.prototype.open = function(cacheName) {};\n\n/**\n * @param {string} cacheName\n * @return {!Promise}\n */\nCacheStorage.prototype.delete = function(cacheName) {};\n\n/** @return {!Promise>} */\nCacheStorage.prototype.keys = function() {};\n\n/**\n * @see http://www.w3.org/TR/service-workers/#extendable-event-interface\n * @constructor\n * @param {string} type\n * @param {ExtendableEventInit=} opt_eventInitDict\n * @extends {Event}\n */\nfunction ExtendableEvent(type, opt_eventInitDict) {}\n\n/**\n * @param {IThenable} f\n * @return {undefined}\n */\nExtendableEvent.prototype.waitUntil = function(f) {};\n\n/**\n * @typedef {{\n *   bubbles: (boolean|undefined),\n *   cancelable: (boolean|undefined)\n * }}\n */\nvar ExtendableEventInit;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#install-event-interface\n * @constructor\n * @param {string} type\n * @param {InstallEventInit=} opt_eventInitDict\n * @extends {ExtendableEvent}\n */\nfunction InstallEvent(type, opt_eventInitDict) {}\n\n/** @type {ServiceWorker} */\nExtendableEvent.prototype.activeWorker;\n\n/**\n * @typedef {{\n *   bubbles: (boolean|undefined),\n *   cancelable: (boolean|undefined),\n *   activeWorker: (!ServiceWorker|undefined)\n * }}\n */\nvar InstallEventInit;\n\n/**\n * @see http://www.w3.org/TR/service-workers/#fetch-event-interface\n * @constructor\n * @param {string} type\n * @param {FetchEventInit=} opt_eventInitDict\n * @extends {ExtendableEvent}\n */\nfunction FetchEvent(type, opt_eventInitDict) {}\n\n/** @type {!Request} */\nFetchEvent.prototype.request;\n\n/**\n * @type {!Promise}\n */\nFetchEvent.prototype.preloadResponse;\n\n/**\n * @type {!ServiceWorkerClient}\n * @deprecated\n */\nFetchEvent.prototype.client;\n\n/** @type {?string} */\nFetchEvent.prototype.clientId;\n\n/** @type {boolean} */\nFetchEvent.prototype.isReload;\n\n/** @type {?string} */\nFetchEvent.prototype.resultingClientId;\n\n/**\n * @param {(Response|IThenable)} r\n * @return {undefined}\n */\nFetchEvent.prototype.respondWith = function(r) {};\n\n/**\n * @param {string} url\n * @return {!Promise}\n */\nFetchEvent.prototype.forwardTo = function(url) {};\n\n/**\n * @return {!Promise}\n */\nFetchEvent.prototype.default = function() {};\n\n/**\n * @typedef {{\n *   bubbles: (boolean|undefined),\n *   cancelable: (boolean|undefined),\n *   request: (!Request|undefined),\n *   preloadResponse: (!Promise),\n *   client: (!ServiceWorkerClient|undefined),\n *   isReload: (boolean|undefined)\n * }}\n */\nvar FetchEventInit;\n\n\n/**\n * @see https://www.w3.org/TR/service-workers/#extendablemessage-event-interface\n * @param {string} type\n * @param {!ExtendableMessageEventInit=} opt_eventInitDict\n * @constructor\n * @extends {ExtendableEvent}\n * @template T\n */\nfunction ExtendableMessageEvent(type, opt_eventInitDict) {};\n\n/** @type {T} */\nExtendableMessageEvent.prototype.data;\n\n/** @type {string} */\nExtendableMessageEvent.prototype.origin;\n\n/** @type {string} */\nExtendableMessageEvent.prototype.lastEventId;\n\n/** @type {?ServiceWorkerClient|?ServiceWorker|?MessagePort} */\nExtendableMessageEvent.prototype.source;\n\n/** @type {?Array} */\nExtendableMessageEvent.prototype.ports;\n\n\n/**\n * @see https://www.w3.org/TR/service-workers/#extendablemessage-event-init-dictionary\n * @record\n * @extends {ExtendableEventInit}\n * @template T\n */\nfunction ExtendableMessageEventInit() {};\n\n/** @type {T} */\nExtendableMessageEventInit.prototype.data;\n\n/** @type {string|undefined} */\nExtendableMessageEventInit.prototype.origin;\n\n/** @type {string|undefined} */\nExtendableMessageEventInit.prototype.lastEventId;\n\n/** @type {!ServiceWorkerClient|!ServiceWorker|!MessagePort|undefined} */\nExtendableMessageEventInit.prototype.source;\n\n/** @type {!Array|undefined} */\nExtendableMessageEventInit.prototype.ports;\n","externs/w3c_speech.js":"/*\n * Copyright 2011 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Speech Input 2010 draft API and the\n * 2012 Web Speech draft API (in progress).\n * 2010 Speech Input API:\n * http://www.w3.org/2005/Incubator/htmlspeech/2010/10/google-api-draft.html\n * 2012 Web Speech API:\n * http://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html\n * This file contains only those functions/properties that are actively\n * used in the Voice Search experiment. Because the draft is under discussion\n * and constantly evolving, this file does not attempt to stay in sync with it.\n *\n * @externs\n * @author [email protected] (Manas Tungare)\n */\n\n// W3C Speech Input API implemented in Chrome M12\n/**\n * @constructor\n * @extends {UIEvent}\n */\nfunction SpeechInputEvent() {}\n\n/** @type {SpeechInputResultList} */\nSpeechInputEvent.prototype.results;\n\n\n/**\n * @constructor\n */\nfunction SpeechInputResultList() {}\n\n/** @type {number} */\nSpeechInputResultList.prototype.length;\n\n\n/**\n * @constructor\n */\nfunction SpeechInputResult() {}\n\n/** @type {string} */\nSpeechInputResult.prototype.utterance;\n\n/** @type {number} */\nSpeechInputResult.prototype.confidence;\n\n\n// HTMLInputElement\n/** @type {boolean} */\nHTMLInputElement.prototype.webkitspeech;\n\n/** @type {?function (Event)} */\nHTMLInputElement.prototype.onwebkitspeechchange;\n\n\n\n// W3C Web Speech API implemented in Chrome M23\n/**\n * @constructor\n * @implements {EventTarget}\n */\nfunction SpeechRecognition() {}\n\n/** @override */\nSpeechRecognition.prototype.addEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nSpeechRecognition.prototype.removeEventListener = function(\n    type, listener, opt_options) {};\n\n/** @override */\nSpeechRecognition.prototype.dispatchEvent = function(evt) {};\n\n/** @type {SpeechGrammarList} */\nSpeechRecognition.prototype.grammars;\n\n/** @type {string} */\nSpeechRecognition.prototype.lang;\n\n/** @type {boolean} */\nSpeechRecognition.prototype.continuous;\n\n/** @type {boolean} */\nSpeechRecognition.prototype.interimResults;\n\n/** @type {number} */\nSpeechRecognition.prototype.maxAlternatives;\n\n/** @type {string} */\nSpeechRecognition.prototype.serviceURI;\n\n/** @type {function()} */\nSpeechRecognition.prototype.start;\n\n/** @type {function()} */\nSpeechRecognition.prototype.stop;\n\n/** @type {function()} */\nSpeechRecognition.prototype.abort;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onaudiostart;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onsoundstart;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onspeechstart;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onspeechend;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onsoundend;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onaudioend;\n\n/** @type {?function(!SpeechRecognitionEvent)} */\nSpeechRecognition.prototype.onresult;\n\n/** @type {?function(!SpeechRecognitionEvent)} */\nSpeechRecognition.prototype.onnomatch;\n\n/** @type {?function(!SpeechRecognitionError)} */\nSpeechRecognition.prototype.onerror;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onstart;\n\n/** @type {?function(!Event)} */\nSpeechRecognition.prototype.onend;\n\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction SpeechRecognitionError() {}\n\n/** @type {string} */\nSpeechRecognitionError.prototype.error;\n\n/** @type {string} */\nSpeechRecognitionError.prototype.message;\n\n\n/**\n * @constructor\n */\nfunction SpeechRecognitionAlternative() {}\n\n/** @type {string} */\nSpeechRecognitionAlternative.prototype.transcript;\n\n/** @type {number} */\nSpeechRecognitionAlternative.prototype.confidence;\n\n\n/**\n * @constructor\n */\nfunction SpeechRecognitionResult() {}\n\n/**\n * @type {number}\n */\nSpeechRecognitionResult.prototype.length;\n\n/**\n * @type {function(number): SpeechRecognitionAlternative}\n */\nSpeechRecognitionResult.prototype.item = function(index) {};\n\n/**\n * @type {boolean}\n */\nSpeechRecognitionResult.prototype.isFinal;\n\n\n/**\n * @constructor\n */\nfunction SpeechRecognitionResultList() {}\n\n/**\n * @type {number}\n */\nSpeechRecognitionResultList.prototype.length;\n\n/**\n * @type {function(number): SpeechRecognitionResult}\n */\nSpeechRecognitionResultList.prototype.item = function(index) {};\n\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction SpeechRecognitionEvent() {}\n\n/** @type {number} */\nSpeechRecognitionEvent.prototype.resultIndex;\n\n/** @type {SpeechRecognitionResultList} */\nSpeechRecognitionEvent.prototype.results;\n\n/** @type {*} */\nSpeechRecognitionEvent.prototype.interpretation;\n\n/** @type {Document} */\nSpeechRecognitionEvent.prototype.emma;\n\n\n/**\n * @constructor\n */\nfunction SpeechGrammar() {}\n\n/** @type {string} */\nSpeechGrammar.prototype.src;\n\n/** @type {number} */\nSpeechGrammar.prototype.weight;\n\n\n/**\n * @constructor\n */\nfunction SpeechGrammarList() {}\n\n/**\n * @type {number}\n */\nSpeechGrammarList.prototype.length;\n\n/**\n * @type {function(number): SpeechGrammar}\n */\nSpeechGrammarList.prototype.item = function(index) {};\n\n/**\n * @type {function(string, number)}\n */\nSpeechGrammarList.prototype.addFromUri = function(src, weight) {};\n\n/**\n * @type {function(string, number)}\n */\nSpeechGrammarList.prototype.addFromString = function(str, weight) {};\n\n\n// Webkit implementations of Web Speech API\n/**\n * @constructor\n * @extends {SpeechGrammarList}\n */\nfunction webkitSpeechGrammarList() {}\n\n\n/**\n * @constructor\n * @extends {SpeechGrammar}\n */\nfunction webkitSpeechGrammar() {}\n\n\n/**\n * @constructor\n * @extends {SpeechRecognitionEvent}\n */\nfunction webkitSpeechRecognitionEvent() {}\n\n\n/**\n * @constructor\n * @extends {SpeechRecognitionError}\n */\nfunction webkitSpeechRecognitionError() {}\n\n\n/**\n * @constructor\n * @extends {SpeechRecognition}\n */\nfunction webkitSpeechRecognition() {}\n\n\n\n// W3C Web Speech Synthesis API is implemented in Chrome M33\n/**\n * @type {SpeechSynthesis}\n * @see https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section\n */\nvar speechSynthesis;\n\n\n/**\n * @constructor\n * @param {string} text\n */\nfunction SpeechSynthesisUtterance(text) {}\n\n/** @type {string} */\nSpeechSynthesisUtterance.prototype.text;\n\n/** @type {string} */\nSpeechSynthesisUtterance.prototype.lang;\n\n/** @type {number} */\nSpeechSynthesisUtterance.prototype.pitch;\n\n/** @type {number} */\nSpeechSynthesisUtterance.prototype.rate;\n\n/** @type {SpeechSynthesisVoice} */\nSpeechSynthesisUtterance.prototype.voice;\n\n/** @type {number} */\nSpeechSynthesisUtterance.prototype.volume;\n\n/**\n * @param {Event} event\n */\nSpeechSynthesisUtterance.prototype.onstart = function(event) {};\n\n/**\n * @param {Event} event\n */\nSpeechSynthesisUtterance.prototype.onend = function(event) {};\n\n/**\n * @param {Event} event\n */\nSpeechSynthesisUtterance.prototype.onerror = function(event) {};\n\n/**\n * @constructor\n */\nfunction SpeechSynthesisVoice() {}\n\n/** @type {string} */\nSpeechSynthesisVoice.prototype.voiceURI;\n\n/** @type {string} */\nSpeechSynthesisVoice.prototype.name;\n\n/** @type {string} */\nSpeechSynthesisVoice.prototype.lang;\n\n/** @type {boolean} */\nSpeechSynthesisVoice.prototype.localService;\n\n/** @type {boolean} */\nSpeechSynthesisVoice.prototype.default;\n\n\n/**\n * @constructor\n * @extends {Array}\n */\nfunction SpeechSynthesisVoiceList() {}\n\n\n/**\n * @interface\n * @extends {EventTarget}\n */\nfunction SpeechSynthesis() {}\n\n/**\n * @param {SpeechSynthesisUtterance} utterance\n * @return {undefined}\n */\nSpeechSynthesis.prototype.speak = function(utterance) {};\n\n/** @type {function()} */\nSpeechSynthesis.prototype.cancel;\n\n/** @type {function()} */\nSpeechSynthesis.prototype.pause;\n\n/** @type {function()} */\nSpeechSynthesis.prototype.resume;\n\n/**\n * @return {SpeechSynthesisVoiceList}\n */\nSpeechSynthesis.prototype.getVoices = function() {};\n\n/**\n * @param {Event} event\n * @see https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi-errata.html\n */\nSpeechSynthesis.prototype.onvoiceschanged = function(event) {};\n","externs/w3c_touch_event.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's Touch Events specification.\n * @see http://www.w3.org/TR/touch-events/\n * @externs\n */\n\n/**\n * @typedef {{\n *   identifier: number,\n *   target: !EventTarget,\n *   clientX: (number|undefined),\n *   clientY: (number|undefined),\n *   screenX: (number|undefined),\n *   screenY: (number|undefined),\n *   pageX: (number|undefined),\n *   pageY: (number|undefined),\n *   radiusX: (number|undefined),\n *   radiusY: (number|undefined),\n *   rotationAngle: (number|undefined),\n *   force: (number|undefined)\n * }}\n */\nvar TouchInitDict;\n\n/**\n * The Touch class represents a single touch on the surface. A touch is the\n * presence or movement of a finger that is part of a unique multi-touch\n * sequence.\n * @see http://www.w3.org/TR/touch-events/#touch-interface\n * @param {!TouchInitDict} touchInitDict\n * @constructor\n */\nfunction Touch(touchInitDict) {}\n\n/**\n * The x-coordinate of the touch's location relative to the window's viewport.\n * @type {number}\n */\nTouch.prototype.clientX;\n\n/**\n * The y-coordinate of the touch's location relative to the window's viewport.\n * @type {number}\n */\nTouch.prototype.clientY;\n\n/**\n * The unique identifier for this touch object.\n * @type {number}\n */\nTouch.prototype.identifier;\n\n/**\n * The x-coordinate of the touch's location in page coordinates.\n * @type {number}\n */\nTouch.prototype.pageX;\n\n/**\n * The y-coordinate of the touch's location in page coordinates.\n * @type {number}\n */\nTouch.prototype.pageY;\n\n/**\n * The x-coordinate of the touch's location in screen coordinates.\n * @type {number}\n */\nTouch.prototype.screenX;\n\n/**\n * The y-coordinate of the touch's location in screen coordinates.\n * @type {number}\n */\nTouch.prototype.screenY;\n\n/**\n * The target of this touch.\n * @type {EventTarget}\n */\nTouch.prototype.target;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/touch-events-extensions/#widl-Touch-force\n */\nTouch.prototype.force;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/touch-events-extensions/#widl-Touch-radiusX\n */\nTouch.prototype.radiusX;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/touch-events-extensions/#widl-Touch-radiusY\n */\nTouch.prototype.radiusY;\n\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/2011/WD-touch-events-20110505/#widl-Touch-rotationAngle\n */\nTouch.prototype.rotationAngle;\n\n\n/**\n * Creates a new Touch object.\n * @see http://www.w3.org/TR/touch-events/#widl-Document-createTouch-Touch-WindowProxy-view-EventTarget-target-long-identifier-long-pageX-long-pageY-long-screenX-long-screenY\n * @param {Window} view\n * @param {EventTarget} target\n * @param {number} identifier\n * @param {number} pageX\n * @param {number} pageY\n * @param {number} screenX\n * @param {number} screenY\n * @return {Touch}\n */\nDocument.prototype.createTouch = function(view, target, identifier, pageX,\n    pageY, screenX, screenY) {};\n\n\n/**\n * The TouchList class is used to represent a collection of Touch objects.\n * @see http://www.w3.org/TR/touch-events/#touchlist-interface\n * @constructor\n * @implements {IArrayLike}\n */\nfunction TouchList() {}\n\n/**\n * The number of Touch objects in this TouchList object.\n * @type {number}\n */\nTouchList.prototype.length;\n\n/**\n * Returns the Touch object at the given index.\n * @param {number} index\n * @return {?Touch}\n */\nTouchList.prototype.item = function(index) {};\n\n/**\n * @param {number} identifier\n * @return {?Touch}\n * @see http://www.w3.org/TR/touch-events-extensions/#widl-TouchList-identifiedTouch-Touch-long-identifier\n */\nTouchList.prototype.identifiedTouch = function(identifier) {};\n\n/**\n * Creates a new TouchList object.\n * @see http://www.w3.org/TR/touch-events/#widl-Document-createTouchList-TouchList-Touch-touches\n * @param {Array} touches\n * @return {TouchList}\n */\nDocument.prototype.createTouchList = function(touches) {};\n\n/**\n * @record\n * @extends {UIEventInit}\n */\nfunction TouchEventInit() {}\n\n/** @type {undefined|?EventTarget} */\nTouchEventInit.prototype.relatedTarget;\n\n/** @type {undefined|!Array} */\nTouchEventInit.prototype.touches;\n\n/** @type {undefined|!Array} */\nTouchEventInit.prototype.targetTouches;\n\n/** @type {undefined|!Array} */\nTouchEventInit.prototype.changedTouches;\n\n/**\n * The TouchEvent class encapsulates information about a touch event.\n *\n * 

The system continually sends TouchEvent objects to an application as\n * fingers touch and move across a surface. A touch event provides a snapshot of\n * all touches during a multi-touch sequence, most importantly the touches that\n * are new or have changed for a particular target. A multi-touch sequence\n * begins when a finger first touches the surface. Other fingers may\n * subsequently touch the surface, and all fingers may move across the surface.\n * The sequence ends when the last of these fingers is lifted from the surface.\n * An application receives touch event objects during each phase of any touch.\n *

\n *\n *

The different types of TouchEvent objects that can occur are:\n *

    \n *
  • touchstart - Sent when a finger for a given event touches the surface.\n *
  • touchmove - Sent when a given event moves on the surface.\n *
  • touchend - Sent when a given event lifts from the surface.\n *
  • touchcancel - Sent when the system cancels tracking for the touch.\n *
\n * TouchEvent objects are combined together to form high-level GestureEvent\n * objects that are also sent during a multi-touch sequence.

\n *\n * @see http://www.w3.org/TR/touch-events/#touchevent-interface\n * @param {string} type\n * @param {!TouchEventInit=} opt_eventInitDict\n * @extends {UIEvent}\n * @constructor\n */\nfunction TouchEvent(type, opt_eventInitDict) {}\n\n/**\n * A collection of Touch objects representing all touches associated with this\n * target.\n * @type {TouchList}\n */\nTouchEvent.prototype.touches;\n\n/**\n * A collection of Touch objects representing all touches associated with this\n * target.\n * @type {TouchList}\n */\nTouchEvent.prototype.targetTouches;\n\n/**\n * A collection of Touch objects representing all touches that changed in this event.\n * @type {TouchList}\n */\nTouchEvent.prototype.changedTouches;\n\n/**\n * @type {boolean}\n */\nTouchEvent.prototype.altKey;\n\n/**\n * @type {boolean}\n */\nTouchEvent.prototype.metaKey;\n\n/**\n * @type {boolean}\n */\nTouchEvent.prototype.ctrlKey;\n\n/**\n * @type {boolean}\n */\nTouchEvent.prototype.shiftKey;\n\n\n/**\n * Specifies the JavaScript method to invoke when the system cancels tracking\n * for the touch.\n * @type {?function(!TouchEvent)}\n */\nElement.prototype.ontouchcancel;\n\n/**\n * Specifies the JavaScript method to invoke when a given event lifts from the\n * surface.\n * @type {?function(!TouchEvent)}\n */\nElement.prototype.ontouchend;\n\n/**\n * Specifies the JavaScript method to invoke when a finger for a given event\n * moves on the surface.\n * @type {?function(!TouchEvent)}\n */\nElement.prototype.ontouchmove;\n\n/**\n * Specifies the JavaScript method to invoke when a finger for a given event\n * touches the surface.\n * @type {?function(!TouchEvent)}\n */\nElement.prototype.ontouchstart;\n","externs/w3c_vibration.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for Vibration API based on \"W3C Recommendation 18 October 2016\"\n * @see https://www.w3.org/TR/2016/REC-vibration-20161018/\n *\n * @externs\n * @author [email protected] (Martin Vobruba)\n */\n\n\n/**\n * @typedef {number|!Array}\n * @see https://www.w3.org/TR/2016/REC-vibration-20161018/#idl-def-vibratepattern\n */\nvar VibratePattern;\n\n\n/**\n * @param {!VibratePattern} pattern\n * @return {boolean}\n * @see https://www.w3.org/TR/2016/REC-vibration-20161018/#idl-def-navigator-vibrate(vibratepattern)\n */\nNavigator.prototype.vibrate = function(pattern) {};\n","externs/w3c_webcrypto.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview Definitions for W3C's Web Cryptography specification\n * http://www.w3.org/TR/webCryptoAPI\n * @externs\n * @author [email protected] (Chris Moon)\n * This file was created using the best practices as described in:\n * chrome_extensions.js\n */\n\n\n/**\n * @const\n * @see http://www.w3.org/TR/webCryptoAPI\n */\nvar webCrypto = {};\n\n\n/**\n * @typedef {?{\n * name: string\n * }}\n * @see http://www.w3.org/TR/WebCryptoAPI/#algorithm-dictionary\n */\nwebCrypto.Algorithm;\n\n\n/**\n * @typedef {string|!webCrypto.Algorithm}\n * @see http://www.w3.org/TR/WebCryptoAPI/#dfn-AlgorithmIdentifier\n */\nwebCrypto.AlgorithmIdentifier;\n\n/**\n * @typedef {webCrypto.AlgorithmIdentifier}\n * @see http://www.w3.org/TR/WebCryptoAPI/#dfn-HashAlgorithmIdentifier\n */\nwebCrypto.HashAlgorithmIdentifier;\n\n\n/**\n * @typedef {Uint8Array}\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-BigInteger\n */\nwebCrypto.BigInteger;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/webCryptoAPI/#dfn-CryptoKey\n */\nwebCrypto.CryptoKey = function() {};\n\n\n/**\n * @type {string} An enumerated value representing the type of the key, a secret\n * key (for symmetric algorithm), a public or a private key\n * (for an asymmetric algorithm).\n */\nwebCrypto.CryptoKey.prototype.type;\n\n\n/**\n * @type {boolean} Determines whether or not the raw keying material may be\n * exported by the application.\n */\nwebCrypto.CryptoKey.prototype.extractable;\n\n\n/**\n * @type {!Object} An opaque object representing a particular cipher the key\n * has to be used with.\n */\nwebCrypto.CryptoKey.prototype.algorithm;\n\n\n/**\n * @type {!Object} Returns the cached ECMAScript object associated with the\n * usages internal slot, which indicates which cryptographic operations are\n * permissible to be used with this key.\n */\nwebCrypto.CryptoKey.prototype.usages;\n\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/WebCryptoAPI/#keypair\n */\nwebCrypto.CryptoKeyPair = function() {};\n\n\n/**\n * @type {!webCrypto.CryptoKey}\n */\nwebCrypto.CryptoKeyPair.prototype.publicKey;\n\n\n/**\n * @type {!webCrypto.CryptoKey}\n */\nwebCrypto.CryptoKeyPair.prototype.privateKey;\n\n\n/**\n * @typedef {?{\n * name: string\n * }}\n * @see http://www.w3.org/TR/WebCryptoAPI/#key-algorithm-dictionary-members\n */\nwebCrypto.KeyAlgorithm;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/WebCryptoAPI/#dfn-JsonWebKey\n * @see Section 3.1:\n * https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41\n */\nwebCrypto.JsonWebKey = function() {};\n\n\n/**\n * @type {string} Identifies the cryptographic algorithm family used with\n * the key, such as \"RSA\" or \"EC\".\n */\nwebCrypto.JsonWebKey.prototype.kty;\n\n\n/**\n * @type {string} Identifies the intended use of the public key.\n */\nwebCrypto.JsonWebKey.prototype.use;\n\n\n/**\n * @type {!Array} Identifies the operation(s) that the key is\n * intended to be used for.\n */\nwebCrypto.JsonWebKey.prototype.key_ops;\n\n\n/**\n * @type {string} Identifies the algorithm intended for use with the key.\n */\nwebCrypto.JsonWebKey.prototype.alg;\n\n\n/**\n * @type {boolean} Boolean to be used with kty values.\n */\nwebCrypto.JsonWebKey.prototype.ext;\n\n\n/**\n * @type {string} Identifies the cryptographic curve used with the key.\n */\nwebCrypto.JsonWebKey.prototype.crv;\n\n\n/**\n * @type {string} Contains the x coordinate for the elliptic curve point.\n */\nwebCrypto.JsonWebKey.prototype.x;\n\n\n/**\n * @type {string} Contains the y coordinate for the elliptic curve point.\n */\nwebCrypto.JsonWebKey.prototype.y;\n\n\n/**\n * @type {string} Contains the Elliptic Curve private key value.\n */\nwebCrypto.JsonWebKey.prototype.d;\n\n\n/**\n * @type {string} Contains the modulus value for the RSA public key.\n */\nwebCrypto.JsonWebKey.prototype.n;\n\n\n/**\n * @type {string} Contains the exponent value for the RSA public key.\n */\nwebCrypto.JsonWebKey.prototype.e;\n\n\n/**\n * @type {string} Contains the first prime factor.\n */\nwebCrypto.JsonWebKey.prototype.p;\n\n\n/**\n * @type {string} Contains the second prime factor.\n */\nwebCrypto.JsonWebKey.prototype.q;\n\n\n/**\n * @type {string} Contains the Chinese Remainder Theorem (CRT) exponent of\n * the first factor.\n */\nwebCrypto.JsonWebKey.prototype.dp;\n\n\n/**\n * @type {string} Contains the Chinese Remainder Theorem (CRT) exponent of\n * the second factor.\n */\nwebCrypto.JsonWebKey.prototype.dq;\n\n\n/**\n * @type {string} Contains the Chinese Remainder Theorem (CRT) coefficient\n * of the second factor.\n */\nwebCrypto.JsonWebKey.prototype.qi;\n\n\n/**\n * @type {!Array} Contains an array of\n * information about any third and subsequent primes, should they exist.\n */\nwebCrypto.JsonWebKey.prototype.oth;\n\n\n/**\n * @type {string} Contains the value of the symmetric (or other\n * single-valued) key.\n */\nwebCrypto.JsonWebKey.prototype.k;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/WebCryptoAPI/#dfn-RsaOtherPrimesInfo\n * @see Section-6.3.2.7:\n * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40\n */\nwebCrypto.RsaOtherPrimesInfo = function() {};\n\n\n/**\n * @type {string} Parameter within an \"oth\" array member represents the value\n * of a subsequent prime factor.\n */\nwebCrypto.RsaOtherPrimesInfo.prototype.r;\n\n\n/**\n * @type {string} Parameter within an \"oth\" array member represents the CRT\n * exponent of the corresponding prime factor.\n */\nwebCrypto.RsaOtherPrimesInfo.prototype.d;\n\n\n/**\n * @type {string} Parameter within an \"oth\" array member represents the CRT\n * coefficient of the corresponding prime factor.\n */\nwebCrypto.RsaOtherPrimesInfo.prototype.t;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaKeyGenParams\n */\nwebCrypto.RsaKeyGenParams;\n/**\n * @type {number}\n */\nwebCrypto.RsaKeyGenParams.prototype.modulusLength;\n/**\n * @type {webCrypto.BigInteger}\n */\nwebCrypto.RsaKeyGenParams.prototype.publicExponent;\n\n\n/**\n * @record\n * @extends webCrypto.RsaKeyGenParams\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaHashedKeyGenParams\n */\nwebCrypto.RsaHashedKeyGenParams;\n/**\n * @type {webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.RsaHashedKeyGenParams.prototype.hash;\n\n\n/**\n * @record\n * @extends webCrypto.KeyAlgorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaKeyAlgorithm\n */\nwebCrypto.RsaKeyAlgorithm;\n/**\n * @type {number}\n */\nwebCrypto.RsaKeyAlgorithm.prototype.modulusLength;\n/**\n * @type {webCrypto.BigInteger}\n */\nwebCrypto.RsaKeyAlgorithm.prototype.publicExponent;\n\n\n/**\n * @record\n * @extends webCrypto.RsaKeyAlgorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaHashedKeyAlgorithm\n */\nwebCrypto.RsaHashedKeyAlgorithm;\n/**\n * @type {webCrypto.KeyAlgorithm}\n */\nwebCrypto.RsaHashedKeyAlgorithm.prototype.hash;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaHashedImportParams\n */\nwebCrypto.RsaHashedImportParams;\n/**\n * @type {webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.RsaHashedImportParams.prototype.hash;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaPssParams\n */\nwebCrypto.RsaPssParams;\n/**\n * @type {number}\n */\nwebCrypto.RsaPssParams.prototype.saltLength;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaOaepParams\n */\nwebCrypto.RsaOaepParams;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.RsaOaepParams.prototype.label;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-EcdsaParams\n */\nwebCrypto.EcdsaParams;\n/**\n * @type {!webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.EcdsaParams.prototype.hash;\n\n\n/**\n * @typedef {string}\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-NamedCurve\n */\nwebCrypto.NamedCurve;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-EcKeyGenParams\n */\nwebCrypto.EcKeyGenParams;\n/**\n * @type {!webCrypto.NamedCurve}\n */\nwebCrypto.EcKeyGenParams.prototype.namedCurve;\n\n\n/**\n * @record\n * @extends webCrypto.KeyAlgorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-EcKeyAlgorithm\n */\nwebCrypto.EcKeyAlgorithm;\n/**\n * @type {!webCrypto.NamedCurve}\n */\nwebCrypto.EcKeyAlgorithm.prototype.namedCurve;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-EcKeyImportParams\n */\nwebCrypto.EcKeyImportParams;\n/**\n * @type {!webCrypto.NamedCurve}\n */\nwebCrypto.EcKeyImportParams.prototype.namedCurve;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-EcKeyDeriveParams\n */\nwebCrypto.EcKeyDeriveParams;\n/**\n * @type {!webCrypto.CryptoKey}\n */\nwebCrypto.EcKeyDeriveParams.prototype.public;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-AesCtrParams\n */\nwebCrypto.AesCtrParams;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.AesCtrParams.prototype.counter;\n/**\n * @type {number}\n */\nwebCrypto.AesCtrParams.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.KeyAlgorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-AesKeyAlgorithm\n */\nwebCrypto.AesKeyAlgorithm;\n/**\n * @type {number}\n */\nwebCrypto.AesKeyAlgorithm.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-AesKeyGenParams\n */\nwebCrypto.AesKeyGenParams;\n/**\n * @type {number}\n */\nwebCrypto.AesKeyGenParams.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-AesDerivedKeyParams\n */\nwebCrypto.AesDerivedKeyParams;\n/**\n * @type {number}\n */\nwebCrypto.AesDerivedKeyParams.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-AesCbcParams\n */\nwebCrypto.AesCbcParams;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.AesCbcParams.prototype.iv;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-AesGcmParams\n */\nwebCrypto.AesGcmParams;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.AesGcmParams.prototype.iv;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.AesGcmParams.prototype.additionalData;\n/**\n * @type {number}\n */\nwebCrypto.AesGcmParams.prototype.tagLength;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-HmacImportParams\n */\nwebCrypto.HmacImportParams;\n/**\n * @type {!webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.HmacImportParams.prototype.hash;\n/**\n * @type {number}\n */\nwebCrypto.HmacImportParams.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.KeyAlgorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-HmacKeyAlgorithm\n */\nwebCrypto.HmacKeyAlgorithm;\n/**\n * @type {!webCrypto.KeyAlgorithm}\n */\nwebCrypto.HmacKeyAlgorithm.prototype.hash;\n/**\n * @type {number}\n */\nwebCrypto.HmacKeyAlgorithm.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-HmacKeyGenParams\n */\nwebCrypto.HmacKeyGenParams;\n/**\n * @type {!webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.HmacKeyGenParams.prototype.hash;\n/**\n * @type {number}\n */\nwebCrypto.HmacKeyGenParams.prototype.length;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-HkdfParams\n */\nwebCrypto.HkdfParams;\n/**\n * @type {!webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.HkdfParams.prototype.hash;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.HkdfParams.prototype.salt;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.HkdfParams.prototype.info;\n\n\n/**\n * @record\n * @extends webCrypto.Algorithm\n * @see https://www.w3.org/TR/WebCryptoAPI/#dfn-Pbkdf2Params\n */\nwebCrypto.Pbkdf2Params;\n/**\n * @type {!BufferSource}\n */\nwebCrypto.Pbkdf2Params.prototype.salt;\n/**\n * @type {number}\n */\nwebCrypto.Pbkdf2Params.prototype.iterations;\n/**\n * @type {!webCrypto.HashAlgorithmIdentifier}\n */\nwebCrypto.Pbkdf2Params.prototype.hash;\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/WebCryptoAPI/#subtlecrypto-interface\n */\nwebCrypto.SubtleCrypto = function() {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm Supported\n * values are: AES-CBC, AES-CTR, AES-GCM, and RSA-OAEP.\n * @param {!webCrypto.CryptoKey} key Key to be used for signing.\n * @param {!BufferSource} data Data to be encrypted (cleartext).\n * @return {!Promise} Ciphertext generated by the encryption of\n * the cleartext.\n */\nwebCrypto.SubtleCrypto.prototype.encrypt = function(algorithm, key,\n data) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm Supported\n * values are: AES-CBC, AES-CTR, AES-GCM, and RSA-OAEP.\n * @param {!webCrypto.CryptoKey} key Key to be used for signing.\n * @param {!BufferSource} data Data to be decrypted (ciphertext).\n * @return {!Promise} Cleartext generated by the decryption of the\n * ciphertext.\n */\nwebCrypto.SubtleCrypto.prototype.decrypt = function(algorithm, key,\n data) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm Supported\n * values are: HMAC, RSASSA-PKCS1-v1_5, and ECDSA.\n * @param {!webCrypto.CryptoKey} key Private key to be used for signing.\n * @param {!BufferSource} data Data to be signed.\n * @return {!Promise} Returns the signature on success.\n */\nwebCrypto.SubtleCrypto.prototype.sign = function(algorithm, key,\n data) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm Supported\n * values are: HMAC, RSASSA-PKCS1-v1_5, and ECDSA.\n * @param {!webCrypto.CryptoKey} key Private key to be used for signing.\n * @param {!BufferSource} signature Signature to verify.\n * @param {!BufferSource} data Data whose signature needs to be verified.\n * @return {!Promise} Returns if the signature operating has been\n * successful.\n */\nwebCrypto.SubtleCrypto.prototype.verify = function(algorithm, key,\n signature, data) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm Supported\n * values are: SHA-1, SHA-256, SHA-384, and SHA-512.\n * @param {!BufferSource} data Data to be hashed using the hashing algorithm.\n * @return {!Promise} returns the hash on success.\n */\nwebCrypto.SubtleCrypto.prototype.digest = function(algorithm, data) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier|webCrypto.RsaHashedKeyGenParams}\n * algorithm Supported values are: SHA-1, SHA-256, SHA-384, and SHA-512.\n * @param {boolean} extractable If the key can be extracted from the CryptoKey\n * object at a later stage.\n * @param {!Array} keyUsages Indication of new key options i.e.\n * encrypt, decrypt, sign, verify, deriveKey, deriveBits, wrapKey,\n * unwrapKey.\n * @return {!Promise} returns the\n * generated key.\n */\nwebCrypto.SubtleCrypto.prototype.generateKey = function(algorithm,\n extractable, keyUsages) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm The key derivation\n * algorithm to use. Supported values are: ECDH, DH, PBKDF2, and HKDF-CTR.\n * @param {!webCrypto.CryptoKey} baseKey Key to be used by the key\n * derivation algorithm.\n * @param {!webCrypto.AlgorithmIdentifier} derivedKeyAlgo Defines the key\n * derivation algorithm to use.\n * @param {boolean} extractable Indicates if the key can be extracted from the\n * CryptoKey object at a later stage.\n * @param {!Array} keyUsages Indicates what can be done with the\n * derivated key.\n * @return {!Promise} returns the\n * generated key.\n */\nwebCrypto.SubtleCrypto.prototype.deriveKey = function(algorithm,\n baseKey, derivedKeyAlgo, extractable, keyUsages) {};\n\n\n/**\n * @param {!webCrypto.AlgorithmIdentifier} algorithm The key derivation\n * algorithm to use.\n * @param {!webCrypto.CryptoKey} baseKey Key to be used by the key\n * derivation algorithm.\n * @param {number} length\n * @return {!Promise} returns the generated bits.\n */\nwebCrypto.SubtleCrypto.prototype.deriveBits = function(algorithm,\n baseKey, length) {};\n\n\n/**\n * @param {string} format Enumerated value describing the data\n * format of the key to imported.\n * @param {!BufferSource|!webCrypto.JsonWebKey} keyData The key\n * in the given format.\n * @param {!webCrypto.AlgorithmIdentifier|webCrypto.RsaHashedImportParams}\n * algorithm Supported values are: AES-CTR, AES-CBC, AES-GCM, RSA-OAEP,\n * AES-KW, HMAC, RSASSA-PKCS1-v1_5, ECDSA, ECDH, DH.\n * @param {boolean} extractable If the key can be extracted from the CryptoKey\n * object at a later stage.\n * @param {!Array} keyUsages Indication of new key options i.e.\n * encrypt, decrypt, sign, verify, deriveKey, deriveBits, wrapKey,\n * unwrapKey.\n * @return {!Promise} returns the generated key.\n */\nwebCrypto.SubtleCrypto.prototype.importKey = function(format, keyData,\n algorithm, extractable, keyUsages) {};\n\n\n/**\n * @param {string} format Enumerated value describing the data\n * format of the key to imported.\n * @param {!webCrypto.CryptoKey} key CryptoKey to export.\n * @return {!Promise} returns the key in the\n * requested format.\n */\nwebCrypto.SubtleCrypto.prototype.exportKey = function(format, key) {};\n\n\n/**\n * @param {string} format Value describing the data format in which the key must\n * be wrapped. It can be one of the following: raw, pkcs8, spki, jwk.\n * @param {!webCrypto.CryptoKey} key CryptoKey to wrap.\n * @param {!webCrypto.CryptoKey} wrappingKey CryptoKey used to perform\n * the wrapping.\n * @param {!webCrypto.AlgorithmIdentifier} wrapAlgorithm algorithm used\n * to perform the wrapping. It is one of the following: AES-CBC, AES-CTR,\n * AES-GCM, RSA-OAEP, and AES-KW.\n * @return {!Promise} returns the wrapped key in the requested\n * format.\n */\nwebCrypto.SubtleCrypto.prototype.wrapKey = function(format,\n key, wrappingKey, wrapAlgorithm) {};\n\n\n/**\n * @param {string} format Value describing the data format in which the key must\n * be wrapped. It can be one of the following: raw, pkcs8, spki, jwk.\n * @param {!BufferSource} wrappedKey Contains the wrapped key in the given\n * format.\n * @param {!webCrypto.CryptoKey} unwrappingKey CryptoKey used to perform\n * the unwrapping.\n * @param {!webCrypto.AlgorithmIdentifier} unwrapAlgorithm Algorithm\n * used to perform the unwrapping. It is one of the following: AES-CBC,\n * AES-CTR, AES-GCM, RSA-OAEP, and AES-KW.\n * @param {!webCrypto.AlgorithmIdentifier} unwrappedKeyAlgorithm\n * Represents the algorithm of the wrapped key.\n * @param {boolean} extractable Indicates if the key can be extracted from the\n * CryptoKey object at a later stage.\n * @param {!Array} keyUsages Indicates what can be done with the\n * derivated key.\n * @return {!Promise} returns the unwrapped key.\n */\nwebCrypto.SubtleCrypto.prototype.unwrapKey = function(format, wrappedKey,\n unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable,\n keyUsages) {};\n\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto\n * @interface\n */\nwebCrypto.Crypto = function() {};\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.crypto.getRandomValues\n * @param {!ArrayBufferView} typedArray\n * @return {!ArrayBufferView}\n * @throws {Error}\n */\nwebCrypto.Crypto.prototype.getRandomValues = function(typedArray) {};\n\n/**\n * @type {?webCrypto.SubtleCrypto}\n * @see http://www.w3.org/TR/WebCryptoAPI/#Crypto-attribute-subtle\n */\nwebCrypto.Crypto.prototype.subtle;\n\n/**\n * @see https://developer.mozilla.org/en/DOM/window.crypto\n * @type {!webCrypto.Crypto|undefined}\n */\nvar crypto;\n","externs/w3c_xml.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for W3C's XML related specifications.\n * This file depends on w3c_dom2.js.\n * The whole file has been fully type annotated.\n *\n * Provides the XML standards from W3C.\n * Includes:\n * XPath - Fully type annotated\n * XMLHttpRequest - Fully type annotated\n *\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html\n * @see https://xhr.spec.whatwg.org/\n *\n * @externs\n * @author [email protected] (Alan Leung)\n * @author [email protected] (Steve Yegge)\n */\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathException\n */\nfunction XPathException() {}\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#INVALID_EXPRESSION_ERR\n */\nXPathException.INVALID_EXPRESSION_ERR;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#TYPE_ERR\n */\nXPathException.TYPE_ERR;\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#\n */\nXPathException.prototype.code;\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator\n */\nfunction XPathEvaluator() {}\n\n/**\n * @param {string} expr\n * @param {?XPathNSResolver=} opt_resolver\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator-createExpression\n * @throws XPathException\n * @throws DOMException\n * @return {undefined}\n */\nXPathEvaluator.prototype.createExpression = function(expr, opt_resolver) {};\n\n/**\n * @param {Node} nodeResolver\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator-createNSResolver\n * @return {undefined}\n */\nXPathEvaluator.prototype.createNSResolver = function(nodeResolver) {};\n\n/**\n * @param {string} expr\n * @param {Node} contextNode\n * @param {?XPathNSResolver=} opt_resolver\n * @param {?number=} opt_type\n * @param {*=} opt_result\n * @return {XPathResult}\n * @throws XPathException\n * @throws DOMException\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator-evaluate\n */\nXPathEvaluator.prototype.evaluate = function(expr, contextNode, opt_resolver,\n opt_type, opt_result) {};\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression\n */\nfunction XPathExpression() {}\n\n/**\n * @param {Node} contextNode\n * @param {number=} opt_type\n * @param {*=} opt_result\n * @return {*}\n * @throws XPathException\n * @throws DOMException\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression-evaluate\n */\nXPathExpression.prototype.evaluate = function(contextNode, opt_type,\n opt_result) {};\n\n\n/**\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver\n */\nfunction XPathNSResolver() {}\n\n/**\n * @param {string} prefix\n * @return {?string}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver-lookupNamespaceURI\n */\nXPathNSResolver.prototype.lookupNamespaceURI = function(prefix) {};\n\n/**\n * From http://www.w3.org/TR/xpath\n *\n * XPath is a language for addressing parts of an XML document, designed to be\n * used by both XSLT and XPointer.\n *\n * @constructor\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult\n */\nfunction XPathResult() {}\n\n/**\n * @type {boolean} {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-booleanValue\n */\nXPathResult.prototype.booleanValue;\n\n/**\n * @type {boolean} {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-invalid-iterator-state\n */\nXPathResult.prototype.invalidInteratorState;\n\n/**\n * @type {number}\n * @throws XPathException {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-numberValue\n */\nXPathResult.prototype.numberValue;\n\n/**\n * @type {number}\n * @throws XPathException {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-resultType\n */\nXPathResult.prototype.resultType;\n\n/**\n * @type {Node}\n * @throws XPathException {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-singleNodeValue\n */\nXPathResult.prototype.singleNodeValue;\n\n/**\n * @type {number}\n * @throws XPathException {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-snapshot-length\n */\nXPathResult.prototype.snapshotLength;\n\n/**\n * @type {string}\n * @throws XPathException {@see XPathException.TYPE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-stringValue\n */\nXPathResult.prototype.stringValue;\n\n/**\n * @return {Node}\n * @throws XPathException {@see XPathException.TYPE_ERR}\n * @throws DOMException {@see DOMException.INVALID_STATE_ERR}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-iterateNext\n */\nXPathResult.prototype.iterateNext = function() {};\n\n/**\n * @param {number} index\n * @return {Node}\n * @throws XPathException\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-snapshotItem\n */\nXPathResult.prototype.snapshotItem = function(index) {};\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-ANY-TYPE\n */\nXPathResult.ANY_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-NUMBER-TYPE\n */\nXPathResult.NUMBER_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-STRING-TYPE\n */\nXPathResult.STRING_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-BOOLEAN-TYPE\n */\nXPathResult.BOOLEAN_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-UNORDERED-NODE-ITERATOR-TYPE\n */\nXPathResult.UNORDERED_NODE_ITERATOR_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-ORDERED-NODE-ITERATOR-TYPE\n */\nXPathResult.ORDERED_NODE_ITERATOR_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-UNORDERED-NODE-SNAPSHOT-TYPE\n */\nXPathResult.UNORDERED_NODE_SNAPSHOT_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-ORDERED-NODE-SNAPSHOT-TYPE\n */\nXPathResult.ORDERED_NODE_SNAPSHOT_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-ANY-UNORDERED-NODE-TYPE\n */\nXPathResult.ANY_UNORDERED_NODE_TYPE;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult-FIRST-ORDERED-NODE-TYPE\n */\nXPathResult.FIRST_ORDERED_NODE_TYPE;\n\n/**\n * @constructor\n * @extends {Node}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNamespace\n */\nfunction XPathNamespace() {}\n\n/**\n * @type {Element}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNamespace-ownerElement\n */\nXPathNamespace.prototype.ownerElement;\n\n/**\n * @const {number}\n * @see http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPATH_NAMESPACE_NODE\n */\nXPathNamespace.XPATH_NAMESPACE_NODE;\n\n/**\n * From https://xhr.spec.whatwg.org/#xmlhttprequest\n *\n * (Draft)\n *\n * The XMLHttpRequest Object specification defines an API that provides\n * scripted client functionality for transferring data between a client and a\n * server.\n *\n * @constructor\n * @implements {EventTarget}\n * @see https://xhr.spec.whatwg.org/#xmlhttprequest\n */\nfunction XMLHttpRequest() {}\n\n/** @override */\nXMLHttpRequest.prototype.addEventListener = function(\n type, listener, opt_options) {};\n\n/** @override */\nXMLHttpRequest.prototype.removeEventListener = function(\n type, listener, opt_options) {};\n\n/** @override */\nXMLHttpRequest.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @param {string} method\n * @param {string} url\n * @param {?boolean=} opt_async\n * @param {?string=} opt_user\n * @param {?string=} opt_password\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#the-open()-method\n */\nXMLHttpRequest.prototype.open = function(method, url, opt_async, opt_user,\n opt_password) {};\n\n/**\n * @param {string} header\n * @param {string} value\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#the-setrequestheader()-method\n */\nXMLHttpRequest.prototype.setRequestHeader = function(header, value) {};\n\n/**\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=} opt_data\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#the-send()-method\n */\nXMLHttpRequest.prototype.send = function(opt_data) {};\n\n/**\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#the-abort()-method\n */\nXMLHttpRequest.prototype.abort = function() {};\n\n/**\n * @return {string}\n * @see https://xhr.spec.whatwg.org/#the-getallresponseheaders()-method\n */\nXMLHttpRequest.prototype.getAllResponseHeaders = function() {};\n\n/**\n * @param {string} header\n * @return {string}\n * @see https://xhr.spec.whatwg.org/#the-getresponseheader()-method\n */\nXMLHttpRequest.prototype.getResponseHeader = function(header) {};\n\n/**\n * @type {string}\n * @see https://xhr.spec.whatwg.org/#the-responsetext-attribute\n */\nXMLHttpRequest.prototype.responseText;\n\n/**\n * This is not supported in any IE browser (as of August 2016).\n * @type {string}\n * @see https://xhr.spec.whatwg.org/#the-responseurl-attribute\n */\nXMLHttpRequest.prototype.responseURL;\n\n/**\n * @type {Document}\n * @see https://xhr.spec.whatwg.org/#the-responsexml-attribute\n */\nXMLHttpRequest.prototype.responseXML;\n\n/**\n * @type {number}\n * @see https://xhr.spec.whatwg.org/#dom-xmlhttprequest-readystate\n */\nXMLHttpRequest.prototype.readyState;\n\n/**\n * @type {number}\n * @see https://xhr.spec.whatwg.org/#the-status-attribute\n */\nXMLHttpRequest.prototype.status;\n\n/**\n * @type {string}\n * @see https://xhr.spec.whatwg.org/#the-statustext-attribute\n */\nXMLHttpRequest.prototype.statusText;\n\n/**\n * @type {number}\n * @see https://xhr.spec.whatwg.org/#the-timeout-attribute\n */\nXMLHttpRequest.prototype.timeout;\n\n/**\n * @type {?function(!Event)}\n * @see https://xhr.spec.whatwg.org/#event-handlers\n */\nXMLHttpRequest.prototype.onreadystatechange;\n\n/**\n * @type {?function(!Event)}\n * @see https://xhr.spec.whatwg.org/#event-handlers\n */\nXMLHttpRequest.prototype.onerror;\n\n/**\n * @const {number}\n * @see https://xhr.spec.whatwg.org/#states\n */\nXMLHttpRequest.UNSENT;\n\n/**\n * @const {number}\n * @see https://xhr.spec.whatwg.org/#states\n */\nXMLHttpRequest.OPENED;\n\n/**\n * @const {number}\n * @see https://xhr.spec.whatwg.org/#states\n */\nXMLHttpRequest.HEADERS_RECEIVED;\n\n/**\n * @const {number}\n * @see https://xhr.spec.whatwg.org/#states\n */\nXMLHttpRequest.LOADING;\n\n/**\n * @const {number}\n * @see https://xhr.spec.whatwg.org/#states\n */\nXMLHttpRequest.DONE;\n\n\n/**\n * @see https://xhr.spec.whatwg.org/#formdataentryvalue\n * @typedef {!File|string}\n */\nvar FormDataEntryValue;\n\n/**\n * The FormData object represents an ordered collection of entries. Each entry\n * has a name and value.\n *\n * @param {?Element=} form An optional form to use for constructing the form\n * data set.\n * @constructor\n * @implements {Iterable>}\n * @see https://xhr.spec.whatwg.org/#interface-formdata\n */\nfunction FormData(form) {}\n\n/**\n * @param {string} name\n * @param {?Blob|string} value\n * @param {string=} filename\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#dom-formdata-append\n */\nFormData.prototype.append = function(name, value, filename) {};\n\n/**\n * @param {string} name\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#dom-formdata-delete\n */\nFormData.prototype.delete = function(name) {};\n\n/**\n * @param {string} name\n * @return {?FormDataEntryValue}\n * @see https://xhr.spec.whatwg.org/#dom-formdata-get\n */\nFormData.prototype.get = function(name) {};\n\n/**\n * @param {string} name\n * @return {!Array}\n * @see https://xhr.spec.whatwg.org/#dom-formdata-getall\n */\nFormData.prototype.getAll = function(name) {};\n\n/**\n * @param {string} name\n * @return {boolean}\n * @see https://xhr.spec.whatwg.org/#dom-formdata-has\n */\nFormData.prototype.has = function(name) {};\n\n/**\n * @param {string} name\n * @param {!Blob|string} value\n * @param {string=} filename\n * @return {undefined}\n * @see https://xhr.spec.whatwg.org/#dom-formdata-set\n */\nFormData.prototype.set = function(name, value, filename) {};\n\n","externs/webassembly.js":"/*\n * Copyright 2017 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for WebAssembly JS API\n *\n * @see http://webassembly.org/docs/js/\n *\n * @externs\n * @author [email protected] (Loo Rong Jie)\n */\n\n /**\n * @const\n */\nvar WebAssembly = {};\n\n/**\n * @constructor\n * @param {!BufferSource} bytes\n */\nWebAssembly.Module = function(bytes) {};\n\n/**\n * @constructor\n * @param {!WebAssembly.Module} moduleObject\n * @param {Object=} importObject\n */\nWebAssembly.Instance = function(moduleObject, importObject) {};\n\n/**\n * @typedef {{initial:number, maximum:(number|undefined)}}\n */\nvar MemoryDescriptor;\n\n/**\n * @constructor\n * @param {MemoryDescriptor} memoryDescriptor\n */\nWebAssembly.Memory = function(memoryDescriptor) {};\n\n/**\n * @typedef {{element:string, initial:number, maximum:(number|undefined)}}\n */\nvar TableDescriptor;\n\n/**\n * @constructor\n * @param {TableDescriptor} tableDescriptor\n */\nWebAssembly.Table = function(tableDescriptor) {};\n\n/**\n * @constructor\n * @extends {Error}\n */\nWebAssembly.CompileError = function() {};\n\n/**\n * @constructor\n * @extends {Error}\n */\nWebAssembly.LinkError = function() {};\n\n/**\n * @constructor\n * @extends {Error}\n */\nWebAssembly.RuntimeError = function() {};\n\n// Note: Closure compiler does not support function overloading, omit this overload for now.\n// {function(!WebAssembly.Module, Object=):!Promise}\n/**\n * @param {!BufferSource} moduleObject\n * @param {Object=} importObject\n * @return {!Promise<{module:!WebAssembly.Module, instance:!WebAssembly.Instance}>}\n */\nWebAssembly.instantiate = function(moduleObject, importObject) {};\n\n/**\n * @param {!Promise} moduleStream\n * @param {Object=} importObject\n * @return {!Promise<{module:!WebAssembly.Module, instance:!WebAssembly.Instance}>}\n */\nWebAssembly.instantiateStreaming = function(moduleStream, importObject) {};\n\n/**\n * @param {!BufferSource} bytes\n * @return {!Promise}\n */\nWebAssembly.compile = function(bytes) {};\n\n/**\n * @param {!Promise} moduleStream\n * @return {!Promise}\n */\nWebAssembly.compileStreaming = function(moduleStream) {};\n\n/**\n * @param {!BufferSource} bytes\n * @return {boolean}\n * @nosideeffects\n */\nWebAssembly.validate = function(bytes) {};\n\n/**\n * @param {!WebAssembly.Module} moduleObject\n * @return {!Array<{name:string, kind:string}>}\n */\nWebAssembly.Module.exports = function(moduleObject) {};\n\n/**\n * @param {!WebAssembly.Module} moduleObject\n * @return {!Array<{module:string, name:string, kind:string}>}\n */\nWebAssembly.Module.imports = function(moduleObject) {};\n\n/**\n * @param {!WebAssembly.Module} moduleObject\n * @param {string} sectionName\n * @return {!Array}\n */\nWebAssembly.Module.customSections = function(moduleObject, sectionName) {};\n\nWebAssembly.Instance.prototype.exports;\n\n/**\n * @param {number} delta\n * @return {number}\n */\nWebAssembly.Memory.prototype.grow = function(delta) {};\n\n/**\n * @type {!ArrayBuffer}\n */\nWebAssembly.Memory.prototype.buffer;\n\n/**\n * @param {number} delta\n * @return {number}\n */\nWebAssembly.Table.prototype.grow = function(delta) {};\n\n/**\n * @type {number}\n */\nWebAssembly.Table.prototype.length;\n\n/** @typedef {function(...)} */\nvar TableFunction;\n\n/**\n * @param {number} index\n * @return {TableFunction}\n */\nWebAssembly.Table.prototype.get = function(index) {};\n\n/**\n * @param {number} index\n * @param {?TableFunction} value\n * @return {undefined}\n */\nWebAssembly.Table.prototype.set = function(index, value) {};\n","externs/webgl.js":"/*\n * Copyright 2010 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for WebGL functions as described at\n * http://www.khronos.org/registry/webgl/specs/latest/\n *\n * This file is current up to the WebGL 1.0.1 spec, including extensions.\n *\n * This relies on html5.js being included for Canvas and Typed Array support.\n *\n * This includes some extensions defined at\n * http://www.khronos.org/registry/webgl/extensions/\n *\n * @externs\n */\n\n\n/**\n * @typedef {ImageBitmap|ImageData|HTMLImageElement|HTMLCanvasElement|\n * HTMLVideoElement|OffscreenCanvas}\n */\nvar TexImageSource;\n\n/**\n * @constructor\n */\nfunction WebGLRenderingContext() {}\n\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_BUFFER_BIT;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BUFFER_BIT;\n\n/** @const {number} */\nWebGLRenderingContext.COLOR_BUFFER_BIT;\n\n/** @const {number} */\nWebGLRenderingContext.POINTS;\n\n/** @const {number} */\nWebGLRenderingContext.LINES;\n\n/** @const {number} */\nWebGLRenderingContext.LINE_LOOP;\n\n/** @const {number} */\nWebGLRenderingContext.LINE_STRIP;\n\n/** @const {number} */\nWebGLRenderingContext.TRIANGLES;\n\n/** @const {number} */\nWebGLRenderingContext.TRIANGLE_STRIP;\n\n/** @const {number} */\nWebGLRenderingContext.TRIANGLE_FAN;\n\n/** @const {number} */\nWebGLRenderingContext.ZERO;\n\n/** @const {number} */\nWebGLRenderingContext.ONE;\n\n/** @const {number} */\nWebGLRenderingContext.SRC_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.ONE_MINUS_SRC_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.SRC_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.ONE_MINUS_SRC_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.DST_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.ONE_MINUS_DST_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.DST_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.ONE_MINUS_DST_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.SRC_ALPHA_SATURATE;\n\n/** @const {number} */\nWebGLRenderingContext.FUNC_ADD;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_EQUATION;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_EQUATION_RGB;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_EQUATION_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.FUNC_SUBTRACT;\n\n/** @const {number} */\nWebGLRenderingContext.FUNC_REVERSE_SUBTRACT;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_DST_RGB;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_SRC_RGB;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_DST_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_SRC_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.CONSTANT_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.ONE_MINUS_CONSTANT_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.CONSTANT_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.ONE_MINUS_CONSTANT_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.ARRAY_BUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.ELEMENT_ARRAY_BUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.ARRAY_BUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.STREAM_DRAW;\n\n/** @const {number} */\nWebGLRenderingContext.STATIC_DRAW;\n\n/** @const {number} */\nWebGLRenderingContext.DYNAMIC_DRAW;\n\n/** @const {number} */\nWebGLRenderingContext.BUFFER_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.BUFFER_USAGE;\n\n/** @const {number} */\nWebGLRenderingContext.CURRENT_VERTEX_ATTRIB;\n\n/** @const {number} */\nWebGLRenderingContext.FRONT;\n\n/** @const {number} */\nWebGLRenderingContext.BACK;\n\n/** @const {number} */\nWebGLRenderingContext.FRONT_AND_BACK;\n\n/** @const {number} */\nWebGLRenderingContext.CULL_FACE;\n\n/** @const {number} */\nWebGLRenderingContext.BLEND;\n\n/** @const {number} */\nWebGLRenderingContext.DITHER;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_TEST;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_TEST;\n\n/** @const {number} */\nWebGLRenderingContext.SCISSOR_TEST;\n\n/** @const {number} */\nWebGLRenderingContext.POLYGON_OFFSET_FILL;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLE_ALPHA_TO_COVERAGE;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLE_COVERAGE;\n\n/** @const {number} */\nWebGLRenderingContext.NO_ERROR;\n\n/** @const {number} */\nWebGLRenderingContext.INVALID_ENUM;\n\n/** @const {number} */\nWebGLRenderingContext.INVALID_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.INVALID_OPERATION;\n\n/** @const {number} */\nWebGLRenderingContext.OUT_OF_MEMORY;\n\n/** @const {number} */\nWebGLRenderingContext.CW;\n\n/** @const {number} */\nWebGLRenderingContext.CCW;\n\n/** @const {number} */\nWebGLRenderingContext.LINE_WIDTH;\n\n/** @const {number} */\nWebGLRenderingContext.ALIASED_POINT_SIZE_RANGE;\n\n/** @const {number} */\nWebGLRenderingContext.ALIASED_LINE_WIDTH_RANGE;\n\n/** @const {number} */\nWebGLRenderingContext.CULL_FACE_MODE;\n\n/** @const {number} */\nWebGLRenderingContext.FRONT_FACE;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_RANGE;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_CLEAR_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_FUNC;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_CLEAR_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_FUNC;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_PASS_DEPTH_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_PASS_DEPTH_PASS;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_REF;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_VALUE_MASK;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_FUNC;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_REF;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_VALUE_MASK;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BACK_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.VIEWPORT;\n\n/** @const {number} */\nWebGLRenderingContext.SCISSOR_BOX;\n\n/** @const {number} */\nWebGLRenderingContext.COLOR_CLEAR_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.COLOR_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.UNPACK_ALIGNMENT;\n\n/** @const {number} */\nWebGLRenderingContext.PACK_ALIGNMENT;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_TEXTURE_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_VIEWPORT_DIMS;\n\n/** @const {number} */\nWebGLRenderingContext.SUBPIXEL_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.RED_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.GREEN_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.BLUE_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.ALPHA_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.POLYGON_OFFSET_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.POLYGON_OFFSET_FACTOR;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_BINDING_2D;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLE_BUFFERS;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLES;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLE_COVERAGE_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLE_COVERAGE_INVERT;\n\n/** @const {number} */\nWebGLRenderingContext.COMPRESSED_TEXTURE_FORMATS;\n\n/** @const {number} */\nWebGLRenderingContext.DONT_CARE;\n\n/** @const {number} */\nWebGLRenderingContext.FASTEST;\n\n/** @const {number} */\nWebGLRenderingContext.NICEST;\n\n/** @const {number} */\nWebGLRenderingContext.GENERATE_MIPMAP_HINT;\n\n/** @const {number} */\nWebGLRenderingContext.BYTE;\n\n/** @const {number} */\nWebGLRenderingContext.UNSIGNED_BYTE;\n\n/** @const {number} */\nWebGLRenderingContext.SHORT;\n\n/** @const {number} */\nWebGLRenderingContext.UNSIGNED_SHORT;\n\n/** @const {number} */\nWebGLRenderingContext.INT;\n\n/** @const {number} */\nWebGLRenderingContext.UNSIGNED_INT;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_COMPONENT;\n\n/** @const {number} */\nWebGLRenderingContext.ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.RGB;\n\n/** @const {number} */\nWebGLRenderingContext.RGBA;\n\n/** @const {number} */\nWebGLRenderingContext.LUMINANCE;\n\n/** @const {number} */\nWebGLRenderingContext.LUMINANCE_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.UNSIGNED_SHORT_4_4_4_4;\n\n/** @const {number} */\nWebGLRenderingContext.UNSIGNED_SHORT_5_5_5_1;\n\n/** @const {number} */\nWebGLRenderingContext.UNSIGNED_SHORT_5_6_5;\n\n/** @const {number} */\nWebGLRenderingContext.FRAGMENT_SHADER;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_SHADER;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_VERTEX_ATTRIBS;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_VERTEX_UNIFORM_VECTORS;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_VARYING_VECTORS;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;\n\n/** @const {number} */\nWebGLRenderingContext.SHADER_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.DELETE_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.LINK_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.VALIDATE_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.ATTACHED_SHADERS;\n\n/** @const {number} */\nWebGLRenderingContext.ACTIVE_UNIFORMS;\n\n/** @const {number} */\nWebGLRenderingContext.ACTIVE_ATTRIBUTES;\n\n/** @const {number} */\nWebGLRenderingContext.SHADING_LANGUAGE_VERSION;\n\n/** @const {number} */\nWebGLRenderingContext.CURRENT_PROGRAM;\n\n/** @const {number} */\nWebGLRenderingContext.NEVER;\n\n/** @const {number} */\nWebGLRenderingContext.LESS;\n\n/** @const {number} */\nWebGLRenderingContext.EQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.LEQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.GREATER;\n\n/** @const {number} */\nWebGLRenderingContext.NOTEQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.GEQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.ALWAYS;\n\n/** @const {number} */\nWebGLRenderingContext.KEEP;\n\n/** @const {number} */\nWebGLRenderingContext.REPLACE;\n\n/** @const {number} */\nWebGLRenderingContext.INCR;\n\n/** @const {number} */\nWebGLRenderingContext.DECR;\n\n/** @const {number} */\nWebGLRenderingContext.INVERT;\n\n/** @const {number} */\nWebGLRenderingContext.INCR_WRAP;\n\n/** @const {number} */\nWebGLRenderingContext.DECR_WRAP;\n\n/** @const {number} */\nWebGLRenderingContext.VENDOR;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERER;\n\n/** @const {number} */\nWebGLRenderingContext.VERSION;\n\n/** @const {number} */\nWebGLRenderingContext.NEAREST;\n\n/** @const {number} */\nWebGLRenderingContext.LINEAR;\n\n/** @const {number} */\nWebGLRenderingContext.NEAREST_MIPMAP_NEAREST;\n\n/** @const {number} */\nWebGLRenderingContext.LINEAR_MIPMAP_NEAREST;\n\n/** @const {number} */\nWebGLRenderingContext.NEAREST_MIPMAP_LINEAR;\n\n/** @const {number} */\nWebGLRenderingContext.LINEAR_MIPMAP_LINEAR;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_MAG_FILTER;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_MIN_FILTER;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_WRAP_S;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_WRAP_T;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_2D;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_BINDING_CUBE_MAP;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE0;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE1;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE2;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE3;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE4;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE5;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE6;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE7;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE8;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE9;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE10;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE11;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE12;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE13;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE14;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE15;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE16;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE17;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE18;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE19;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE20;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE21;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE22;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE23;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE24;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE25;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE26;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE27;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE28;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE29;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE30;\n\n/** @const {number} */\nWebGLRenderingContext.TEXTURE31;\n\n/** @const {number} */\nWebGLRenderingContext.ACTIVE_TEXTURE;\n\n/** @const {number} */\nWebGLRenderingContext.REPEAT;\n\n/** @const {number} */\nWebGLRenderingContext.CLAMP_TO_EDGE;\n\n/** @const {number} */\nWebGLRenderingContext.MIRRORED_REPEAT;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT_VEC2;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT_VEC3;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT_VEC4;\n\n/** @const {number} */\nWebGLRenderingContext.INT_VEC2;\n\n/** @const {number} */\nWebGLRenderingContext.INT_VEC3;\n\n/** @const {number} */\nWebGLRenderingContext.INT_VEC4;\n\n/** @const {number} */\nWebGLRenderingContext.BOOL;\n\n/** @const {number} */\nWebGLRenderingContext.BOOL_VEC2;\n\n/** @const {number} */\nWebGLRenderingContext.BOOL_VEC3;\n\n/** @const {number} */\nWebGLRenderingContext.BOOL_VEC4;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT_MAT2;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT_MAT3;\n\n/** @const {number} */\nWebGLRenderingContext.FLOAT_MAT4;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLER_2D;\n\n/** @const {number} */\nWebGLRenderingContext.SAMPLER_CUBE;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;\n\n/** @const {number} */\nWebGLRenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT;\n\n/** @const {number} */\nWebGLRenderingContext.IMPLEMENTATION_COLOR_READ_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.COMPILE_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.LOW_FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.MEDIUM_FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.HIGH_FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.LOW_INT;\n\n/** @const {number} */\nWebGLRenderingContext.MEDIUM_INT;\n\n/** @const {number} */\nWebGLRenderingContext.HIGH_INT;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.RGBA4;\n\n/** @const {number} */\nWebGLRenderingContext.RGB5_A1;\n\n/** @const {number} */\nWebGLRenderingContext.RGB565;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_COMPONENT16;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_INDEX;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_INDEX8;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_STENCIL;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_WIDTH;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_HEIGHT;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_INTERNAL_FORMAT;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_RED_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_GREEN_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_BLUE_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_ALPHA_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_DEPTH_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_STENCIL_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;\n\n/** @const {number} */\nWebGLRenderingContext.COLOR_ATTACHMENT0;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.STENCIL_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.DEPTH_STENCIL_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.NONE;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_COMPLETE;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_UNSUPPORTED;\n\n/** @const {number} */\nWebGLRenderingContext.FRAMEBUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.RENDERBUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.MAX_RENDERBUFFER_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.INVALID_FRAMEBUFFER_OPERATION;\n\n/** @const {number} */\nWebGLRenderingContext.UNPACK_FLIP_Y_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.CONTEXT_LOST_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.BROWSER_DEFAULT_WEBGL;\n\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_BUFFER_BIT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BUFFER_BIT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.COLOR_BUFFER_BIT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.POINTS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINES;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINE_LOOP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINE_STRIP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TRIANGLES;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TRIANGLE_STRIP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TRIANGLE_FAN;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ZERO;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SRC_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE_MINUS_SRC_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SRC_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE_MINUS_SRC_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DST_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE_MINUS_DST_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DST_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE_MINUS_DST_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SRC_ALPHA_SATURATE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FUNC_ADD;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_EQUATION;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_EQUATION_RGB;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_EQUATION_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FUNC_SUBTRACT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FUNC_REVERSE_SUBTRACT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_DST_RGB;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_SRC_RGB;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_DST_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_SRC_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CONSTANT_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE_MINUS_CONSTANT_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CONSTANT_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ONE_MINUS_CONSTANT_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND_COLOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ARRAY_BUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ELEMENT_ARRAY_BUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ARRAY_BUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ELEMENT_ARRAY_BUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STREAM_DRAW;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STATIC_DRAW;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DYNAMIC_DRAW;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BUFFER_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BUFFER_USAGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CURRENT_VERTEX_ATTRIB;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRONT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BACK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRONT_AND_BACK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CULL_FACE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLEND;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DITHER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_TEST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_TEST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SCISSOR_TEST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.POLYGON_OFFSET_FILL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLE_ALPHA_TO_COVERAGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLE_COVERAGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NO_ERROR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INVALID_ENUM;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INVALID_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INVALID_OPERATION;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.OUT_OF_MEMORY;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CW;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CCW;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINE_WIDTH;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ALIASED_POINT_SIZE_RANGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ALIASED_LINE_WIDTH_RANGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CULL_FACE_MODE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRONT_FACE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_RANGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_CLEAR_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_FUNC;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_CLEAR_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_FUNC;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_PASS_DEPTH_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_PASS_DEPTH_PASS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_REF;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_VALUE_MASK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_FUNC;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_PASS_DEPTH_FAIL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_PASS_DEPTH_PASS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_REF;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_VALUE_MASK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BACK_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VIEWPORT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SCISSOR_BOX;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.COLOR_CLEAR_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.COLOR_WRITEMASK;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNPACK_ALIGNMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.PACK_ALIGNMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_TEXTURE_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_VIEWPORT_DIMS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SUBPIXEL_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RED_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.GREEN_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BLUE_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ALPHA_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_BITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.POLYGON_OFFSET_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.POLYGON_OFFSET_FACTOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_BINDING_2D;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLE_BUFFERS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLES;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLE_COVERAGE_VALUE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLE_COVERAGE_INVERT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.COMPRESSED_TEXTURE_FORMATS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DONT_CARE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FASTEST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NICEST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.GENERATE_MIPMAP_HINT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BYTE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNSIGNED_BYTE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SHORT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNSIGNED_SHORT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNSIGNED_INT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_COMPONENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RGB;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RGBA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LUMINANCE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LUMINANCE_ALPHA;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNSIGNED_SHORT_4_4_4_4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNSIGNED_SHORT_5_5_5_1;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNSIGNED_SHORT_5_6_5;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAGMENT_SHADER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_SHADER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_VERTEX_ATTRIBS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_VERTEX_UNIFORM_VECTORS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_VARYING_VECTORS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_COMBINED_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_VERTEX_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_FRAGMENT_UNIFORM_VECTORS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SHADER_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DELETE_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINK_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VALIDATE_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ATTACHED_SHADERS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ACTIVE_UNIFORMS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ACTIVE_ATTRIBUTES;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SHADING_LANGUAGE_VERSION;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CURRENT_PROGRAM;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NEVER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LESS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.EQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LEQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.GREATER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NOTEQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.GEQUAL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ALWAYS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.KEEP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.REPLACE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INCR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DECR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INVERT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INCR_WRAP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DECR_WRAP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VENDOR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERSION;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NEAREST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINEAR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NEAREST_MIPMAP_NEAREST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINEAR_MIPMAP_NEAREST;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NEAREST_MIPMAP_LINEAR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LINEAR_MIPMAP_LINEAR;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_MAG_FILTER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_MIN_FILTER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_WRAP_S;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_WRAP_T;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_2D;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_BINDING_CUBE_MAP;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_POSITIVE_X;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_NEGATIVE_X;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_POSITIVE_Y;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_NEGATIVE_Y;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_POSITIVE_Z;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE_CUBE_MAP_NEGATIVE_Z;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_CUBE_MAP_TEXTURE_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE0;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE1;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE2;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE3;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE5;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE6;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE7;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE8;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE9;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE10;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE11;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE12;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE13;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE14;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE15;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE16;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE17;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE18;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE19;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE20;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE21;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE22;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE23;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE24;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE25;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE26;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE27;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE28;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE29;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE30;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.TEXTURE31;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.ACTIVE_TEXTURE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.REPEAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CLAMP_TO_EDGE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MIRRORED_REPEAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT_VEC2;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT_VEC3;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT_VEC4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INT_VEC2;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INT_VEC3;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INT_VEC4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BOOL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BOOL_VEC2;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BOOL_VEC3;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BOOL_VEC4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT_MAT2;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT_MAT3;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FLOAT_MAT4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLER_2D;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.SAMPLER_CUBE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_ENABLED;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_STRIDE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_NORMALIZED;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_POINTER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.COMPILE_STATUS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LOW_FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MEDIUM_FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.HIGH_FLOAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.LOW_INT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MEDIUM_INT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.HIGH_INT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RGBA4;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RGB5_A1;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RGB565;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_COMPONENT16;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_INDEX;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_INDEX8;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_STENCIL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_WIDTH;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_HEIGHT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_INTERNAL_FORMAT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_RED_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_GREEN_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_BLUE_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_ALPHA_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_DEPTH_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_STENCIL_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.COLOR_ATTACHMENT0;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.STENCIL_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.DEPTH_STENCIL_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.NONE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_COMPLETE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_UNSUPPORTED;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.FRAMEBUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.RENDERBUFFER_BINDING;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.MAX_RENDERBUFFER_SIZE;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.INVALID_FRAMEBUFFER_OPERATION;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNPACK_FLIP_Y_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNPACK_PREMULTIPLY_ALPHA_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.CONTEXT_LOST_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.UNPACK_COLORSPACE_CONVERSION_WEBGL;\n\n/** @const {number} */\nWebGLRenderingContext.prototype.BROWSER_DEFAULT_WEBGL;\n\n\n/**\n * @type {!HTMLCanvasElement}\n */\nWebGLRenderingContext.prototype.canvas;\n\n/**\n * @type {number}\n */\nWebGLRenderingContext.prototype.drawingBufferWidth;\n\n/**\n * @type {number}\n */\nWebGLRenderingContext.prototype.drawingBufferHeight;\n\n/**\n * @return {!WebGLContextAttributes}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getContextAttributes = function() {};\n\n/**\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isContextLost = function() {};\n\n/**\n * @return {!Array}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getSupportedExtensions = function() {};\n\n/**\n * Note that this has side effects by enabling the extension even if the\n * result is not used.\n * @param {string} name\n * @return {Object}\n */\nWebGLRenderingContext.prototype.getExtension = function(name) {};\n\n/**\n * @param {number} texture\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.activeTexture = function(texture) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {WebGLShader} shader\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.attachShader = function(program, shader) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {number} index\n * @param {string} name\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bindAttribLocation = function(\n program, index, name) {};\n\n/**\n * @param {number} target\n * @param {WebGLBuffer} buffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bindBuffer = function(target, buffer) {};\n\n/**\n * @param {number} target\n * @param {WebGLFramebuffer} buffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bindFramebuffer = function(target, buffer) {};\n\n/**\n * @param {number} target\n * @param {WebGLRenderbuffer} buffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bindRenderbuffer = function(target, buffer) {};\n\n/**\n * @param {number} target\n * @param {WebGLTexture} texture\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bindTexture = function(target, texture) {};\n\n/**\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @param {number} alpha\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.blendColor = function(\n red, green, blue, alpha) {};\n\n/**\n * @param {number} mode\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.blendEquation = function(mode) {};\n\n/**\n * @param {number} modeRGB\n * @param {number} modeAlpha\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.blendEquationSeparate = function(\n modeRGB, modeAlpha) {};\n\n/**\n * @param {number} sfactor\n * @param {number} dfactor\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.blendFunc = function(sfactor, dfactor) {};\n\n/**\n * @param {number} srcRGB\n * @param {number} dstRGB\n * @param {number} srcAlpha\n * @param {number} dstAlpha\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.blendFuncSeparate = function(\n srcRGB, dstRGB, srcAlpha, dstAlpha) {};\n\n/**\n * @param {number} target\n * @param {ArrayBufferView|ArrayBuffer|number} data\n * @param {number} usage\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bufferData = function(target, data, usage) {};\n\n/**\n * @param {number} target\n * @param {number} offset\n * @param {ArrayBufferView|ArrayBuffer} data\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.bufferSubData = function(\n target, offset, data) {};\n\n/**\n * @param {number} target\n * @return {number}\n */\nWebGLRenderingContext.prototype.checkFramebufferStatus = function(target) {};\n\n/**\n * @param {number} mask\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.clear = function(mask) {};\n\n/**\n * @param {number} red\n * @param {number} green\n * @param {number} blue\n * @param {number} alpha\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.clearColor = function(\n red, green, blue, alpha) {};\n\n/**\n * @param {number} depth\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.clearDepth = function(depth) {};\n\n/**\n * @param {number} s\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.clearStencil = function(s) {};\n\n/**\n * @param {boolean} red\n * @param {boolean} green\n * @param {boolean} blue\n * @param {boolean} alpha\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.colorMask = function(\n red, green, blue, alpha) {};\n\n/**\n * @param {WebGLShader} shader\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.compileShader = function(shader) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @param {number} border\n * @param {ArrayBufferView} data\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.compressedTexImage2D = function(\n target, level, internalformat, width, height, border, data) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} width\n * @param {number} height\n * @param {number} format\n * @param {ArrayBufferView} data\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.compressedTexSubImage2D = function(\n target, level, xoffset, yoffset, width, height, format, data) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} format\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} border\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.copyTexImage2D = function(\n target, level, format, x, y, width, height, border) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.copyTexSubImage2D = function(\n target, level, xoffset, yoffset, x, y, width, height) {};\n\n/**\n * @return {!WebGLBuffer}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.createBuffer = function() {};\n\n/**\n * @return {!WebGLFramebuffer}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.createFramebuffer = function() {};\n\n/**\n * @return {!WebGLProgram}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.createProgram = function() {};\n\n/**\n * @return {!WebGLRenderbuffer}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.createRenderbuffer = function() {};\n\n/**\n * @param {number} type\n * @return {!WebGLShader}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.createShader = function(type) {};\n\n/**\n * @return {!WebGLTexture}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.createTexture = function() {};\n\n/**\n * @param {number} mode\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.cullFace = function(mode) {};\n\n/**\n * @param {WebGLBuffer} buffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.deleteBuffer = function(buffer) {};\n\n/**\n * @param {WebGLFramebuffer} buffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.deleteFramebuffer = function(buffer) {};\n\n/**\n * @param {WebGLProgram} program\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.deleteProgram = function(program) {};\n\n/**\n * @param {WebGLRenderbuffer} buffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.deleteRenderbuffer = function(buffer) {};\n\n/**\n * @param {WebGLShader} shader\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.deleteShader = function(shader) {};\n\n/**\n * @param {WebGLTexture} texture\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.deleteTexture = function(texture) {};\n\n/**\n * @param {number} func\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.depthFunc = function(func) {};\n\n/**\n * @param {boolean} flag\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.depthMask = function(flag) {};\n\n/**\n * @param {number} nearVal\n * @param {number} farVal\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.depthRange = function(nearVal, farVal) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {WebGLShader} shader\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.detachShader = function(program, shader) {};\n\n/**\n * @param {number} flags\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.disable = function(flags) {};\n\n/**\n * @param {number} index\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.disableVertexAttribArray = function(\n index) {};\n\n/**\n * @param {number} mode\n * @param {number} first\n * @param {number} count\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.drawArrays = function(mode, first, count) {};\n\n/**\n * @param {number} mode\n * @param {number} count\n * @param {number} type\n * @param {number} offset\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.drawElements = function(\n mode, count, type, offset) {};\n\n/**\n * @param {number} cap\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.enable = function(cap) {};\n\n/**\n * @param {number} index\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.enableVertexAttribArray = function(\n index) {};\n\nWebGLRenderingContext.prototype.finish = function() {};\n\nWebGLRenderingContext.prototype.flush = function() {};\n\n/**\n * @param {number} target\n * @param {number} attachment\n * @param {number} renderbuffertarget\n * @param {WebGLRenderbuffer} renderbuffer\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.framebufferRenderbuffer = function(\n target, attachment, renderbuffertarget, renderbuffer) {};\n\n/**\n * @param {number} target\n * @param {number} attachment\n * @param {number} textarget\n * @param {WebGLTexture} texture\n * @param {number} level\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.framebufferTexture2D = function(\n target, attachment, textarget, texture, level) {};\n\n/**\n * @param {number} mode\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.frontFace = function(mode) {};\n\n/**\n * @param {number} target\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.generateMipmap = function(target) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {number} index\n * @return {WebGLActiveInfo}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getActiveAttrib = function(program, index) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {number} index\n * @return {WebGLActiveInfo}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getActiveUniform = function(program, index) {};\n\n/**\n * @param {WebGLProgram} program\n * @return {!Array}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getAttachedShaders = function(program) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {string} name\n * @return {number}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getAttribLocation = function(program, name) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getBufferParameter = function(target, pname) {};\n\n/**\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getParameter = function(pname) {};\n\n/**\n * @return {number}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getError = function() {};\n\n/**\n * @param {number} target\n * @param {number} attachment\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getFramebufferAttachmentParameter = function(\n target, attachment, pname) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getProgramParameter = function(\n program, pname) {};\n\n/**\n * @param {WebGLProgram} program\n * @return {string}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getProgramInfoLog = function(program) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getRenderbufferParameter = function(\n target, pname) {};\n\n/**\n * @param {WebGLShader} shader\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getShaderParameter = function(shader, pname) {};\n\n/**\n * @param {number} shadertype\n * @param {number} precisiontype\n * @return {WebGLShaderPrecisionFormat}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getShaderPrecisionFormat = function(shadertype,\n precisiontype) {};\n\n/**\n * @param {WebGLShader} shader\n * @return {string}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getShaderInfoLog = function(shader) {};\n\n/**\n * @param {WebGLShader} shader\n * @return {string}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getShaderSource = function(shader) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getTexParameter = function(target, pname) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {WebGLUniformLocation} location\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getUniform = function(program, location) {};\n\n/**\n * @param {WebGLProgram} program\n * @param {string} name\n * @return {WebGLUniformLocation}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getUniformLocation = function(program, name) {};\n\n/**\n * @param {number} index\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getVertexAttrib = function(index, pname) {};\n\n/**\n * @param {number} index\n * @param {number} pname\n * @return {number}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.getVertexAttribOffset = function(\n index, pname) {};\n\n/**\n * @param {number} target\n * @param {number} mode\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.hint = function(target, mode) {};\n\n/**\n * @param {WebGLObject} buffer\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isBuffer = function(buffer) {};\n\n/**\n * @param {number} cap\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isEnabled = function(cap) {};\n\n/**\n * @param {WebGLObject} framebuffer\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isFramebuffer = function(framebuffer) {};\n\n/**\n * @param {WebGLObject} program\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isProgram = function(program) {};\n\n/**\n * @param {WebGLObject} renderbuffer\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isRenderbuffer = function(renderbuffer) {};\n\n/**\n * @param {WebGLObject} shader\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isShader = function(shader) {};\n\n/**\n * @param {WebGLObject} texture\n * @return {boolean}\n * @nosideeffects\n */\nWebGLRenderingContext.prototype.isTexture = function(texture) {};\n\n/**\n * @param {number} width\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.lineWidth = function(width) {};\n\n/**\n * @param {WebGLProgram} program\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.linkProgram = function(program) {};\n\n/**\n * @param {number} pname\n * @param {number|boolean} param\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.pixelStorei = function(pname, param) {};\n\n/**\n * @param {number} factor\n * @param {number} units\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.polygonOffset = function(factor, units) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} format\n * @param {number} type\n * @param {ArrayBufferView} pixels\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.readPixels = function(\n x, y, width, height, format, type, pixels) {};\n\n/**\n * @param {number} target\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.renderbufferStorage = function(\n target, internalformat, width, height) {};\n\n/**\n * @param {number} coverage\n * @param {boolean} invert\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.sampleCoverage = function(coverage, invert) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.scissor = function(x, y, width, height) {};\n\n/**\n * @param {WebGLShader} shader\n * @param {string} source\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.shaderSource = function(shader, source) {};\n\n/**\n * @param {number} func\n * @param {number} ref\n * @param {number} mask\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.stencilFunc = function(func, ref, mask) {};\n\n/**\n * @param {number} face\n * @param {number} func\n * @param {number} ref\n * @param {number} mask\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.stencilFuncSeparate = function(\n face, func, ref, mask) {};\n\n/**\n * @param {number} mask\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.stencilMask = function(mask) {};\n\n/**\n * @param {number} face\n * @param {number} mask\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.stencilMaskSeparate = function(face, mask) {};\n\n/**\n * @param {number} fail\n * @param {number} zfail\n * @param {number} zpass\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.stencilOp = function(fail, zfail, zpass) {};\n\n/**\n * @param {number} face\n * @param {number} fail\n * @param {number} zfail\n * @param {number} zpass\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.stencilOpSeparate = function(\n face, fail, zfail, zpass) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} internalformat\n * @param {number} format or width\n * @param {number} type or height\n * @param {?TexImageSource|number} img or border\n * @param {number=} opt_format\n * @param {number=} opt_type\n * @param {ArrayBufferView=} opt_pixels\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.texImage2D = function(\n target, level, internalformat, format, type, img, opt_format, opt_type,\n opt_pixels) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @param {number} param\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.texParameterf = function(\n target, pname, param) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @param {number} param\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.texParameteri = function(\n target, pname, param) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} format or width\n * @param {number} type or height\n * @param {?TexImageSource|number} data or format\n * @param {number=} opt_type\n * @param {ArrayBufferView=} opt_pixels\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.texSubImage2D = function(\n target, level, xoffset, yoffset, format, type, data, opt_type,\n opt_pixels) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform1f = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Float32Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform1fv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number|boolean} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform1i = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Int32Array|Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform1iv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number} value1\n * @param {number} value2\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform2f = function(\n location, value1, value2) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Float32Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform2fv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number|boolean} value1\n * @param {number|boolean} value2\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform2i = function(\n location, value1, value2) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Int32Array|Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform2iv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number} value1\n * @param {number} value2\n * @param {number} value3\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform3f = function(\n location, value1, value2, value3) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Float32Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform3fv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number|boolean} value1\n * @param {number|boolean} value2\n * @param {number|boolean} value3\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform3i = function(\n location, value1, value2, value3) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Int32Array|Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform3iv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number} value1\n * @param {number} value2\n * @param {number} value3\n * @param {number} value4\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform4f = function(\n location, value1, value2, value3, value4) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Float32Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform4fv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {number|boolean} value1\n * @param {number|boolean} value2\n * @param {number|boolean} value3\n * @param {number|boolean} value4\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform4i = function(\n location, value1, value2, value3, value4) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {Int32Array|Array|Array} value\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniform4iv = function(location, value) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {Float32Array|Array} data\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniformMatrix2fv = function(\n location, transpose, data) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {Float32Array|Array} data\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniformMatrix3fv = function(\n location, transpose, data) {};\n\n/**\n * @param {WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {Float32Array|Array} data\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.uniformMatrix4fv = function(\n location, transpose, data) {};\n\n/**\n * @param {WebGLProgram} program\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.useProgram = function(program) {};\n\n/**\n * @param {WebGLProgram} program\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.validateProgram = function(program) {};\n\n/**\n * @param {number} indx\n * @param {number} x\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib1f = function(indx, x) {};\n\n/**\n * @param {number} indx\n * @param {Float32Array|Array} values\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib1fv = function(indx, values) {};\n\n/**\n * @param {number} indx\n * @param {number} x\n * @param {number} y\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib2f = function(\n indx, x, y) {};\n\n/**\n * @param {number} indx\n * @param {Float32Array|Array} values\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib2fv = function(\n indx, values) {};\n\n/**\n * @param {number} indx\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib3f = function(\n indx, x, y, z) {};\n\n/**\n * @param {number} indx\n * @param {Float32Array|Array} values\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib3fv = function(indx, values) {};\n\n/**\n * @param {number} indx\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @param {number} w\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib4f = function(\n indx, x, y, z, w) {};\n\n/**\n * @param {number} indx\n * @param {Float32Array|Array} values\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttrib4fv = function(indx, values) {};\n\n/**\n * @param {number} indx\n * @param {number} size\n * @param {number} type\n * @param {boolean} normalized\n * @param {number} stride\n * @param {number} offset\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.vertexAttribPointer = function(\n indx, size, type, normalized, stride, offset) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGLRenderingContext.prototype.viewport = function(x, y, width, height) {};\n\n\n/**\n * @constructor\n */\nfunction WebGLContextAttributes() {}\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.alpha;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.depth;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.stencil;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.antialias;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.premultipliedAlpha;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.preserveDrawingBuffer;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.desynchronized;\n\n/**\n * @type {boolean}\n */\nWebGLContextAttributes.prototype.failIfMajorPerformanceCaveat;\n\n/**\n * Possible values: 'default', 'low-power', 'high-performance'\n * @type {string}\n */\nWebGLContextAttributes.prototype.powerPreference;\n\n/**\n * @param {string} eventType\n * @constructor\n * @extends {Event}\n */\nfunction WebGLContextEvent(eventType) {}\n\n/**\n * @type {string}\n */\nWebGLContextEvent.prototype.statusMessage;\n\n\n/**\n * @constructor\n */\nfunction WebGLShaderPrecisionFormat() {}\n\n/**\n * @type {number}\n */\nWebGLShaderPrecisionFormat.prototype.rangeMin;\n\n/**\n * @type {number}\n */\nWebGLShaderPrecisionFormat.prototype.rangeMax;\n\n/**\n * @type {number}\n */\nWebGLShaderPrecisionFormat.prototype.precision;\n\n\n/**\n * @constructor\n */\nfunction WebGLObject() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLBuffer() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLFramebuffer() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLProgram() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLRenderbuffer() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLShader() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLTexture() {}\n\n\n/**\n * @constructor\n */\nfunction WebGLActiveInfo() {}\n\n/** @type {number} */\nWebGLActiveInfo.prototype.size;\n\n/** @type {number} */\nWebGLActiveInfo.prototype.type;\n\n/** @type {string} */\nWebGLActiveInfo.prototype.name;\n\n\n/**\n * @constructor\n */\nfunction WebGLUniformLocation() {}\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_texture_float/\n * @constructor\n */\nfunction OES_texture_float() {}\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/\n * @constructor\n */\nfunction OES_texture_half_float() {}\n\n/** @type {number} */\nOES_texture_half_float.prototype.HALF_FLOAT_OES;\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/\n * @constructor\n */\nfunction WEBGL_lose_context() {}\n\nWEBGL_lose_context.prototype.loseContext = function() {};\n\nWEBGL_lose_context.prototype.restoreContext = function() {};\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/\n * @constructor\n */\nfunction OES_standard_derivatives() {}\n\n/** @type {number} */\nOES_standard_derivatives.prototype.FRAGMENT_SHADER_DERIVATIVE_HINT_OES;\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLVertexArrayObjectOES() {}\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/\n * @constructor\n */\nfunction OES_vertex_array_object() {}\n\n/** @type {number} */\nOES_vertex_array_object.prototype.VERTEX_ARRAY_BINDING_OES;\n\n/**\n * @return {WebGLVertexArrayObjectOES}\n * @nosideeffects\n */\nOES_vertex_array_object.prototype.createVertexArrayOES = function() {};\n\n/**\n * @param {WebGLVertexArrayObjectOES} arrayObject\n * @return {undefined}\n */\nOES_vertex_array_object.prototype.deleteVertexArrayOES =\n function(arrayObject) {};\n\n/**\n * @param {WebGLVertexArrayObjectOES} arrayObject\n * @return {boolean}\n * @nosideeffects\n */\nOES_vertex_array_object.prototype.isVertexArrayOES = function(arrayObject) {};\n\n/**\n * @param {WebGLVertexArrayObjectOES} arrayObject\n * @return {undefined}\n */\nOES_vertex_array_object.prototype.bindVertexArrayOES = function(arrayObject) {};\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/\n * @constructor\n */\nfunction WEBGL_debug_renderer_info() {}\n\n/** @const {number} */\nWEBGL_debug_renderer_info.prototype.UNMASKED_VENDOR_WEBGL;\n\n/** @const {number} */\nWEBGL_debug_renderer_info.prototype.UNMASKED_RENDERER_WEBGL;\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_shaders/\n * @constructor\n */\nfunction WEBGL_debug_shaders() {}\n\n/**\n * @param {WebGLShader} shader\n * @return {string}\n * @nosideeffects\n */\nWEBGL_debug_shaders.prototype.getTranslatedShaderSource = function(shader) {};\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n * @constructor\n */\nfunction WEBGL_compressed_texture_s3tc() {}\n\n/** @const {number} */\nWEBGL_compressed_texture_s3tc.prototype.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\n/** @const {number} */\nWEBGL_compressed_texture_s3tc.prototype.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\n/** @const {number} */\nWEBGL_compressed_texture_s3tc.prototype.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\n/** @const {number} */\nWEBGL_compressed_texture_s3tc.prototype.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_depth_texture/\n * @constructor\n */\nfunction OES_depth_texture() {}\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/\n * @constructor\n */\nfunction OES_element_index_uint() {}\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/\n * @constructor\n */\nfunction EXT_texture_filter_anisotropic() {}\n\n/** @const {number} */\nEXT_texture_filter_anisotropic.prototype.TEXTURE_MAX_ANISOTROPY_EXT;\n\n/** @const {number} */\nEXT_texture_filter_anisotropic.prototype.MAX_TEXTURE_MAX_ANISOTROPY_EXT;\n\n\n/**\n * @see https://www.khronos.org/registry/webgl/extensions/WEBGL_draw_buffers/\n * @constructor\n */\nfunction WEBGL_draw_buffers() {}\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT0_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT1_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT2_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT3_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT4_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT5_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT6_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT7_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT8_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT9_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT10_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT11_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT12_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT13_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT14_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.COLOR_ATTACHMENT15_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER0_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER1_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER2_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER3_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER4_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER5_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER6_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER7_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER8_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER9_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER10_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER11_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER12_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER13_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER14_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.DRAW_BUFFER15_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.MAX_COLOR_ATTACHMENTS_WEBGL;\n\n/** @const {number} */\nWEBGL_draw_buffers.prototype.MAX_DRAW_BUFFERS_WEBGL;\n\n/**\n * @param {Array} buffers Draw buffers.\n * @return {undefined}\n */\nWEBGL_draw_buffers.prototype.drawBuffersWEBGL = function(buffers) {};\n\n\n/**\n * @see http://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/\n * @constructor\n */\nfunction ANGLE_instanced_arrays() {}\n\n\n/** @const {number} */\nANGLE_instanced_arrays.prototype.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE;\n\n\n/**\n * @param {number} mode Primitive type.\n * @param {number} first First vertex.\n * @param {number} count Number of vertices per instance.\n * @param {number} primcount Number of instances.\n * @return {undefined}\n */\nANGLE_instanced_arrays.prototype.drawArraysInstancedANGLE = function(\n mode, first, count, primcount) {};\n\n\n/**\n * @param {number} mode Primitive type.\n * @param {number} count Number of vertex indices per instance.\n * @param {number} type Type of a vertex index.\n * @param {number} offset Offset to the first vertex index.\n * @param {number} primcount Number of instances.\n * @return {undefined}\n */\nANGLE_instanced_arrays.prototype.drawElementsInstancedANGLE = function(\n mode, count, type, offset, primcount) {};\n\n\n/**\n * @param {number} index Attribute index.\n * @param {number} divisor Instance divisor.\n * @return {undefined}\n */\nANGLE_instanced_arrays.prototype.vertexAttribDivisorANGLE = function(\n index, divisor) {};\n\n","externs/webgl2.js":"/*\n * Copyright 2018 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for WebGL functions as described at\n * http://www.khronos.org/registry/webgl/specs/latest/\n *\n * This file is current up to the WebGL 2.0 spec.\n *\n * This relies on webgl.js and html5.js being included for WebGL1, Canvas and\n * Typed Array support.\n *\n * @externs\n */\n\n\n/**\n * @constructor\n * @extends {WebGLRenderingContext}\n */\nfunction WebGL2RenderingContext() {}\n\n\n\n/** @const {number} */\nWebGL2RenderingContext.UNPACK_ROW_LENGTH;\n\n/** @const {number} */\nWebGL2RenderingContext.UNPACK_SKIP_ROWS;\n\n/** @const {number} */\nWebGL2RenderingContext.UNPACK_SKIP_PIXELS;\n\n/** @const {number} */\nWebGL2RenderingContext.PACK_ROW_LENGTH;\n\n/** @const {number} */\nWebGL2RenderingContext.PACK_SKIP_ROWS;\n\n/** @const {number} */\nWebGL2RenderingContext.PACK_SKIP_PIXELS;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH;\n\n/** @const {number} */\nWebGL2RenderingContext.STENCIL;\n\n/** @const {number} */\nWebGL2RenderingContext.RED;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB8;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA8;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB10_A2;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_BINDING_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.UNPACK_SKIP_IMAGES;\n\n/** @const {number} */\nWebGL2RenderingContext.UNPACK_IMAGE_HEIGHT;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_WRAP_R;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_3D_TEXTURE_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_2_10_10_10_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_ELEMENTS_VERTICES;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_ELEMENTS_INDICES;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_MIN_LOD;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_MAX_LOD;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_BASE_LEVEL;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_MAX_LEVEL;\n\n/** @const {number} */\nWebGL2RenderingContext.MIN;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH_COMPONENT24;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_TEXTURE_LOD_BIAS;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_COMPARE_MODE;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_COMPARE_FUNC;\n\n/** @const {number} */\nWebGL2RenderingContext.CURRENT_QUERY;\n\n/** @const {number} */\nWebGL2RenderingContext.QUERY_RESULT;\n\n/** @const {number} */\nWebGL2RenderingContext.QUERY_RESULT_AVAILABLE;\n\n/** @const {number} */\nWebGL2RenderingContext.STREAM_READ;\n\n/** @const {number} */\nWebGL2RenderingContext.STREAM_COPY;\n\n/** @const {number} */\nWebGL2RenderingContext.STATIC_READ;\n\n/** @const {number} */\nWebGL2RenderingContext.STATIC_COPY;\n\n/** @const {number} */\nWebGL2RenderingContext.DYNAMIC_READ;\n\n/** @const {number} */\nWebGL2RenderingContext.DYNAMIC_COPY;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_DRAW_BUFFERS;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER0;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER1;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER2;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER3;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER4;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER5;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER6;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER7;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER8;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER9;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER10;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER11;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER12;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER13;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER14;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_BUFFER15;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_FRAGMENT_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_VERTEX_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.SAMPLER_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.SAMPLER_2D_SHADOW;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAGMENT_SHADER_DERIVATIVE_HINT;\n\n/** @const {number} */\nWebGL2RenderingContext.PIXEL_PACK_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.PIXEL_UNPACK_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.PIXEL_PACK_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.PIXEL_UNPACK_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_MAT2x3;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_MAT2x4;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_MAT3x2;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_MAT3x4;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_MAT4x2;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_MAT4x3;\n\n/** @const {number} */\nWebGL2RenderingContext.SRGB;\n\n/** @const {number} */\nWebGL2RenderingContext.SRGB8;\n\n/** @const {number} */\nWebGL2RenderingContext.SRGB8_ALPHA8;\n\n/** @const {number} */\nWebGL2RenderingContext.COMPARE_REF_TO_TEXTURE;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA32F;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB32F;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA16F;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB16F;\n\n/** @const {number} */\nWebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_ARRAY_TEXTURE_LAYERS;\n\n/** @const {number} */\nWebGL2RenderingContext.MIN_PROGRAM_TEXEL_OFFSET;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_PROGRAM_TEXEL_OFFSET;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_VARYING_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_BINDING_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.R11F_G11F_B10F;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_10F_11F_11F_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB9_E5;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_5_9_9_9_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_BUFFER_MODE;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_VARYINGS;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_BUFFER_START;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;\n\n/** @const {number} */\nWebGL2RenderingContext.RASTERIZER_DISCARD;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;\n\n/** @const {number} */\nWebGL2RenderingContext.INTERLEAVED_ATTRIBS;\n\n/** @const {number} */\nWebGL2RenderingContext.SEPARATE_ATTRIBS;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA32I;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB32I;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA16I;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB16I;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA8I;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB8I;\n\n/** @const {number} */\nWebGL2RenderingContext.RED_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.SAMPLER_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.SAMPLER_2D_ARRAY_SHADOW;\n\n/** @const {number} */\nWebGL2RenderingContext.SAMPLER_CUBE_SHADOW;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_VEC2;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_VEC3;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_VEC4;\n\n/** @const {number} */\nWebGL2RenderingContext.INT_SAMPLER_2D;\n\n/** @const {number} */\nWebGL2RenderingContext.INT_SAMPLER_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.INT_SAMPLER_CUBE;\n\n/** @const {number} */\nWebGL2RenderingContext.INT_SAMPLER_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_SAMPLER_2D;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_SAMPLER_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_SAMPLER_CUBE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_SAMPLER_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH_COMPONENT32F;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH32F_STENCIL8;\n\n/** @const {number} */\nWebGL2RenderingContext.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_RED_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_DEFAULT;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH_STENCIL_ATTACHMENT;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH_STENCIL;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_INT_24_8;\n\n/** @const {number} */\nWebGL2RenderingContext.DEPTH24_STENCIL8;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNED_NORMALIZED;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_FRAMEBUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.READ_FRAMEBUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.DRAW_FRAMEBUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.READ_FRAMEBUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.RENDERBUFFER_SAMPLES;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_COLOR_ATTACHMENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT1;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT2;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT3;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT4;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT5;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT6;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT7;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT8;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT9;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT10;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT11;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT12;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT13;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT14;\n\n/** @const {number} */\nWebGL2RenderingContext.COLOR_ATTACHMENT15;\n\n/** @const {number} */\nWebGL2RenderingContext.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_SAMPLES;\n\n/** @const {number} */\nWebGL2RenderingContext.HALF_FLOAT;\n\n/** @const {number} */\nWebGL2RenderingContext.RG;\n\n/** @const {number} */\nWebGL2RenderingContext.RG_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.R8;\n\n/** @const {number} */\nWebGL2RenderingContext.RG8;\n\n/** @const {number} */\nWebGL2RenderingContext.R16F;\n\n/** @const {number} */\nWebGL2RenderingContext.R32F;\n\n/** @const {number} */\nWebGL2RenderingContext.RG16F;\n\n/** @const {number} */\nWebGL2RenderingContext.RG32F;\n\n/** @const {number} */\nWebGL2RenderingContext.R8I;\n\n/** @const {number} */\nWebGL2RenderingContext.R8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.R16I;\n\n/** @const {number} */\nWebGL2RenderingContext.R16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.R32I;\n\n/** @const {number} */\nWebGL2RenderingContext.R32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RG8I;\n\n/** @const {number} */\nWebGL2RenderingContext.RG8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RG16I;\n\n/** @const {number} */\nWebGL2RenderingContext.RG16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.RG32I;\n\n/** @const {number} */\nWebGL2RenderingContext.RG32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.VERTEX_ARRAY_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.R8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.RG8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.RGBA8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.SIGNED_NORMALIZED;\n\n/** @const {number} */\nWebGL2RenderingContext.COPY_READ_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.COPY_WRITE_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.COPY_READ_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.COPY_WRITE_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BUFFER_START;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_VERTEX_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_FRAGMENT_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_COMBINED_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_UNIFORM_BUFFER_BINDINGS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_UNIFORM_BLOCK_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BUFFER_OFFSET_ALIGNMENT;\n\n/** @const {number} */\nWebGL2RenderingContext.ACTIVE_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_TYPE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_INDEX;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_OFFSET;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_ARRAY_STRIDE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_MATRIX_STRIDE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_IS_ROW_MAJOR;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_DATA_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_ACTIVE_UNIFORMS;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER;\n\n/** @const {number} */\nWebGL2RenderingContext.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER;\n\n/** @const {number} */\nWebGL2RenderingContext.INVALID_INDEX;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_VERTEX_OUTPUT_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_FRAGMENT_INPUT_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_SERVER_WAIT_TIMEOUT;\n\n/** @const {number} */\nWebGL2RenderingContext.OBJECT_TYPE;\n\n/** @const {number} */\nWebGL2RenderingContext.SYNC_CONDITION;\n\n/** @const {number} */\nWebGL2RenderingContext.SYNC_STATUS;\n\n/** @const {number} */\nWebGL2RenderingContext.SYNC_FLAGS;\n\n/** @const {number} */\nWebGL2RenderingContext.SYNC_FENCE;\n\n/** @const {number} */\nWebGL2RenderingContext.SYNC_GPU_COMMANDS_COMPLETE;\n\n/** @const {number} */\nWebGL2RenderingContext.UNSIGNALED;\n\n/** @const {number} */\nWebGL2RenderingContext.SIGNALED;\n\n/** @const {number} */\nWebGL2RenderingContext.ALREADY_SIGNALED;\n\n/** @const {number} */\nWebGL2RenderingContext.TIMEOUT_EXPIRED;\n\n/** @const {number} */\nWebGL2RenderingContext.CONDITION_SATISFIED;\n\n/** @const {number} */\nWebGL2RenderingContext.WAIT_FAILED;\n\n/** @const {number} */\nWebGL2RenderingContext.SYNC_FLUSH_COMMANDS_BIT;\n\n/** @const {number} */\nWebGL2RenderingContext.VERTEX_ATTRIB_ARRAY_DIVISOR;\n\n/** @const {number} */\nWebGL2RenderingContext.ANY_SAMPLES_PASSED;\n\n/** @const {number} */\nWebGL2RenderingContext.ANY_SAMPLES_PASSED_CONSERVATIVE;\n\n/** @const {number} */\nWebGL2RenderingContext.SAMPLER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.RGB10_A2UI;\n\n/** @const {number} */\nWebGL2RenderingContext.INT_2_10_10_10_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_PAUSED;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_ACTIVE;\n\n/** @const {number} */\nWebGL2RenderingContext.TRANSFORM_FEEDBACK_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_IMMUTABLE_FORMAT;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_ELEMENT_INDEX;\n\n/** @const {number} */\nWebGL2RenderingContext.TEXTURE_IMMUTABLE_LEVELS;\n\n/** @const {number} */\nWebGL2RenderingContext.TIMEOUT_IGNORED;\n\n/** @const {number} */\nWebGL2RenderingContext.MAX_CLIENT_WAIT_TIMEOUT_WEBGL;\n\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNPACK_ROW_LENGTH;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNPACK_SKIP_ROWS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNPACK_SKIP_PIXELS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PACK_ROW_LENGTH;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PACK_SKIP_ROWS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PACK_SKIP_PIXELS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.STENCIL;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB10_A2;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_BINDING_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNPACK_SKIP_IMAGES;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNPACK_IMAGE_HEIGHT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_WRAP_R;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_3D_TEXTURE_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_2_10_10_10_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_ELEMENTS_VERTICES;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_ELEMENTS_INDICES;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_MIN_LOD;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_MAX_LOD;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_BASE_LEVEL;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_MAX_LEVEL;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MIN;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH_COMPONENT24;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_TEXTURE_LOD_BIAS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_COMPARE_MODE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_COMPARE_FUNC;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.CURRENT_QUERY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.QUERY_RESULT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.QUERY_RESULT_AVAILABLE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.STREAM_READ;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.STREAM_COPY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.STATIC_READ;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.STATIC_COPY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DYNAMIC_READ;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DYNAMIC_COPY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_DRAW_BUFFERS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER0;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER1;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER2;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER3;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER4;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER5;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER6;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER7;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER9;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER10;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER11;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER12;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER13;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER14;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_BUFFER15;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_FRAGMENT_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_VERTEX_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SAMPLER_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SAMPLER_2D_SHADOW;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAGMENT_SHADER_DERIVATIVE_HINT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PIXEL_PACK_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PIXEL_UNPACK_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PIXEL_PACK_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.PIXEL_UNPACK_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_MAT2x3;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_MAT2x4;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_MAT3x2;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_MAT3x4;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_MAT4x2;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_MAT4x3;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SRGB;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SRGB8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SRGB8_ALPHA8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COMPARE_REF_TO_TEXTURE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA32F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB32F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA16F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB16F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.VERTEX_ATTRIB_ARRAY_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_ARRAY_TEXTURE_LAYERS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MIN_PROGRAM_TEXEL_OFFSET;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_PROGRAM_TEXEL_OFFSET;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_VARYING_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_BINDING_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R11F_G11F_B10F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_10F_11F_11F_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB9_E5;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_5_9_9_9_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_BUFFER_MODE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_VARYINGS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_BUFFER_START;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RASTERIZER_DISCARD;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS =\n 0x8C8A;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INTERLEAVED_ATTRIBS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SEPARATE_ATTRIBS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA32I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB32I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA16I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB16I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA8I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB8I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RED_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SAMPLER_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SAMPLER_2D_ARRAY_SHADOW;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SAMPLER_CUBE_SHADOW;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_VEC2;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_VEC3;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_VEC4;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INT_SAMPLER_2D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INT_SAMPLER_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INT_SAMPLER_CUBE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INT_SAMPLER_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_SAMPLER_2D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_SAMPLER_3D;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_SAMPLER_CUBE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_SAMPLER_2D_ARRAY;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH_COMPONENT32F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH32F_STENCIL8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FLOAT_32_UNSIGNED_INT_24_8_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_RED_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_DEFAULT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH_STENCIL_ATTACHMENT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH_STENCIL;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_INT_24_8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DEPTH24_STENCIL8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNED_NORMALIZED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_FRAMEBUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.READ_FRAMEBUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.DRAW_FRAMEBUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.READ_FRAMEBUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RENDERBUFFER_SAMPLES;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_COLOR_ATTACHMENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT1;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT2;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT3;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT4;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT5;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT6;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT7;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT9;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT10;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT11;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT12;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT13;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT14;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COLOR_ATTACHMENT15;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_SAMPLES;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.HALF_FLOAT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG_INTEGER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG8;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R16F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R32F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG16F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG32F;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R8I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R16I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R32I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG8I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG8UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG16I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG16UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG32I;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG32UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.VERTEX_ARRAY_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.R8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RG8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGBA8_SNORM;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SIGNED_NORMALIZED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COPY_READ_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COPY_WRITE_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COPY_READ_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.COPY_WRITE_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BUFFER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BUFFER_START;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_VERTEX_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_FRAGMENT_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_COMBINED_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_UNIFORM_BUFFER_BINDINGS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_UNIFORM_BLOCK_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BUFFER_OFFSET_ALIGNMENT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.ACTIVE_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_TYPE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_INDEX;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_OFFSET;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_ARRAY_STRIDE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_MATRIX_STRIDE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_IS_ROW_MAJOR;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_DATA_SIZE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_ACTIVE_UNIFORMS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INVALID_INDEX;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_VERTEX_OUTPUT_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_FRAGMENT_INPUT_COMPONENTS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_SERVER_WAIT_TIMEOUT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.OBJECT_TYPE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SYNC_CONDITION;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SYNC_STATUS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SYNC_FLAGS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SYNC_FENCE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SYNC_GPU_COMMANDS_COMPLETE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.UNSIGNALED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SIGNALED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.ALREADY_SIGNALED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TIMEOUT_EXPIRED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.CONDITION_SATISFIED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.WAIT_FAILED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SYNC_FLUSH_COMMANDS_BIT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.VERTEX_ATTRIB_ARRAY_DIVISOR;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.ANY_SAMPLES_PASSED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.ANY_SAMPLES_PASSED_CONSERVATIVE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.SAMPLER_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.RGB10_A2UI;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.INT_2_10_10_10_REV;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_PAUSED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_ACTIVE;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TRANSFORM_FEEDBACK_BINDING;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_IMMUTABLE_FORMAT;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_ELEMENT_INDEX;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TEXTURE_IMMUTABLE_LEVELS;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.TIMEOUT_IGNORED;\n\n/** @const {number} */\nWebGL2RenderingContext.prototype.MAX_CLIENT_WAIT_TIMEOUT_WEBGL;\n\n/* Buffer objects */\n\n/**\n * @param {number} target\n * @param {?ArrayBufferView|?ArrayBuffer|number} data\n * @param {number} usage\n * @param {number=} opt_srcOffset\n * @param {number=} opt_length\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.bufferData = function(\n target, data, usage, opt_srcOffset, opt_length) {};\n\n/**\n * @param {number} target\n * @param {number} offset\n * @param {?ArrayBufferView|?ArrayBuffer} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_length\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.bufferSubData = function(\n target, offset, data, opt_srcOffset, opt_length) {};\n\n/**\n * @param {number} readTarget\n * @param {number} writeTarget\n * @param {number} readOffset\n * @param {number} writeOffset\n * @param {number} size\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.copyBufferSubData = function(\n readTarget, writeTarget, readOffset, writeOffset, size) {};\n\n/**\n * @param {number} target\n * @param {number} srcByteOffset\n * @param {?ArrayBufferView|?ArrayBuffer} dstBuffer\n * @param {number=} opt_dstOffset\n * @param {number=} opt_length\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.getBufferSubData = function(\n target, srcByteOffset, dstBuffer, opt_dstOffset, opt_length) {};\n\n/* Framebuffer objects */\n\n/**\n * @param {number} srcX0\n * @param {number} srcY0\n * @param {number} srcX1\n * @param {number} srcY1\n * @param {number} dstX0\n * @param {number} dstY0\n * @param {number} dstX1\n * @param {number} dstY1\n * @param {number} mask\n * @param {number} filter\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.blitFramebuffer = function(\n srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) {};\n\n/**\n * @param {number} target\n * @param {number} attachment\n * @param {?WebGLTexture} texture\n * @param {number} level\n * @param {number} layer\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.framebufferTextureLayer = function(\n target, attachment, texture, level, layer) {};\n\n/**\n * @param {number} target\n * @param {!Array} attachments\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.invalidateFramebuffer = function(\n target, attachments) {};\n\n/**\n * @param {number} target\n * @param {!Array} attachments\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.invalidateSubFramebuffer = function(\n target, attachments, x, y, width, height) {};\n\n/**\n * @param {number} src\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.readBuffer = function(src) {};\n\n/* Renderbuffer objects */\n\n/**\n * @param {number} target\n * @param {number} internalformat\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getInternalformatParameter = function(\n target, internalformat, pname) {};\n\n/**\n * @param {number} target\n * @param {number} samples\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.renderbufferStorageMultisample = function(\n target, samples, internalformat, width, height) {};\n\n/* Texture objects */\n\n/**\n * @param {number} target\n * @param {number} levels\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.texStorage2D = function(\n target, levels, internalformat, width, height) {};\n\n/**\n * @param {number} target\n * @param {number} levels\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @param {number} depth\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.texStorage3D = function(\n target, levels, internalformat, width, height, depth) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} internalformat\n * @param {number} formatOrWidth\n * @param {number} typeOrHeight\n * @param {?TexImageSource|number} imgOrBorder\n * @param {number=} opt_format\n * @param {number=} opt_type\n * @param {?ArrayBufferView|?TexImageSource|number=} opt_imgOrOffset\n * @param {number=} opt_srcOffset\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.texImage2D = function(\n target, level, internalformat, formatOrWidth, typeOrHeight, imgOrBorder,\n opt_format, opt_type, opt_imgOrOffset, opt_srcOffset) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} formatOrWidth\n * @param {number} typeOrHeight\n * @param {?TexImageSource|number} dataOrFormat\n * @param {number=} opt_type\n * @param {?ArrayBufferView|?TexImageSource|number=} opt_imgOrOffset\n * @param {number=} opt_srcOffset\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.texSubImage2D = function(\n target, level, xoffset, yoffset, formatOrWidth, typeOrHeight, dataOrFormat,\n opt_type, opt_imgOrOffset, opt_srcOffset) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @param {number} depth\n * @param {number} border\n * @param {number} format\n * @param {number} type\n * @param {?ArrayBufferView|?TexImageSource|number} srcData\n * @param {number=} opt_srcOffset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.texImage3D = function(\n target, level, internalformat, width, height, depth, border, format, type,\n srcData, opt_srcOffset) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} zoffset\n * @param {number} width\n * @param {number} height\n * @param {number} depth\n * @param {number} format\n * @param {number} type\n * @param {?ArrayBufferView|?TexImageSource|number} srcData\n * @param {number=} opt_srcOffset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.texSubImage3D = function(\n target, level, xoffset, yoffset, zoffset, width, height, depth, format,\n type, srcData, opt_srcOffset) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} zoffset\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.copyTexSubImage3D = function(\n target, level, xoffset, yoffset, zoffset, x, y, width, height) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @param {number} border\n * @param {?ArrayBufferView|number} srcDataOrSize\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLengthOverride\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.compressedTexImage2D = function(\n target, level, internalformat, width, height, border, srcDataOrSize,\n opt_srcOffset, opt_srcLengthOverride) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @param {number} depth\n * @param {number} border\n * @param {!ArrayBufferView|number} srcDataOrSize\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLengthOverride\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.compressedTexImage3D = function(\n target, level, internalformat, width, height, depth, border, srcDataOrSize,\n opt_srcOffset, opt_srcLengthOverride) {};\n\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} width\n * @param {number} height\n * @param {number} format\n * @param {?ArrayBufferView|number} srcDataOrSize\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLengthOverride\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.compressedTexSubImage2D = function(\n target, level, xoffset, yoffset, width, height, format, srcDataOrSize,\n opt_srcOffset, opt_srcLengthOverride) {};\n\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} xoffset\n * @param {number} yoffset\n * @param {number} zoffset\n * @param {number} width\n * @param {number} height\n * @param {number} depth\n * @param {number} format\n * @param {!ArrayBufferView|number} srcDataOrSize\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLengthOverride\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.compressedTexSubImage3D = function(\n target, level, xoffset, yoffset, zoffset, width, height, depth, format,\n srcDataOrSize, opt_srcOffset, opt_srcLengthOverride) {};\n\n/* Programs and shaders */\n\n/**\n * @param {!WebGLProgram} program\n * @param {string} name\n * @return {number}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getFragDataLocation = function(\n program, name) {};\n\n/* Uniforms */\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform1ui = function(location, v0) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform2ui = function(location, v0, v1) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform3ui = function(location, v0, v1, v2) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @param {number} v3\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform4ui = function(\n location, v0, v1, v2, v3) {};\n\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform1fv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform2fv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform3fv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform4fv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Int32Array|?Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform1iv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Int32Array|?Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform2iv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Int32Array|?Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform3iv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {?Int32Array|?Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniform4iv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {!Uint32Array|!Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform1uiv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {!Uint32Array|!Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform2uiv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {!Uint32Array|!Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform3uiv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {!Uint32Array|!Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniform4uiv = function(\n location, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniformMatrix2fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformMatrix3x2fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformMatrix4x2fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformMatrix2x3fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniformMatrix3fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformMatrix4x3fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformMatrix2x4fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformMatrix3x4fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/**\n * @param {?WebGLUniformLocation} location\n * @param {boolean} transpose\n * @param {?Float32Array|?Array} data\n * @param {number=} opt_srcOffset\n * @param {number=} opt_srcLength\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.uniformMatrix4fv = function(\n location, transpose, data, opt_srcOffset, opt_srcLength) {};\n\n/* Vertex attribs */\n\n/**\n * @param {number} index\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @param {number} w\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.vertexAttribI4i = function(\n index, x, y, z, w) {};\n\n/**\n * @param {number} index\n * @param {!Int32Array|!Array|!Array} values\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.vertexAttribI4iv = function(index, values) {};\n\n/**\n * @param {number} index\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @param {number} w\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.vertexAttribI4ui = function(\n index, x, y, z, w) {};\n\n/**\n * @param {number} index\n * @param {!Uint32Array|!Array|!Array} values\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.vertexAttribI4uiv = function(index, values) {};\n\n/**\n * @param {number} index\n * @param {number} size\n * @param {number} type\n * @param {number} stride\n * @param {number} offset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.vertexAttribIPointer = function(\n index, size, type, stride, offset) {};\n\n/* Writing to the drawing buffer */\n\n/**\n * @param {number} index\n * @param {number} divisor\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.vertexAttribDivisor = function(\n index, divisor) {};\n\n/**\n * @param {number} mode\n * @param {number} first\n * @param {number} count\n * @param {number} instanceCount\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.drawArraysInstanced = function(\n mode, first, count, instanceCount) {};\n\n/**\n * @param {number} mode\n * @param {number} count\n * @param {number} type\n * @param {number} offset\n * @param {number} instanceCount\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.drawElementsInstanced = function(\n mode, count, type, offset, instanceCount) {};\n\n/**\n * @param {number} mode\n * @param {number} start\n * @param {number} end\n * @param {number} count\n * @param {number} type\n * @param {number} offset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.drawRangeElements = function(\n mode, start, end, count, type, offset) {};\n\n/* Reading back pixels */\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} format\n * @param {number} type\n * @param {?ArrayBufferView|number} dstDataOrOffset\n * @param {number=} opt_dstOffset\n * @return {undefined}\n * @override\n */\nWebGL2RenderingContext.prototype.readPixels = function(\n x, y, width, height, format, type, dstDataOrOffset, opt_dstOffset) {};\n\n/* Multiple Render Targets */\n\n/**\n * @param {!Array} buffers\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.drawBuffers = function(buffers) {};\n\n\n/**\n * @param {number} buffer\n * @param {number} drawbuffer\n * @param {!Float32Array|!Array} values\n * @param {number=} opt_srcOffset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.clearBufferfv = function(\n buffer, drawbuffer, values, opt_srcOffset) {};\n\n/**\n * @param {number} buffer\n * @param {number} drawbuffer\n * @param {!Int32Array|!Array|!Array} values\n * @param {number=} opt_srcOffset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.clearBufferiv = function(\n buffer, drawbuffer, values, opt_srcOffset) {};\n\n/**\n * @param {number} buffer\n * @param {number} drawbuffer\n * @param {!Uint32Array|!Array|!Array} values\n * @param {number=} opt_srcOffset\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.clearBufferuiv = function(\n buffer, drawbuffer, values, opt_srcOffset) {};\n\n/**\n * @param {number} buffer\n * @param {number} drawbuffer\n * @param {number} depth\n * @param {number} stencil\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.clearBufferfi = function(\n buffer, drawbuffer, depth, stencil) {};\n\n/* Query Objects */\n\n/**\n * @return {?WebGLQuery}\n */\nWebGL2RenderingContext.prototype.createQuery = function() {};\n\n/**\n * @param {?WebGLQuery} query\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.deleteQuery = function(query) {};\n\n/**\n * @param {?WebGLQuery} query\n * @return {boolean}\n */\nWebGL2RenderingContext.prototype.isQuery = function(query) {};\n\n/**\n * @param {number} target\n * @param {!WebGLQuery} query\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.beginQuery = function(target, query) {};\n\n/**\n * @param {number} target\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.endQuery = function(target) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @return {?WebGLQuery}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getQuery = function(target, pname) {};\n\n/**\n * @param {!WebGLQuery} query\n * @param {number} pname\n * @return {*}\n */\nWebGL2RenderingContext.prototype.getQueryParameter = function(query, pname) {};\n\n/* Sampler Objects */\n\n/**\n * @return {?WebGLSampler}\n */\nWebGL2RenderingContext.prototype.createSampler = function() {};\n\n/**\n * @param {?WebGLSampler} sampler\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.deleteSampler = function(sampler) {};\n\n/**\n * @param {?WebGLSampler} sampler\n * @return {boolean}\n */\nWebGL2RenderingContext.prototype.isSampler = function(sampler) {};\n\n/**\n * @param {number} unit\n * @param {?WebGLSampler} sampler\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.bindSampler = function(unit, sampler) {};\n\n/**\n * @param {!WebGLSampler} sampler\n * @param {number} pname\n * @param {number} param\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.samplerParameteri = function(\n sampler, pname, param) {};\n\n/**\n * @param {!WebGLSampler} sampler\n * @param {number} pname\n * @param {number} param\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.samplerParameterf = function(\n sampler, pname, param) {};\n\n/**\n * @param {!WebGLSampler} sampler\n * @param {number} pname\n * @return {*}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getSamplerParameter = function(\n sampler, pname) {};\n\n/* Sync objects */\n\n/**\n * @param {number} condition\n * @param {number} flags\n * @return {?WebGLSync}\n */\nWebGL2RenderingContext.prototype.fenceSync = function(condition, flags) {};\n\n/**\n * @param {?WebGLSync} sync\n * @return {boolean}\n */\nWebGL2RenderingContext.prototype.isSync = function(sync) {};\n\n/**\n * @param {?WebGLSync} sync\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.deleteSync = function(sync) {};\n\n/**\n * @param {!WebGLSync} sync\n * @param {number} flags\n * @param {number} timeout\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.clientWaitSync = function(\n sync, flags, timeout) {};\n\n/**\n * @param {!WebGLSync} sync\n * @param {number} flags\n * @param {number} timeout\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.waitSync = function(sync, flags, timeout) {};\n\n/**\n * @param {!WebGLSync} sync\n * @param {number} pname\n * @return {*}\n */\nWebGL2RenderingContext.prototype.getSyncParameter = function(sync, pname) {};\n\n/* Transform Feedback */\n\n/**\n * @return {?WebGLTransformFeedback}\n */\nWebGL2RenderingContext.prototype.createTransformFeedback = function() {};\n\n/**\n * @param {?WebGLTransformFeedback} tf\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.deleteTransformFeedback = function(tf) {};\n\n/**\n * @param {?WebGLTransformFeedback} tf\n * @return {boolean}\n */\nWebGL2RenderingContext.prototype.isTransformFeedback = function(tf) {};\n\n/**\n * @param {number} target\n * @param {?WebGLTransformFeedback} tf\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.bindTransformFeedback = function(\n target, tf) {};\n\n/**\n * @param {number} primitiveMode\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.beginTransformFeedback = function(\n primitiveMode) {};\n\n/**\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.endTransformFeedback = function() {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {!Array} varyings\n * @param {number} bufferMode\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.transformFeedbackVaryings = function(\n program, varyings, bufferMode) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} index\n * @return {?WebGLActiveInfo}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getTransformFeedbackVarying = function(\n program, index) {};\n\n/**\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.pauseTransformFeedback = function() {};\n\n/**\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.resumeTransformFeedback = function() {};\n\n/* Uniform Buffer Objects and Transform Feedback Buffers */\n\n/**\n * @param {number} target\n * @param {number} index\n * @param {?WebGLBuffer} buffer\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.bindBufferBase = function(\n target, index, buffer) {};\n\n/**\n * @param {number} target\n * @param {number} index\n * @param {?WebGLBuffer} buffer\n * @param {number} offset\n * @param {number} size\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.bindBufferRange = function(\n target, index, buffer, offset, size) {};\n\n/**\n * @param {number} target\n * @param {number} index\n * @return {*}\n */\nWebGL2RenderingContext.prototype.getIndexedParameter = function(\n target, index) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {!Array} uniformNames\n * @return {!Array}\n */\nWebGL2RenderingContext.prototype.getUniformIndices = function(\n program, uniformNames) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {!Array} uniformIndices\n * @param {number} pname\n * @return {*}\n */\nWebGL2RenderingContext.prototype.getActiveUniforms = function(\n program, uniformIndices, pname) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {string} uniformBlockName\n * @return {number}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getUniformBlockIndex = function(\n program, uniformBlockName) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} uniformBlockIndex\n * @param {number} pname\n * @return {*}\n */\nWebGL2RenderingContext.prototype.getActiveUniformBlockParameter = function(\n program, uniformBlockIndex, pname) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} uniformBlockIndex\n * @return {?string}\n * @nosideeffects\n */\nWebGL2RenderingContext.prototype.getActiveUniformBlockName = function(\n program, uniformBlockIndex) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} uniformBlockIndex\n * @param {number} uniformBlockBinding\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.uniformBlockBinding = function(\n program, uniformBlockIndex, uniformBlockBinding) {};\n\n/* Vertex Array Objects */\n\n/**\n * @return {?WebGLVertexArrayObject}\n */\nWebGL2RenderingContext.prototype.createVertexArray = function() {};\n\n/**\n * @param {?WebGLVertexArrayObject} vertexArray\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.deleteVertexArray = function(vertexArray) {};\n\n/**\n * @param {?WebGLVertexArrayObject} vertexArray\n * @return {boolean}\n */\nWebGL2RenderingContext.prototype.isVertexArray = function(vertexArray) {};\n\n/**\n * @param {?WebGLVertexArrayObject} array\n * @return {undefined}\n */\nWebGL2RenderingContext.prototype.bindVertexArray = function(array) {};\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLQuery() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLSampler() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLSync() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLTransformFeedback() {}\n\n\n/**\n * @constructor\n * @extends {WebGLObject}\n */\nfunction WebGLVertexArrayObject() {}\n","externs/webgl2_compute.js":"/*\n * Copyright 2019 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for WebGL functions as described at\n * http://www.khronos.org/registry/webgl/specs/latest/\n *\n * This file is current up to the WebGL 2.0 Compute spec.\n *\n * This relies on webgl2.js and html5.js being included for WebGL2, Canvas and\n * Typed Array support.\n *\n * @externs\n */\n\n\n/**\n * @constructor\n * @extends {WebGL2RenderingContext}\n * @see https://www.khronos.org/registry/webgl/specs/latest/2.0-compute/#webgl2-compute-context\n */\nfunction WebGL2ComputeRenderingContext() {}\n\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.COMPUTE_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_SHARED_MEMORY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_WORK_GROUP_INVOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_WORK_GROUP_COUNT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_WORK_GROUP_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.COMPUTE_WORK_GROUP_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.DISPATCH_INDIRECT_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.DISPATCH_INDIRECT_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.COMPUTE_SHADER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.DRAW_INDIRECT_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.DRAW_INDIRECT_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_UNIFORM_LOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.FRAMEBUFFER_DEFAULT_WIDTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.FRAMEBUFFER_DEFAULT_HEIGHT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.FRAMEBUFFER_DEFAULT_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAMEBUFFER_WIDTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAMEBUFFER_HEIGHT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAMEBUFFER_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNIFORM;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNIFORM_BLOCK;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.PROGRAM_INPUT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.PROGRAM_OUTPUT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.BUFFER_VARIABLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BLOCK;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ATOMIC_COUNTER_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TRANSFORM_FEEDBACK_VARYING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ACTIVE_RESOURCES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_NAME_LENGTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_NUM_ACTIVE_VARIABLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.NAME_LENGTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ARRAY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.BLOCK_INDEX;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ARRAY_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MATRIX_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IS_ROW_MAJOR;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ATOMIC_COUNTER_BUFFER_INDEX;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.BUFFER_DATA_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.NUM_ACTIVE_VARIABLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ACTIVE_VARIABLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.REFERENCED_BY_VERTEX_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.REFERENCED_BY_FRAGMENT_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.REFERENCED_BY_COMPUTE_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TOP_LEVEL_ARRAY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TOP_LEVEL_ARRAY_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.LOCATION;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_SHADER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.FRAGMENT_SHADER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ALL_SHADER_BITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ATOMIC_COUNTER_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ATOMIC_COUNTER_BUFFER_START;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ATOMIC_COUNTER_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMBINED_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAGMENT_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMBINED_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_ATOMIC_COUNTER_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_ATOMIC_COUNTER_BUFFER_BINDINGS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ACTIVE_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNSIGNED_INT_ATOMIC_COUNTER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_IMAGE_UNITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAGMENT_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMBINED_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_BINDING_NAME;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_BINDING_LEVEL;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_BINDING_LAYERED;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_BINDING_LAYER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_BINDING_ACCESS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_BINDING_FORMAT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_ATTRIB_ARRAY_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ELEMENT_ARRAY_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNIFORM_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_FETCH_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_IMAGE_ACCESS_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.COMMAND_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.PIXEL_BUFFER_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_UPDATE_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.BUFFER_UPDATE_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.FRAMEBUFFER_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TRANSFORM_FEEDBACK_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ATOMIC_COUNTER_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.ALL_BARRIER_BITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_2D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_3D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_CUBE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.INT_IMAGE_2D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.INT_IMAGE_3D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.INT_IMAGE_CUBE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.INT_IMAGE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNSIGNED_INT_IMAGE_2D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNSIGNED_INT_IMAGE_3D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNSIGNED_INT_IMAGE_CUBE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNSIGNED_INT_IMAGE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_FORMAT_COMPATIBILITY_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.IMAGE_FORMAT_COMPATIBILITY_BY_CLASS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.READ_ONLY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.WRITE_ONLY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.READ_WRITE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BUFFER_START;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_FRAGMENT_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMPUTE_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMBINED_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_SHADER_STORAGE_BUFFER_BINDINGS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_SHADER_STORAGE_BLOCK_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COMBINED_SHADER_OUTPUT_RESOURCES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.DEPTH_STENCIL_TEXTURE_MODE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.STENCIL_INDEX;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MIN_PROGRAM_TEXTURE_GATHER_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_PROGRAM_TEXTURE_GATHER_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SAMPLE_POSITION;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SAMPLE_MASK;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SAMPLE_MASK_VALUE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_SAMPLE_MASK_WORDS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_COLOR_TEXTURE_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_DEPTH_TEXTURE_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_INTEGER_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_BINDING_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_FIXED_SAMPLE_LOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_WIDTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_HEIGHT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_DEPTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_INTERNAL_FORMAT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_RED_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_GREEN_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_BLUE_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_ALPHA_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_DEPTH_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_STENCIL_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_SHARED_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_RED_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_GREEN_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_BLUE_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_ALPHA_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_DEPTH_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.TEXTURE_COMPRESSED;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.SAMPLER_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.INT_SAMPLER_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_ATTRIB_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_ATTRIB_RELATIVE_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_BINDING_DIVISOR;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_BINDING_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_BINDING_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.VERTEX_BINDING_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_ATTRIB_RELATIVE_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_ATTRIB_BINDINGS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.MAX_VERTEX_ATTRIB_STRIDE;\n\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.COMPUTE_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_UNIFORM_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_TEXTURE_IMAGE_UNITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_SHARED_MEMORY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_WORK_GROUP_INVOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_WORK_GROUP_COUNT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_WORK_GROUP_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.COMPUTE_WORK_GROUP_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.DISPATCH_INDIRECT_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.DISPATCH_INDIRECT_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.COMPUTE_SHADER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.DRAW_INDIRECT_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.DRAW_INDIRECT_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_UNIFORM_LOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.FRAMEBUFFER_DEFAULT_WIDTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.FRAMEBUFFER_DEFAULT_HEIGHT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.FRAMEBUFFER_DEFAULT_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype\n .FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAMEBUFFER_WIDTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAMEBUFFER_HEIGHT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAMEBUFFER_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNIFORM;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNIFORM_BLOCK;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.PROGRAM_INPUT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.PROGRAM_OUTPUT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.BUFFER_VARIABLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BLOCK;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ATOMIC_COUNTER_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TRANSFORM_FEEDBACK_VARYING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ACTIVE_RESOURCES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_NAME_LENGTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_NUM_ACTIVE_VARIABLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.NAME_LENGTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ARRAY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.BLOCK_INDEX;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ARRAY_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MATRIX_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IS_ROW_MAJOR;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ATOMIC_COUNTER_BUFFER_INDEX;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.BUFFER_DATA_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.NUM_ACTIVE_VARIABLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ACTIVE_VARIABLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.REFERENCED_BY_VERTEX_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.REFERENCED_BY_FRAGMENT_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.REFERENCED_BY_COMPUTE_SHADER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TOP_LEVEL_ARRAY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TOP_LEVEL_ARRAY_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.LOCATION;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_SHADER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.FRAGMENT_SHADER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ALL_SHADER_BITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ATOMIC_COUNTER_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ATOMIC_COUNTER_BUFFER_START;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ATOMIC_COUNTER_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMBINED_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAGMENT_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMBINED_ATOMIC_COUNTERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_ATOMIC_COUNTER_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_ATOMIC_COUNTER_BUFFER_BINDINGS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ACTIVE_ATOMIC_COUNTER_BUFFERS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNSIGNED_INT_ATOMIC_COUNTER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_IMAGE_UNITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAGMENT_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMBINED_IMAGE_UNIFORMS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_BINDING_NAME;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_BINDING_LEVEL;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_BINDING_LAYERED;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_BINDING_LAYER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_BINDING_ACCESS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_BINDING_FORMAT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_ATTRIB_ARRAY_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ELEMENT_ARRAY_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNIFORM_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_FETCH_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_IMAGE_ACCESS_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.COMMAND_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.PIXEL_BUFFER_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_UPDATE_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.BUFFER_UPDATE_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.FRAMEBUFFER_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TRANSFORM_FEEDBACK_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ATOMIC_COUNTER_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BARRIER_BIT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.ALL_BARRIER_BITS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_2D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_3D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_CUBE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.INT_IMAGE_2D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.INT_IMAGE_3D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.INT_IMAGE_CUBE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.INT_IMAGE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNSIGNED_INT_IMAGE_2D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNSIGNED_INT_IMAGE_3D;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNSIGNED_INT_IMAGE_CUBE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNSIGNED_INT_IMAGE_2D_ARRAY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_FORMAT_COMPATIBILITY_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.IMAGE_FORMAT_COMPATIBILITY_BY_CLASS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.READ_ONLY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.WRITE_ONLY;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.READ_WRITE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BUFFER_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BUFFER_START;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BUFFER_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_FRAGMENT_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMPUTE_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMBINED_SHADER_STORAGE_BLOCKS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_SHADER_STORAGE_BUFFER_BINDINGS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_SHADER_STORAGE_BLOCK_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COMBINED_SHADER_OUTPUT_RESOURCES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.DEPTH_STENCIL_TEXTURE_MODE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.STENCIL_INDEX;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MIN_PROGRAM_TEXTURE_GATHER_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_PROGRAM_TEXTURE_GATHER_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SAMPLE_POSITION;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SAMPLE_MASK;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SAMPLE_MASK_VALUE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_SAMPLE_MASK_WORDS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_COLOR_TEXTURE_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_DEPTH_TEXTURE_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_INTEGER_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_BINDING_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_SAMPLES;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_FIXED_SAMPLE_LOCATIONS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_WIDTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_HEIGHT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_DEPTH;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_INTERNAL_FORMAT;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_RED_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_GREEN_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_BLUE_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_ALPHA_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_DEPTH_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_STENCIL_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_SHARED_SIZE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_RED_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_GREEN_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_BLUE_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_ALPHA_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_DEPTH_TYPE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.TEXTURE_COMPRESSED;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.SAMPLER_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.INT_SAMPLER_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_ATTRIB_BINDING;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_ATTRIB_RELATIVE_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_BINDING_DIVISOR;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_BINDING_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_BINDING_STRIDE;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.VERTEX_BINDING_BUFFER;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_ATTRIB_RELATIVE_OFFSET;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_ATTRIB_BINDINGS;\n\n/** @const {number} */\nWebGL2ComputeRenderingContext.prototype.MAX_VERTEX_ATTRIB_STRIDE;\n\n\n/**\n * @param {number} num_groups_x\n * @param {number} num_groups_y\n * @param {number} num_groups_z\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.dispatchCompute = function(\n num_groups_x, num_groups_y, num_groups_z) {};\n\n/**\n * @param {number} offset\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.dispatchComputeIndirect = function(\n offset) {};\n\n/**\n * @param {number} mode\n * @param {number} offset\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.drawArraysIndirect = function(\n mode, offset) {};\n\n/**\n * @param {number} mode\n * @param {number} type\n * @param {number} offset\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.drawElementsIndirect = function(\n mode, type, offset) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @param {number} param\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.framebufferParameter = function(\n target, pname, param) {};\n\n/**\n * @param {number} target\n * @param {number} pname\n * @return {*}\n */\nWebGL2ComputeRenderingContext.prototype.getFramebufferParameter = function(\n target, pname) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} programInterface\n * @param {number} pname\n * @return {*}\n */\nWebGL2ComputeRenderingContext.prototype.getProgramInterfaceParameter = function(\n program, programInterface, pname) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} programInterface\n * @param {number} index\n * @param {!Array} props\n * @return {?Array<*>}\n */\nWebGL2ComputeRenderingContext.prototype.getProgramResource = function(\n program, programInterface, index, props) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} programInterface\n * @param {string} name\n * @return {number}\n */\nWebGL2ComputeRenderingContext.prototype.getProgramResourceIndex = function(\n program, programInterface, name) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} programInterface\n * @param {number} index\n * @return {?string}\n */\nWebGL2ComputeRenderingContext.prototype.getProgramResourceName = function(\n program, programInterface, index) {};\n\n/**\n * @param {!WebGLProgram} program\n * @param {number} programInterface\n * @param {string} name\n * @return {*}\n */\nWebGL2ComputeRenderingContext.prototype.getProgramResourceLocation = function(\n program, programInterface, name) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform1i = function(\n program, location, v0) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform2i = function(\n program, location, v0, v1) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform3i = function(\n program, location, v0, v1, v2) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @param {number} v3\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform4i = function(\n program, location, v0, v1, v2, v3) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform1ui = function(\n program, location, v0) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform2ui = function(\n program, location, v0, v1) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform3ui = function(\n program, location, v0, v1, v2) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @param {number} v3\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform4ui = function(\n program, location, v0, v1, v2, v3) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform1f = function(\n program, location, v0) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform2f = function(\n program, location, v0, v1) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform3f = function(\n program, location, v0, v1, v2) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} v0\n * @param {number} v1\n * @param {number} v2\n * @param {number} v3\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform4f = function(\n program, location, v0, v1, v2, v3) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Int32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform1iv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Int32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform2iv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Int32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform3iv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Int32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform4iv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Uint32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform1uiv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Uint32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform2uiv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Uint32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform3uiv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Uint32Array|!Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform4uiv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform1fv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform2fv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform3fv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniform4fv = function(\n program, location, count, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix2fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix3fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix4fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix2x3fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix3x2fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix2x4fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix4x2fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix3x4fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {?WebGLProgram} program\n * @param {?WebGLUniformLocation} location\n * @param {number} count\n * @param {boolean} transpose\n * @param {!Float32Array|!Array} data\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.programUniformMatrix4x3fv = function(\n program, location, count, transpose, data) {};\n\n/**\n * @param {number} unit\n * @param {?WebGLTexture} texture\n * @param {number} level\n * @param {boolean} layered\n * @param {number} layer\n * @param {number} access\n * @param {number} format\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.bindImageTexture = function(\n unit, texture, level, layered, layer, access, format) {};\n\n/**\n * @param {number} barriers\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.memoryBarrier = function(barriers) {};\n\n/**\n * @param {number} barriers\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.memoryBarrierByRegion = function(\n barriers) {};\n\n/**\n * @param {number} target\n * @param {number} samples\n * @param {number} internalformat\n * @param {number} width\n * @param {number} height\n * @param {boolean} fixedsamplelocations\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.texStorage2DMultisample = function(\n target, samples, internalformat, width, height, fixedsamplelocations) {};\n\n/**\n * @param {number} target\n * @param {number} level\n * @param {number} pname\n * @return {*}\n */\nWebGL2ComputeRenderingContext.prototype.getTexLevelParameter = function(\n target, level, pname) {};\n\n/**\n * @param {number} pname\n * @param {number} index\n * @return {*}\n */\nWebGL2ComputeRenderingContext.prototype.getMultisample = function(\n pname, index) {};\n\n/**\n * @param {number} index\n * @param {number} mask\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.sampleMask = function(index, mask) {};\n\n/**\n * @param {number} bindingindex\n * @param {?WebGLBuffer} buffer\n * @param {number} offset\n * @param {number} stride\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.bindVertexBuffer = function(\n bindingindex, buffer, offset, stride) {};\n\n/**\n * @param {number} attribindex\n * @param {number} size\n * @param {number} type\n * @param {boolean} normalized\n * @param {number} relativeoffset\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.vertexAttribFormat = function(\n attribindex, size, type, normalized, relativeoffset) {};\n\n/**\n * @param {number} attribindex\n * @param {number} size\n * @param {number} type\n * @param {number} relativeoffset\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.vertexAttribIFormat = function(\n attribindex, size, type, relativeoffset) {};\n\n/**\n * @param {number} attribindex\n * @param {number} bindingindex\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.vertexAttribBinding = function(\n attribindex, bindingindex) {};\n\n/**\n * @param {number} bindingindex\n * @param {number} divisor\n * @return {undefined}\n */\nWebGL2ComputeRenderingContext.prototype.vertexBindingDivisor = function(\n bindingindex, divisor) {};\n","externs/webkit_notifications.js":"/*\n * Copyright 2010 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for W3C's Notifications specification.\n * @externs\n * @author [email protected] (Drew Wilson)\n */\n\n/**\n * @typedef {{\n * dir: (string|undefined),\n * lang: (string|undefined),\n * body: (string|undefined),\n * tag: (string|undefined),\n * image: (string|undefined),\n * icon: (string|undefined),\n * badge: (string|undefined),\n * vibrate: (!Array|undefined),\n * timestamp: (number|undefined),\n * renotify: (boolean|undefined),\n * silent: (boolean|undefined),\n * requireInteraction: (boolean|undefined),\n * data: (*|undefined),\n * actions: (!Array|undefined),\n * }}\n * TODO(rsk): change the type of data to a serializable object\n * (https://html.spec.whatwg.org/multipage/structured-data.html).\n *\n * @see http://notifications.spec.whatwg.org/#notification\n */\nvar NotificationOptions;\n\n/**\n * @typedef {{action: string, title: string, icon: (string|undefined)}}\n * @see https://notifications.spec.whatwg.org/#dictdef-notificationoptions\n */\nvar NotificationAction;\n\n/**\n * @typedef {{tag: (string|undefined)}}\n * @see https://notifications.spec.whatwg.org/#dictdef-getnotificationoptions\n */\nvar GetNotificationOptions;\n\n/** @interface */\nvar NotificationOptionsInterface_ = function() {}\n/** @type {string} */ NotificationOptionsInterface_.prototype.dir;\n/** @type {string} */ NotificationOptionsInterface_.prototype.lang;\n/** @type {string} */ NotificationOptionsInterface_.prototype.body;\n/** @type {string} */ NotificationOptionsInterface_.prototype.tag;\n/** @type {string} */ NotificationOptionsInterface_.prototype.icon;\n/** @type {boolean} */\n NotificationOptionsInterface_.prototype.requireInteraction;\n\n/**\n * @param {string} title\n * @param {NotificationOptions=} opt_options\n * @constructor\n * @implements {EventTarget}\n * @see http://notifications.spec.whatwg.org/#notification\n */\nfunction Notification(title, opt_options) {}\n\n/**\n * @type {string}\n */\nNotification.permission;\n\n/**\n * @param {NotificationPermissionCallback=} opt_callback\n * @return {!Promise}\n */\nNotification.requestPermission = function(opt_callback) {};\n\n/** @override */\nNotification.prototype.addEventListener = function(\n type, listener, opt_options) {};\n\n/** @override */\nNotification.prototype.removeEventListener = function(\n type, listener, opt_options) {};\n\n/** @override */\nNotification.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @type {string}\n */\nNotification.prototype.title;\n\n/**\n * @type {string}\n */\nNotification.prototype.body;\n\n/**\n * @type {string}\n */\nNotification.prototype.icon;\n\n/**\n * The string used by clients to identify the notification.\n * @type {string}\n */\nNotification.prototype.tag;\n\n/**\n * The ID used by clients to uniquely identify notifications to eliminate\n * duplicate notifications.\n * @type {string}\n * @deprecated Use NotificationOptions.tag instead.\n */\nNotification.prototype.replaceId;\n\n/**\n * @type {*}\n */\nNotification.prototype.data;\n\n/**\n * The string used by clients to specify the directionality (rtl/ltr) of the\n * notification.\n * @type {string}\n * @deprecated Use NotificationOptions.titleDir and bodyDir instead.\n */\nNotification.prototype.dir;\n\n/**\n * Displays the notification.\n * @return {undefined}\n */\nNotification.prototype.show = function() {};\n\n/**\n * Prevents the notification from being displayed, or closes it if it is already\n * displayed.\n * @return {undefined}\n */\nNotification.prototype.cancel = function() {};\n\n/**\n * Prevents the notification from being displayed, or closes it if it is already\n * displayed.\n * @return {undefined}\n */\nNotification.prototype.close = function() {};\n\n/**\n * An event handler called when notification is closed.\n * @type {?function(Event)}\n */\nNotification.prototype.onclose;\n\n/**\n * An event handler called if the notification could not be displayed due to\n * an error (i.e. resource could not be loaded).\n * @type {?function(Event)}\n */\nNotification.prototype.onerror;\n\n/**\n * An event handler called when the notification has become visible.\n * @type {?function(Event)}\n * @deprecated Use onshow instead.\n */\nNotification.prototype.ondisplay;\n\n/**\n * An event handler called when the notification has become visible.\n * @type {?function(Event)}\n */\nNotification.prototype.onshow;\n\n/**\n * An event handler called when the notification has been clicked on.\n * @type {?function(Event)}\n */\nNotification.prototype.onclick;\n\n\n\n/**\n * @typedef {function(string)}\n * @see http://notifications.spec.whatwg.org/#notificationpermissioncallback\n */\nvar NotificationPermissionCallback;\n\n/**\n * @constructor\n * @see http://dev.w3.org/2006/webapi/WebNotifications/publish/#dialog-if\n * @deprecated Use Notification instead.\n */\nfunction NotificationCenter() {}\n\n/**\n * Creates a text+icon notification and displays it to the user.\n * @param {string} iconUrl\n * @param {string} title\n * @param {string} body\n * @return {Notification}\n */\nNotificationCenter.prototype.createNotification =\n function(iconUrl, title, body) {};\n\n/**\n * Creates an HTML notification and displays it to the user.\n * @param {string} url\n * @return {Notification}\n */\nNotificationCenter.prototype.createHTMLNotification = function(url) {};\n\n/**\n * Checks if the user has permission to display notifications.\n * @return {number}\n */\nNotificationCenter.prototype.checkPermission = function() {};\n\n/**\n * Requests permission from the user to display notifications.\n * @param {Function=} opt_callback\n * @return {void}\n */\nNotificationCenter.prototype.requestPermission = function(opt_callback) {};\n\n/**\n * WebKit browsers expose the NotificationCenter API through\n * window.webkitNotifications.\n * @type {NotificationCenter}\n */\nWindow.prototype.webkitNotifications;\n\n\n/**\n * @see https://notifications.spec.whatwg.org/#notificationevent\n * @constructor\n * @param {string} type\n * @param {!ExtendableEventInit=} opt_eventInitDict\n * @extends {ExtendableEvent}\n */\nfunction NotificationEvent(type, opt_eventInitDict) {}\n\n/** @type {!Notification} */\nNotificationEvent.prototype.notification;\n\n/** @type {string} */\nNotificationEvent.prototype.action;\n","externs/webkit_usercontent.js":"/*\n * Copyright 2016 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for WKWebView's User Content interface.\n * https://developer.apple.com/library/prerelease/ios/documentation/WebKit/Reference/WKUserContentController_Ref/\n * https://trac.webkit.org/browser/trunk/Source/WebCore/page/WebKitNamespace.h\n *\n * @externs\n */\n\n/** @constructor */\nfunction WebKitNamespace() {}\n\n\n/**\n * @type {!UserMessageHandlersNamespace}\n */\nWebKitNamespace.prototype.messageHandlers;\n\n\n/**\n * @constructor\n * @implements {IObject}\n */\nfunction UserMessageHandlersNamespace() {}\n\n\n/** @constructor */\nfunction UserMessageHandler() {}\n\n\n/**\n * @param {*} message\n * @return {undefined}\n */\nUserMessageHandler.prototype.postMessage = function(message) {};\n\n\n/**\n * @const {!WebKitNamespace}\n */\nvar webkit;\n","externs/webstorage.js":"/*\n * Copyright 2009 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions for W3C's WebStorage specification.\n * This file depends on html5.js.\n * @externs\n * @author [email protected] (Jeff Bailey)\n */\n\n/**\n * @interface\n * @see https://www.w3.org/TR/webstorage/#the-storage-interface\n */\nfunction Storage() {}\n\n/**\n * @const {number}\n */\nStorage.prototype.length;\n\n/**\n * @param {number} index\n * @return {?string}\n */\nStorage.prototype.key = function(index) {};\n\n/**\n * @param {string} key\n * @return {?string}\n */\nStorage.prototype.getItem = function(key) {};\n\n/**\n * @param {string} key\n * @param {string} data\n * @return {void}\n */\nStorage.prototype.setItem = function(key, data) {};\n\n/**\n * @param {string} key\n * @return {void}\n */\nStorage.prototype.removeItem = function(key) {};\n\n/**\n * @return {void}\n */\nStorage.prototype.clear = function() {};\n\n/**\n * @interface\n * @see https://www.w3.org/TR/webstorage/#the-sessionstorage-attribute\n */\nfunction WindowSessionStorage() {}\n\n/**\n * @type {Storage}\n */\nWindowSessionStorage.prototype.sessionStorage;\n\n/**\n * Window implements WindowSessionStorage\n *\n * @type {Storage}\n */\nWindow.prototype.sessionStorage;\n\n/**\n * @interface\n * @see https://www.w3.org/TR/webstorage/#the-localstorage-attribute\n */\nfunction WindowLocalStorage() {}\n\n/**\n * @type {Storage}\n */\nWindowLocalStorage.prototype.localStorage;\n\n/**\n * Window implements WindowLocalStorage\n *\n * @type {Storage}\n */\nWindow.prototype.localStorage;\n\n/**\n * @record\n * @extends {EventInit}\n * @see https://www.w3.org/TR/webstorage/#the-storageevent-interface\n */\nfunction StorageEventInit() {}\n\n/** @type {undefined|string} */\nStorageEventInit.prototype.key;\n\n/** @type {undefined|string} */\nStorageEventInit.prototype.oldValue;\n\n/** @type {undefined|string} */\nStorageEventInit.prototype.newValue;\n\n/** @type {string} */\nStorageEventInit.prototype.url;\n\n/** @type {undefined|!Storage} */\nStorageEventInit.prototype.storageArea;\n\n/**\n * This is the storage event interface.\n * @see https://www.w3.org/TR/webstorage/#the-storage-event\n * @extends {Event}\n * @param {string} type\n * @param {!StorageEventInit=} eventInitDict\n * @constructor\n */\nfunction StorageEvent(type, eventInitDict) {}\n\n/**\n * @type {string}\n */\nStorageEvent.prototype.key;\n\n/**\n * @type {?string}\n */\nStorageEvent.prototype.oldValue;\n\n/**\n * @type {?string}\n */\nStorageEvent.prototype.newValue;\n\n/**\n * @type {string}\n */\nStorageEvent.prototype.url;\n\n/**\n * @type {?Storage}\n */\nStorageEvent.prototype.storageArea;\n\n/**\n * @param {string} typeArg\n * @param {boolean} canBubbleArg\n * @param {boolean} cancelableArg\n * @param {string} keyArg\n * @param {?string} oldValueArg\n * @param {?string} newValueArg\n * @param {string} urlArg\n * @param {?Storage} storageAreaArg\n * @return {void}\n */\nStorageEvent.prototype.initStorageEvent = function(typeArg, canBubbleArg,\n cancelableArg, keyArg,\n oldValueArg, newValueArg,\n urlArg, storageAreaArg) {};\n\n","externs/whatwg_encoding.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for WHATWG's Encoding specification\n * https://encoding.spec.whatwg.org\n * @externs\n */\n\n/**\n * @constructor\n * @param {string=} encoding\n * @param {Object=} options\n */\nfunction TextDecoder(encoding, options) {}\n\n/** @type {string} **/ TextDecoder.prototype.encoding;\n/** @type {boolean} **/ TextDecoder.prototype.fatal;\n/** @type {boolean} **/ TextDecoder.prototype.ignoreBOM;\n\n/**\n * @param {!BufferSource=} input\n * @param {?Object=} options\n * @return {string}\n * @see https://encoding.spec.whatwg.org/#textdecoder\n */\nTextDecoder.prototype.decode = function decode(input, options) {};\n\n/**\n * @constructor\n * @param {string=} utfLabel\n */\nfunction TextEncoder(utfLabel) {}\n\n/** @type {string} **/ TextEncoder.prototype.encoding;\n\n/**\n * @param {string=} input\n * @return {!Uint8Array}\n */\nTextEncoder.prototype.encode = function(input) {};\n","externs/web_app_manifest.js":"/*\n * Copyright 2017 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Externs for web app manifest APIs.\n *\n * @see https://www.w3.org/TR/appmanifest/\n * @externs\n */\n\n/**\n * @see https://www.w3.org/TR/appmanifest/#beforeinstallpromptevent-interface\n * @constructor\n * @extends {Event}\n */\nfunction BeforeInstallPromptEvent() {}\n\n/** @type {!Promise<{outcome: !AppBannerPromptOutcome}>} */\nBeforeInstallPromptEvent.prototype.userChoice;\n\n/** @return {!Promise} */\nBeforeInstallPromptEvent.prototype.prompt = function() {};\n\n/**\n * @typedef {string}\n * @see https://www.w3.org/TR/appmanifest/#appbannerpromptoutcome-enum\n * Possible values: 'accepted', 'dismissed'\n */\nvar AppBannerPromptOutcome;\n\n/** @typedef {{userChoice: !AppBannerPromptOutcome}} */\nvar PromptResponseObject;\n\n/** @type {?function(!BeforeInstallPromptEvent)} */\nWindow.prototype.onbeforeinstallprompt;\n\n/** @type {?function(!Event)} */\nWindow.prototype.onappinstalled;\n","externs/intl.js":"/*\n * Copyright 2013 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for the JS Internationalization API as defined in\n * http://www.ecma-international.org/ecma-402/1.0/\n *\n * @externs\n */\n\n/** @const */\nvar Intl = {};\n\n/**\n * NOTE: this API is not from ecma402 and is subject to change.\n * @param {string|Array=} opt_locales\n * @param {{type: (string|undefined)}=}\n * opt_options\n * @constructor\n */\nIntl.v8BreakIterator = function(opt_locales, opt_options) {};\n\n/**\n * @param {string} text\n * @return {undefined}\n */\nIntl.v8BreakIterator.prototype.adoptText = function(text) {};\n\n/**\n * @return {string}\n */\nIntl.v8BreakIterator.prototype.breakType = function() {};\n\n/**\n * @return {number}\n */\nIntl.v8BreakIterator.prototype.current = function() {};\n\n/**\n * @return {number}\n */\nIntl.v8BreakIterator.prototype.first = function() {};\n\n/**\n * @return {number}\n */\nIntl.v8BreakIterator.prototype.next = function() {};\n\n/**\n * @constructor\n * @param {string|Array=} opt_locales\n * @param {{usage: (string|undefined), localeMatcher: (string|undefined),\n * sensitivity: (string|undefined), ignorePunctuation: (boolean|undefined),\n * numeric: (boolean|undefined), caseFirst: (string|undefined)}=}\n * opt_options\n */\nIntl.Collator = function(opt_locales, opt_options) {};\n\n/**\n * @param {Array} locales\n * @param {{localeMatcher: (string|undefined)}=} opt_options\n * @return {Array}\n */\nIntl.Collator.supportedLocalesOf = function(locales, opt_options) {};\n\n/**\n * @param {string} arg1\n * @param {string} arg2\n * @return {number}\n */\nIntl.Collator.prototype.compare = function(arg1, arg2) {};\n\n/**\n * @return {{locale: string, usage: string, sensitivity: string,\n * ignorePunctuation: boolean, collation: string, numeric: boolean,\n * caseFirst: string}}\n */\nIntl.Collator.prototype.resolvedOptions = function() {};\n\n/**\n * @constructor\n * @param {string|Array=} opt_locales\n * @param {{localeMatcher: (string|undefined), useGrouping: (boolean|undefined),\n * numberingSystem: (string|undefined), style: (string|undefined),\n * currency: (string|undefined), currencyDisplay: (string|undefined),\n * minimumIntegerDigits: (number|undefined),\n * minimumFractionDigits: (number|undefined),\n * maximumFractionDigits: (number|undefined),\n * minimumSignificantDigits: (number|undefined),\n * maximumSignificantDigits: (number|undefined)}=}\n * opt_options\n */\nIntl.NumberFormat = function(opt_locales, opt_options) {};\n\n/**\n * @param {Array} locales\n * @param {{localeMatcher: (string|undefined)}=} opt_options\n * @return {Array}\n */\nIntl.NumberFormat.supportedLocalesOf = function(locales, opt_options) {};\n\n/**\n * @param {number} num\n * @return {string}\n */\nIntl.NumberFormat.prototype.format = function(num) {};\n\n/**\n * @param {number} num\n * @return {!Array<{type: string, value: string}>}\n * @see http://www.ecma-international.org/ecma-402/#sec-intl.numberformat.prototype.formattoparts\n */\nIntl.NumberFormat.prototype.formatToParts = function(num) {};\n\n/**\n * @return {{locale: string, numberingSystem: string, style: string,\n * currency: (string|undefined), currencyDisplay: (string|undefined),\n * minimumIntegerDigits: number, minimumFractionDigits: number,\n * maximumFractionDigits: number, minimumSignificantDigits: number,\n * maximumSignificantDigits: number, useGrouping: boolean}}\n */\nIntl.NumberFormat.prototype.resolvedOptions = function() {};\n\n/**\n * @constructor\n * @param {string|Array=} opt_locales\n * @param {{localeMatcher: (string|undefined),\n * formatMatcher: (string|undefined), calendar: (string|undefined),\n * numberingSystem: (string|undefined), tz: (string|undefined),\n * weekday: (string|undefined), era: (string|undefined),\n * year: (string|undefined), month: (string|undefined),\n * day: (string|undefined), hour: (string|undefined),\n * minute: (string|undefined), second: (string|undefined),\n * timeZoneName: (string|undefined), hour12: (boolean|undefined)}=}\n * opt_options\n */\nIntl.DateTimeFormat = function(opt_locales, opt_options) {};\n\n/**\n * @param {Array} locales\n * @param {{localeMatcher: string}=} opt_options\n * @return {Array}\n */\nIntl.DateTimeFormat.supportedLocalesOf = function(locales, opt_options) {};\n\n/**\n * @param {(!Date|number)=} date\n * @return {string}\n */\nIntl.DateTimeFormat.prototype.format = function(date) {};\n\n/**\n * @param {(!Date|number)=} date\n * @return {Array<{type: string, value: string}>}\n */\nIntl.DateTimeFormat.prototype.formatToParts = function(date) {};\n\n/**\n * @return {{locale: string, calendar: string, numberingSystem: string,\n * timeZone: (string|undefined), weekday: (string|undefined),\n * era: (string|undefined), year: (string|undefined),\n * month: (string|undefined), day: (string|undefined),\n * hour: (string|undefined), minute: (string|undefined),\n * second: (string|undefined), timeZoneName: (string|undefined),\n * hour12: (boolean|undefined)}}\n */\nIntl.DateTimeFormat.prototype.resolvedOptions = function() {};\n\n/**\n * @constructor\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules#Syntax\n * @param {string|Array=} opt_locales\n * @param {{localeMatcher: (string|undefined), type: (string|undefined)}=}\n * opt_options\n */\nIntl.PluralRules = function(opt_locales, opt_options) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/supportedLocalesOf#Syntax\n * @param {Array} locales\n * @param {{localeMatcher: string}=} opt_options\n * @return {Array}\n */\nIntl.PluralRules.supportedLocalesOf = function(locales, opt_options) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/resolvedOptions#Syntax\n * @return {{locale: string, pluralCategories: Array, type: string}}\n */\nIntl.PluralRules.prototype.resolvedOptions = function() {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/select#Syntax\n * @param {number} number\n * @return {string}\n */\nIntl.PluralRules.prototype.select = function(number) {};\n\n/**\n * @constructor\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat#Syntax\n * @param {string|Array=} opt_locales\n * @param {{localeMatcher: (string|undefined),\n * numeric: (string|undefined),\n * style: (string|undefined)}=}\n * opt_options\n */\nIntl.RelativeTimeFormat = function(opt_locales, opt_options) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/supportedLocalesOf#Syntax\n * @param {Array} locales\n * @param {{localeMatcher: string}=} opt_options\n * @return {Array}\n */\nIntl.RelativeTimeFormat.supportedLocalesOf = function(locales, opt_options) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/format#Syntax\n * @param {number} value\n * @param {string} unit\n * @return {string}\n */\nIntl.RelativeTimeFormat.prototype.format = function(value, unit) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/formatToParts#Syntax\n * @param {number} value\n * @param {string} unit\n * @return {Array}\n */\nIntl.RelativeTimeFormat.prototype.formatToParts = function(value, unit) {};\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/resolvedOptions#Syntax\n * @return {{locale: string, pluralCategories: Array, type: string}}\n */\nIntl.RelativeTimeFormat.prototype.resolvedOptions = function() {};\n","externs/fetchapi.js":"/*\n * Copyright 2014 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Definitions of the fetch api.\n *\n * This api is still in development and not yet stable. Use at your\n * own risk.\n *\n * Based on Living Standard — Last Updated 17 August 2016\n *\n * @see https://fetch.spec.whatwg.org/\n * @externs\n */\n\n\n/**\n * @typedef {string}\n * @see https://w3c.github.io/webappsec-referrer-policy/#enumdef-referrerpolicy\n * Possible values: '', 'no-referrer', 'no-referrer-when-downgrade',\n * 'same-origin', 'origin', 'strict-origin', 'origin-when-cross-origin',\n * 'strict-origin-when-cross-origin', 'unsafe-url'\n */\nvar ReferrerPolicy;\n\n\n/**\n * @typedef {!Headers|!Array>|!Object}\n * @see https://fetch.spec.whatwg.org/#typedefdef-headersinit\n */\nvar HeadersInit;\n\n\n/**\n * @param {!HeadersInit=} opt_headersInit\n * @constructor\n * @implements {Iterable>}\n * @see https://fetch.spec.whatwg.org/#headers\n */\nfunction Headers(opt_headersInit) {}\n\n/**\n * @param {string} name\n * @param {string} value\n * @return {undefined}\n */\nHeaders.prototype.append = function(name, value) {};\n\n/**\n * @param {string} name\n * @return {undefined}\n */\nHeaders.prototype.delete = function(name) {};\n\n/** @return {!IteratorIterable>} */\nHeaders.prototype.entries = function() {};\n\n/**\n * @param {string} name\n * @return {?string}\n */\nHeaders.prototype.get = function(name) {};\n\n/**\n * @param {string} name\n * @return {!Array}\n */\nHeaders.prototype.getAll = function(name) {};\n\n/**\n * @param {string} name\n * @return {boolean}\n */\nHeaders.prototype.has = function(name) {};\n\n/** @return {!IteratorIterable} */\nHeaders.prototype.keys = function() {};\n\n/**\n * @param {string} name\n * @param {string} value\n * @return {undefined}\n */\nHeaders.prototype.set = function(name, value) {};\n\n/** @return {!Iterator} */\nHeaders.prototype.values = function() {};\n\n/** @return {!Iterator>} */\nHeaders.prototype[Symbol.iterator] = function() {};\n\n\n/**\n * @typedef {\n * !Blob|!BufferSource|!FormData|!URLSearchParams|!ReadableStream|string}\n * @see https://fetch.spec.whatwg.org/#bodyinit\n */\nvar BodyInit;\n\n\n/**\n * @typedef {!BodyInit|!ReadableStream}\n * @see https://fetch.spec.whatwg.org/#responsebodyinit\n */\nvar ResponseBodyInit;\n\n\n/**\n * @interface\n * @see https://fetch.spec.whatwg.org/#body\n */\nfunction Body() {};\n\n/** @type {boolean} */\nBody.prototype.bodyUsed;\n\n/** @return {!Promise} */\nBody.prototype.arrayBuffer = function() {};\n\n/** @return {!Promise} */\nBody.prototype.blob = function() {};\n\n/** @return {!Promise} */\nBody.prototype.formData = function() {};\n\n/** @return {!Promise<*>} */\nBody.prototype.json = function() {};\n\n/** @return {!Promise} */\nBody.prototype.text = function() {};\n\n\n/**\n * @typedef {!Request|string}\n * @see https://fetch.spec.whatwg.org/#requestinfo\n */\nvar RequestInfo;\n\n\n/**\n * @param {!RequestInfo} input\n * @param {!RequestInit=} opt_init\n * @constructor\n * @implements {Body}\n * @see https://fetch.spec.whatwg.org/#request\n */\nfunction Request(input, opt_init) {}\n\n/** @override */\nRequest.prototype.bodyUsed;\n\n/** @override */\nRequest.prototype.arrayBuffer = function() {};\n\n/** @override */\nRequest.prototype.blob = function() {};\n\n/** @override */\nRequest.prototype.formData = function() {};\n\n/** @override */\nRequest.prototype.json = function() {};\n\n/** @override */\nRequest.prototype.text = function() {};\n\n/** @type {string} */\nRequest.prototype.method;\n\n/** @type {string} */\nRequest.prototype.url;\n\n/** @type {!Headers} */\nRequest.prototype.headers;\n\n/** @type {!FetchRequestType} */\nRequest.prototype.type;\n\n/** @type {!RequestDestination} */\nRequest.prototype.destination;\n\n/** @type {string} */\nRequest.prototype.referrer;\n\n/** @type {!RequestMode} */\nRequest.prototype.mode;\n\n/** @type {!RequestCredentials} */\nRequest.prototype.credentials;\n\n/** @type {!RequestCache} */\nRequest.prototype.cache;\n\n/** @type {!RequestRedirect} */\nRequest.prototype.redirect;\n\n/** @type {string} */\nRequest.prototype.integrity;\n\n/** @type {boolean} */\nRequest.prototype.isHistoryNavigation;\n\n/** @type {(undefined|boolean)} */\nRequest.prototype.keepalive;\n\n/** @return {!Request} */\nRequest.prototype.clone = function() {};\n\n\n/**\n * @record\n * @see https://fetch.spec.whatwg.org/#requestinit\n */\nfunction RequestInit() {};\n\n/** @type {(undefined|string)} */\nRequestInit.prototype.method;\n\n/** @type {(undefined|!HeadersInit)} */\nRequestInit.prototype.headers;\n\n/** @type {(undefined|?BodyInit)} */\nRequestInit.prototype.body;\n\n/** @type {(undefined|string)} */\nRequestInit.prototype.referrer;\n\n/** @type {(undefined|!ReferrerPolicy)} */\nRequestInit.prototype.referrerPolicy;\n\n/** @type {(undefined|!RequestMode)} */\nRequestInit.prototype.mode;\n\n/** @type {(undefined|!RequestCredentials)} */\nRequestInit.prototype.credentials;\n\n/** @type {(undefined|!RequestCache)} */\nRequestInit.prototype.cache;\n\n/** @type {(undefined|!RequestRedirect)} */\nRequestInit.prototype.redirect;\n\n/** @type {(undefined|string)} */\nRequestInit.prototype.integrity;\n\n/** @type {(undefined|!AbortSignal)} */\nRequestInit.prototype.signal;\n\n/** @type {(undefined|boolean)} */\nRequestInit.prototype.keepalive;\n\n/** @type {(undefined|null)} */\nRequestInit.prototype.window;\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#requesttype\n * Possible values: '', 'audio', 'font', 'image', 'script', 'style',\n * 'track', 'video'\n */\nvar FetchRequestType;\n\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#requestdestination\n * Possible values: '', 'document', 'embed', 'font', 'image', 'manifest',\n * 'media', 'object', 'report', 'script', 'serviceworker', 'sharedworker',\n * 'style', 'worker', 'xslt'\n */\nvar RequestDestination;\n\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#requestmode\n * Possible values: 'navigate', 'same-origin', 'no-cors', 'cors'\n */\nvar RequestMode ;\n\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#requestcredentials\n * Possible values: 'omit', 'same-origin', 'include'\n */\nvar RequestCredentials;\n\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#requestcache\n * Possible values: 'default', 'no-store', 'reload', 'no-cache', 'force-cache',\n * 'only-if-cached'\n */\nvar RequestCache;\n\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#requestredirect\n * Possible values: 'follow', 'error', 'manual'\n */\nvar RequestRedirect;\n\n\n/**\n * @param {?ResponseBodyInit=} opt_body\n * @param {!ResponseInit=} opt_init\n * @constructor\n * @implements {Body}\n * @see https://fetch.spec.whatwg.org/#response\n */\nfunction Response(opt_body, opt_init) {}\n\n/** @return {!Response} */\nResponse.error = function() {};\n\n/**\n * @param {string} url\n * @param {number=} opt_status\n * @return {!Response}\n */\nResponse.redirect = function(url, opt_status) {};\n\n/** @override */\nResponse.prototype.bodyUsed;\n\n/** @override */\nResponse.prototype.arrayBuffer = function() {};\n\n/** @override */\nResponse.prototype.blob = function() {};\n\n/** @override */\nResponse.prototype.formData = function() {};\n\n/** @override */\nResponse.prototype.json = function() {};\n\n/** @override */\nResponse.prototype.text = function() {};\n\n/** @type {!ResponseType} */\nResponse.prototype.type;\n\n/** @type {string} */\nResponse.prototype.url;\n\n/** @type {boolean} */\nResponse.prototype.redirected;\n\n/** @type {number} */\nResponse.prototype.status;\n\n/** @type {boolean} */\nResponse.prototype.ok;\n\n/** @type {string} */\nResponse.prototype.statusText;\n\n/** @type {!Headers} */\nResponse.prototype.headers;\n\n/** @type {?ReadableStream} */\nResponse.prototype.body;\n\n/** @type {!Promise} */\nResponse.prototype.trailer;\n\n/** @return {!Response} */\nResponse.prototype.clone = function() {};\n\n\n/**\n * @record\n * @see https://fetch.spec.whatwg.org/#responseinit\n */\nfunction ResponseInit() {};\n\n/** @type {(undefined|number)} */\nResponseInit.prototype.status;\n\n/** @type {(undefined|string)} */\nResponseInit.prototype.statusText;\n\n/** @type {(undefined|!HeadersInit)} */\nResponseInit.prototype.headers;\n\n\n/**\n * @typedef {string}\n * @see https://fetch.spec.whatwg.org/#responsetype\n * Possible values: 'basic', 'cors', 'default', 'error', 'opaque',\n * 'opaqueredirect'\n */\nvar ResponseType;\n\n/**\n * @param {!RequestInfo} input\n * @param {!RequestInit=} opt_init\n * @return {!Promise}\n * @see https://fetch.spec.whatwg.org/#fetch-method\n */\nfunction fetch(input, opt_init) {}\n\n/**\n * @param {!RequestInfo} input\n * @param {!RequestInit=} opt_init\n * @return {!Promise}\n * @see https://fetch.spec.whatwg.org/#fetch-method\n */\nWindow.prototype.fetch = function(input, opt_init) {};\n\n/**\n * @param {!RequestInfo} input\n * @param {!RequestInit=} opt_init\n * @return {!Promise}\n * @see https://fetch.spec.whatwg.org/#fetch-method\n */\nWorkerGlobalScope.prototype.fetch = function(input, opt_init) {};\n\n/**\n * if WorkerOptions.type = 'module', it specifies how `scriptURL` is fetched.\n * WorkerOptions is defined in html5.js.\n * @type {!RequestCredentials|undefined}\n */\nWorkerOptions.prototype.credentials;\n","externs/streamsapi.js":"/*\n * Copyright 2015 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Streams API definitions\n *\n * Based on Living Standard — Last Updated 5 August 2016\n * https://streams.spec.whatwg.org/commit-snapshots/34ecaadbcce8df9943d7a2cdb7fca4dc25914df4/\n *\n * @see https://streams.spec.whatwg.org/\n * @externs\n */\n\n\n/**\n * @typedef {!CountQueuingStrategy|!ByteLengthQueuingStrategy|{\n * size: (undefined|function(*): number),\n * highWaterMark: (number|undefined),\n * }}\n */\nvar QueuingStrategy;\n\n/**\n * The TransformStreamDefaultController class has methods that allow\n * manipulation of the associated ReadableStream and WritableStream.\n *\n * This class cannot be directly constructed and is instead passed by the\n * TransformStream to the methods of its transformer.\n *\n * @interface\n * @template OUT_VALUE\n * @see https://streams.spec.whatwg.org/#ts-default-controller-class\n */\nfunction TransformStreamDefaultController() {};\n\n/**\n * @type {number}\n * @see https://streams.spec.whatwg.org/#ts-default-controller-desired-size\n */\nTransformStreamDefaultController.prototype.desiredSize;\n\n/**\n * @param {OUT_VALUE} chunk\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#ts-default-controller-enqueue\n */\nTransformStreamDefaultController.prototype.enqueue = function(chunk) {};\n\n/**\n * @param {*} reason\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#ts-default-controller-error\n */\nTransformStreamDefaultController.prototype.error = function(reason) {};\n\n/**\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#ts-default-controller-terminate\n */\nTransformStreamDefaultController.prototype.terminate = function() {};\n\n\n/**\n * @record\n * @template IN_VALUE, OUT_VALUE\n * @see https://streams.spec.whatwg.org/#transformer-api\n */\nfunction TransformStreamTransformer() {};\n\n/**\n * @type {(undefined|function(\n * !TransformStreamDefaultController\n * ):(!IThenable<*>|undefined)\n * )}\n */\nTransformStreamTransformer.prototype.start;\n\n/**\n * @type {(undefined|function(\n * IN_VALUE, !TransformStreamDefaultController\n * ):(!IThenable<*>|undefined)\n * )}\n */\nTransformStreamTransformer.prototype.transform;\n\n/**\n * @type {(undefined|function(\n * !TransformStreamDefaultController\n * ):(!IThenable<*>|undefined)\n * )}\n */\nTransformStreamTransformer.prototype.flush;\n\n\n/**\n * A transform stream (https://streams.spec.whatwg.org/#transform-stream).\n * @record\n * @template IN_VALUE, OUT_VALUE\n */\nfunction ITransformStream() {}\n\n/** @type {!WritableStream} */\nITransformStream.prototype.writable;\n\n/** @type {!ReadableStream} */\nITransformStream.prototype.readable;\n\n\n/**\n * @constructor\n * @implements {ITransformStream}\n * @template IN_VALUE, OUT_VALUE\n * @param {!TransformStreamTransformer=} transformer\n * @param {!QueuingStrategy=} writableStrategy\n * @param {!QueuingStrategy=} readableStrategy\n * @see https://streams.spec.whatwg.org/#ts-class\n */\nfunction TransformStream(transformer, writableStrategy, readableStrategy) {};\n\n/** @type {!WritableStream} */\nTransformStream.prototype.writable;\n\n/** @type {!ReadableStream} */\nTransformStream.prototype.readable;\n\n/**\n * @record\n */\nfunction PipeOptions() {};\n\n/** @type {undefined|boolean} */\nPipeOptions.prototype.preventClose;\n\n/** @type {undefined|boolean} */\nPipeOptions.prototype.preventAbort;\n\n/** @type {undefined|boolean} */\nPipeOptions.prototype.preventCancel;\n\n\n/**\n * @record\n * @template VALUE\n */\nfunction ReadableStreamSource() {};\n\n/**\n * @type {(undefined|function(\n * (!ReadableByteStreamController|!ReadableStreamDefaultController)\n * ):(!IThenable<*>|undefined)\n * )}\n */\nReadableStreamSource.prototype.start;\n\n/**\n * @type {(undefined|function(\n * (!ReadableByteStreamController|!ReadableStreamDefaultController)\n * ):(!IThenable<*>|undefined)\n * )}\n */\nReadableStreamSource.prototype.pull;\n\n/** @type {(undefined|function(*):(!Promise<*>|undefined))} */\nReadableStreamSource.prototype.cancel;\n\n/** @type {(undefined|string)} */\nReadableStreamSource.prototype.type;\n\n/** @type {(undefined|number)} */\nReadableStreamSource.prototype.autoAllocateChunkSize;\n\n/**\n * @record\n */\nfunction ReadableStreamIteratorOptions() {};\n\n/** @type {undefined|boolean} */\nReadableStreamIteratorOptions.prototype.preventCancel;\n\n/**\n * @constructor\n * @template VALUE\n * @param {!ReadableStreamSource=} opt_underlyingSource\n * @param {!QueuingStrategy=} opt_queuingStrategy\n * @see https://streams.spec.whatwg.org/#rs-class\n */\nfunction ReadableStream(opt_underlyingSource, opt_queuingStrategy) {};\n\n/**\n * @type {boolean}\n * @see https://streams.spec.whatwg.org/#rs-locked\n */\nReadableStream.prototype.locked;\n\n/**\n * @param {*} reason\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#rs-cancel\n */\nReadableStream.prototype.cancel = function(reason) {};\n\n/**\n * @param {!ReadableStreamIteratorOptions=} options\n * @return {!AsyncIterator}\n * @see https://streams.spec.whatwg.org/#rs-get-iterator\n */\nReadableStream.prototype.getIterator = function(options) {};\n\n/**\n * @param {{ mode:(undefined|string) }=} opt_options\n * @return {(!ReadableStreamDefaultReader|!ReadableStreamBYOBReader)}\n * @see https://streams.spec.whatwg.org/#rs-get-reader\n */\nReadableStream.prototype.getReader = function(opt_options) {};\n\n/**\n * @template PIPE_VALUE\n * @param {!ITransformStream} transform\n * @param {!PipeOptions=} opt_options\n * @return {!ReadableStream}\n * @see https://streams.spec.whatwg.org/#rs-pipe-through\n */\nReadableStream.prototype.pipeThrough = function(transform, opt_options) {};\n\n/**\n * @param {!WritableStream} dest\n * @param {!PipeOptions=} opt_options\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#rs-pipe-to\n */\nReadableStream.prototype.pipeTo = function(dest, opt_options) {};\n\n/**\n * @return {!Array>}\n * @see https://streams.spec.whatwg.org/#rs-tee\n */\nReadableStream.prototype.tee = function() {};\n\n/**\n * @param {!ReadableStreamIteratorOptions=} options\n * @return {!AsyncIterator}\n * @see https://streams.spec.whatwg.org/#rs-asynciterator\n */\nReadableStream.prototype[Symbol.asyncIterator] = function(options) {};\n\n/**\n * The ReadableStreamDefaultReader constructor is generally not meant to be used\n * directly; instead, a stream’s getReader() method should be used.\n *\n * @interface\n * @template VALUE\n * @see https://streams.spec.whatwg.org/#default-reader-class\n */\nfunction ReadableStreamDefaultReader() {};\n\n/**\n * @type {!Promise}\n * @see https://streams.spec.whatwg.org/#default-reader-closed\n */\nReadableStreamDefaultReader.prototype.closed;\n\n/**\n * @param {*} reason\n * @return {!Promise<*>}\n * @see https://streams.spec.whatwg.org/#default-reader-cancel\n */\nReadableStreamDefaultReader.prototype.cancel = function(reason) {};\n\n/**\n * @return {!Promise>}\n * @see https://streams.spec.whatwg.org/#default-reader-read\n */\nReadableStreamDefaultReader.prototype.read = function() {};\n\n/**\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#default-reader-release-lock\n */\nReadableStreamDefaultReader.prototype.releaseLock = function() {};\n\n\n/**\n * The ReadableStreamBYOBReader constructor is generally not meant to be used\n * directly; instead, a stream’s getReader() method should be used.\n *\n * @interface\n * @see https://streams.spec.whatwg.org/#byob-reader-class\n */\nfunction ReadableStreamBYOBReader() {};\n\n/**\n * @type {!Promise}\n * @see https://streams.spec.whatwg.org/#byob-reader-closed\n */\nReadableStreamBYOBReader.prototype.closed;\n\n/**\n * @param {*} reason\n * @return {!Promise<*>}\n * @see https://streams.spec.whatwg.org/#byob-reader-cancel\n */\nReadableStreamBYOBReader.prototype.cancel = function(reason) {};\n\n/**\n * @template BUFFER\n * @param {BUFFER} view\n * @return {!Promise>}\n * @see https://streams.spec.whatwg.org/#byob-reader-read\n */\nReadableStreamBYOBReader.prototype.read = function(view) {};\n\n/**\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#byob-reader-release-lock\n */\nReadableStreamBYOBReader.prototype.releaseLock = function() {};\n\n\n/**\n * The ReadableStreamDefaultController constructor cannot be used directly;\n * it only works on a ReadableStream that is in the middle of being constructed.\n *\n * @interface\n * @template VALUE\n * @see https://streams.spec.whatwg.org/#rs-default-controller-class\n */\nfunction ReadableStreamDefaultController() {};\n\n/**\n * @type {number}\n * @see https://streams.spec.whatwg.org/#rs-default-controller-desired-size\n */\nReadableStreamDefaultController.prototype.desiredSize;\n\n/**\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rs-default-controller-close\n */\nReadableStreamDefaultController.prototype.close = function() {};\n\n/**\n * @param {VALUE} chunk\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rs-default-controller-enqueue\n */\nReadableStreamDefaultController.prototype.enqueue = function(chunk) {};\n\n/**\n * @param {*} err\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rs-default-controller-error\n */\nReadableStreamDefaultController.prototype.error = function(err) {};\n\n\n/**\n * The ReadableByteStreamController constructor cannot be used directly;\n * it only works on a ReadableStream that is in the middle of being constructed.\n *\n * @interface\n * @see https://streams.spec.whatwg.org/#rbs-controller-class\n */\nfunction ReadableByteStreamController() {};\n\n/**\n * @type {!ReadableStreamBYOBRequest}\n * @see https://streams.spec.whatwg.org/#rbs-controller-byob-request\n */\nReadableByteStreamController.prototype.byobRequest;\n\n/**\n * @type {number}\n * @see https://streams.spec.whatwg.org/#rbs-controller-desired-size\n */\nReadableByteStreamController.prototype.desiredSize;\n\n/**\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rbs-controller-close\n */\nReadableByteStreamController.prototype.close = function() {};\n\n/**\n * @param {!ArrayBufferView} chunk\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rbs-controller-enqueue\n */\nReadableByteStreamController.prototype.enqueue = function(chunk) {};\n\n/**\n * @param {*} err\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rbs-controller-error\n */\nReadableByteStreamController.prototype.error = function(err) {};\n\n\n/**\n * @interface\n * @see https://streams.spec.whatwg.org/#rs-byob-request-class\n */\nfunction ReadableStreamBYOBRequest() {};\n\n/**\n * @type {!ArrayBufferView}\n * @see https://streams.spec.whatwg.org/#rs-byob-request-view\n */\nReadableStreamBYOBRequest.prototype.view;\n\n/**\n * @param {number} bytesWritten\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rs-byob-request-respond\n */\nReadableStreamBYOBRequest.prototype.respond = function(bytesWritten) {};\n\n/**\n * @param {!ArrayBufferView} view\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#rs-byob-request-respond-with-new-view\n */\nReadableStreamBYOBRequest.prototype.respondWithNewView = function(view) {};\n\n\n/**\n * @record\n * @template VALUE\n */\nfunction WritableStreamSink() {};\n\n/** @type {(undefined|function(!WritableStreamDefaultController):(!IThenable<*>|undefined))}*/\nWritableStreamSink.prototype.start;\n\n/**\n * @type {(undefined|function(VALUE,\n * !WritableStreamDefaultController):(!IThenable<*>|undefined))}\n */\nWritableStreamSink.prototype.write;\n\n/** @type {(undefined|function():(!IThenable<*>|undefined))} */\nWritableStreamSink.prototype.close;\n\n/** @type {(undefined|function(*):(!IThenable<*>|undefined))} */\nWritableStreamSink.prototype.abort;\n\n\n/**\n * @constructor\n * @template VALUE\n * @param {!WritableStreamSink=} opt_underlyingSink\n * @param {!QueuingStrategy=} opt_queuingStrategy\n * @see https://streams.spec.whatwg.org/#ws-class\n */\nfunction WritableStream(opt_underlyingSink, opt_queuingStrategy) {};\n\n/**\n * @type {boolean}\n * @see https://streams.spec.whatwg.org/#ws-locked\n */\nWritableStream.prototype.locked;\n\n/**\n * @param {*} reason\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#ws-abort\n */\nWritableStream.prototype.abort = function(reason) {};\n\n/**\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#ws-close\n */\nWritableStream.prototype.close = function() {};\n\n/**\n * @return {!WritableStreamDefaultWriter}\n * @see https://streams.spec.whatwg.org/#ws-get-writer\n */\nWritableStream.prototype.getWriter = function() {};\n\n\n/**\n * @interface\n * @template VALUE\n * @see https://streams.spec.whatwg.org/#default-writer-class\n */\nfunction WritableStreamDefaultWriter() {};\n\n/**\n * @type {!Promise}\n * @see https://streams.spec.whatwg.org/#default-writer-closed\n */\nWritableStreamDefaultWriter.prototype.closed;\n\n/**\n * @type {number}\n * @see https://streams.spec.whatwg.org/#default-writer-desiredSize\n */\nWritableStreamDefaultWriter.prototype.desiredSize;\n\n/**\n * @type {!Promise}\n * @see https://streams.spec.whatwg.org/#default-writer-ready\n */\nWritableStreamDefaultWriter.prototype.ready;\n\n/**\n * @param {*} reason\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#default-writer-abort\n */\nWritableStreamDefaultWriter.prototype.abort = function(reason) {};\n\n/**\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#default-writer-close\n */\nWritableStreamDefaultWriter.prototype.close = function() {};\n\n/**\n * @return {undefined}\n * @see https://streams.spec.whatwg.org/#default-writer-release-lock\n */\nWritableStreamDefaultWriter.prototype.releaseLock = function() {};\n\n/**\n * @param {VALUE} chunk\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#default-writer-write\n */\nWritableStreamDefaultWriter.prototype.write = function(chunk) {};\n\n\n/**\n * The WritableStreamDefaultController constructor cannot be used directly;\n * it only works on a WritableStream that is in the middle of being constructed.\n *\n * @interface\n * @see https://streams.spec.whatwg.org/#ws-default-controller-class\n */\nfunction WritableStreamDefaultController() {};\n\n/**\n * @param {*} err\n * @return {!Promise}\n * @see https://streams.spec.whatwg.org/#ws-default-controller-error\n */\nWritableStreamDefaultController.prototype.error = function(err) {};\n\n\n/**\n * @param {{ highWaterMark:number }} config\n * @constructor\n * @see https://streams.spec.whatwg.org/#blqs-class\n */\nfunction ByteLengthQueuingStrategy(config) {}\n\n/**\n * If we don't want to be strict we can define chunk as {*}\n * and return as {number|undefined}\n *\n * @param {{ byteLength:number }} chunk\n * @return {number}\n * @see https://streams.spec.whatwg.org/#blqs-size\n */\nByteLengthQueuingStrategy.prototype.size = function(chunk) {};\n\n\n/**\n * @param {{ highWaterMark:number }} config\n * @constructor\n * @see https://streams.spec.whatwg.org/#cqs-class\n */\nfunction CountQueuingStrategy(config) {}\n\n/**\n * @param {*} chunk\n * @return {number}\n * @see https://streams.spec.whatwg.org/#cqs-size\n */\nCountQueuingStrategy.prototype.size = function(chunk) {};\n","externs/web_animations.js":"/*\n * Copyright 2016 The Closure Compiler authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview Basic externs for the Web Animations API. This is not\n * nessecarily exhaustive. For more information, see the spec-\n * https://w3c.github.io/web-animations\n * @externs\n */\n\n\n/**\n * @param {!Object} frames\n * @param {(number|KeyframeAnimationOptions)=} options\n * @return {!Animation}\n * @see https://www.w3.org/TR/web-animations/#the-animatable-interface-mixin\n */\nElement.prototype.animate = function(frames, options) {};\n\n/**\n * @return {!Array}\n */\nElement.prototype.getAnimations = function() {};\n\n\n/**\n * @constructor\n * @param {AnimationEffectReadOnly=} effect\n * @param {AnimationTimeline=} timeline\n * @implements {EventTarget}\n */\nvar Animation = function(effect, timeline) {};\n\n/** @override */\nAnimation.prototype.addEventListener = function(type, listener, options) {};\n\n/** @override */\nAnimation.prototype.removeEventListener = function(type, listener, options) {};\n\n/** @override */\nAnimation.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @return {undefined}\n */\nAnimation.prototype.cancel = function() {};\n\n/**\n * @return {undefined}\n */\nAnimation.prototype.finish = function() {};\n\n/**\n * @return {undefined}\n */\nAnimation.prototype.pause = function() {};\n\n/**\n * @return {undefined}\n */\nAnimation.prototype.play = function() {};\n\n/**\n * @return {undefined}\n */\nAnimation.prototype.reverse = function() {};\n\n/** @type {number} */\nAnimation.prototype.currentTime;\n\n/** @type {AnimationEffectReadOnly} */\nAnimation.prototype.effect;\n\n/** @type {!Promise} */\nAnimation.prototype.finished;\n\n/** @type {string} */\nAnimation.prototype.id;\n\n/** @type {?function(!Event)} */\nAnimation.prototype.oncancel;\n\n/** @type {?function(!Event)} */\nAnimation.prototype.onfinish;\n\n/** @type {number} */\nAnimation.prototype.playbackRate;\n\n/** @type {string} */\nAnimation.prototype.playState;\n\n/** @type {!Promise} */\nAnimation.prototype.ready;\n\n/** @type {number} */\nAnimation.prototype.startTime;\n\n/** @type {!AnimationTimeline} */\nAnimation.prototype.timeline;\n\n\n/**\n * @interface\n */\nvar AnimationEffectReadOnly = function() {};\n\n/**\n * @return {!ComputedTimingProperties}\n */\nAnimationEffectReadOnly.prototype.getComputedTiming = function() {};\n\n/** @type {!AnimationEffectTiming} */\nAnimationEffectReadOnly.prototype.timing;\n\n\n/**\n * @constructor\n * @param {Element} target\n * @param {(!Array>|!Object>)} frames\n * @param {(number|AnimationEffectTimingProperties)=} options\n * @implements {AnimationEffectReadOnly}\n */\nvar KeyframeEffectReadOnly = function(target, frames, options) {};\n\n/** @override */\nKeyframeEffectReadOnly.prototype.getComputedTiming = function() {};\n\n/** @override */\nKeyframeEffectReadOnly.prototype.timing;\n\n\n/**\n * @constructor\n * @param {Element} target\n * @param {(!Array>|!Object>)} frames\n * @param {(number|AnimationEffectTimingProperties)=} options\n * @extends {KeyframeEffectReadOnly}\n */\nvar KeyframeEffect = function(target, frames, options) {};\n\n\n/**\n * @record\n */\nvar AnimationEffectTimingProperties = function() {};\n\n/** @type {number|undefined} */\nAnimationEffectTimingProperties.prototype.delay;\n\n/** @type {number|undefined} */\nAnimationEffectTimingProperties.prototype.endDelay;\n\n/** @type {string|undefined} */\nAnimationEffectTimingProperties.prototype.fill;\n\n/** @type {number|undefined} */\nAnimationEffectTimingProperties.prototype.iterationStart;\n\n/** @type {number|undefined} */\nAnimationEffectTimingProperties.prototype.iterations;\n\n/** @type {number|string|undefined} */\nAnimationEffectTimingProperties.prototype.duration;\n\n/** @type {string|undefined} */\nAnimationEffectTimingProperties.prototype.direction;\n\n/** @type {string|undefined} */\nAnimationEffectTimingProperties.prototype.easing;\n\n/**\n * @record\n * @extends {AnimationEffectTimingProperties}\n */\nvar KeyframeEffectOptions = function() {};\n\n/**\n * Possible values: 'replace', 'accumulate'\n * @type {string|undefined}\n */\nKeyframeEffectOptions.prototype.iterationComposite;\n\n/**\n * Possible values: 'replace', 'add', 'accumulate'\n * @type {string|undefined}\n */\nKeyframeEffectOptions.prototype.composite;\n\n/**\n * @record\n * @extends {KeyframeEffectOptions}\n */\nvar KeyframeAnimationOptions = function() {};\n\n/** @type {string|undefined} */\nKeyframeAnimationOptions.prototype.id;\n\n\n/**\n * @record\n * @extends {AnimationEffectTimingProperties}\n */\nvar ComputedTimingProperties = function() {};\n\n/** @type {number} */\nComputedTimingProperties.prototype.endTime;\n\n/** @type {number} */\nComputedTimingProperties.prototype.activeDuration;\n\n/** @type {?number} */\nComputedTimingProperties.prototype.localTime;\n\n/** @type {?number} */\nComputedTimingProperties.prototype.progress;\n\n/** @type {?number} */\nComputedTimingProperties.prototype.currentIteration;\n\n\n/**\n * @interface\n */\nvar AnimationEffectTimingReadOnly = function() {};\n\n/** @type {number} */\nAnimationEffectTimingReadOnly.prototype.delay;\n\n/** @type {number} */\nAnimationEffectTimingReadOnly.prototype.endDelay;\n\n/** @type {string} */\nAnimationEffectTimingReadOnly.prototype.fill;\n\n/** @type {number} */\nAnimationEffectTimingReadOnly.prototype.iterationStart;\n\n/** @type {number} */\nAnimationEffectTimingReadOnly.prototype.iterations;\n\n/** @type {number|string} */\nAnimationEffectTimingReadOnly.prototype.duration;\n\n/** @type {string} */\nAnimationEffectTimingReadOnly.prototype.direction;\n\n/** @type {string} */\nAnimationEffectTimingReadOnly.prototype.easing;\n\n\n/**\n * @interface\n * @extends {AnimationEffectTimingReadOnly}\n */\nvar AnimationEffectTiming = function() {};\n\n\n/**\n * @interface\n */\nvar AnimationTimeline = function() {};\n\n/** @type {?number} */\nAnimationTimeline.prototype.currentTime;\n\n\n/**\n * @constructor\n * @implements {AnimationTimeline}\n */\nvar DocumentTimeline = function() {};\n\n/** @override */\nDocumentTimeline.prototype.currentTime;\n\n\n/** @type {!DocumentTimeline} */\nDocument.prototype.timeline;\n\n/**\n * Externs for the Web Animations API (Level 2 / Groups).\n *\n * This defines externs for the \"-next\" version of the Web Animations API\n * polyfill found online at:\n * https://github.com/web-animations/web-animations.js\n *\n * These features are NOT natively implemented in browsers and are not clearly\n * part of the official spec. This is NOT intended to be exhaustive, and\n * requires the base externs from web-animations.js.\n *\n */\n\n\n/** @type {Element} */\nKeyframeEffectReadOnly.prototype.target;\n\n/** @type {?function(number, !KeyframeEffect, !Animation)|undefined} */\nKeyframeEffectReadOnly.prototype.onsample;\n\n\n/**\n * @param {!AnimationEffectReadOnly} effect\n * @return {!Animation}\n */\nDocumentTimeline.prototype.play = function(effect) {};\n\n/**\n * @return {!Array}\n */\nDocumentTimeline.prototype.getAnimations = function() {};\n\n\n/**\n * @param {!Array} children\n * @param {AnimationEffectTimingProperties=} timing\n * @constructor\n * @implements {AnimationEffectReadOnly}\n */\nvar SequenceEffect = function(children, timing) {};\n\n/** @override */\nSequenceEffect.prototype.getComputedTiming = function() {};\n\n/** @override */\nSequenceEffect.prototype.timing;\n\n/** @type {!Array} */\nSequenceEffect.prototype.children;\n\n\n/**\n * @param {!Array} children\n * @param {AnimationEffectTimingProperties=} timing\n * @constructor\n * @implements {AnimationEffectReadOnly}\n */\nvar GroupEffect = function(children, timing) {};\n\n/** @override */\nGroupEffect.prototype.getComputedTiming = function() {};\n\n/** @override */\nGroupEffect.prototype.timing;\n\n/** @type {!Array} */\nGroupEffect.prototype.children;\n","externs/whatwg_console.js":"/*\n * Copyright 2019 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for console debugging facilities.\n * https://console.spec.whatwg.org/\n * @externs\n */\n\n/**\n * @constructor\n * @see https://console.spec.whatwg.org/\n */\nfunction Console() {};\n\n/**\n * If condition is false, perform Logger(\"error\", data).\n * @param {*} condition\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.assert = function(condition, var_data) {};\n\n/**\n * @return {undefined}\n */\nConsole.prototype.clear = function() {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.debug = function(var_data) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.error = function(var_data) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.info = function(var_data) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.log = function(var_data) {};\n\n/**\n * @param {!Object} tabularData\n * @param {*=} properties\n * @return {undefined}\n */\nConsole.prototype.table = function(tabularData, properties) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.trace = function(var_data) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.warn = function(var_data) {};\n\n/**\n * @param {*} item\n * @return {undefined}\n */\nConsole.prototype.dir = function(item) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.dirxml = function(var_data) {};\n\n/**\n * @param {string=} label\n * @return {undefined}\n */\nConsole.prototype.count = function(label) {};\n\n/**\n * @param {string=} label\n * @return {undefined}\n */\nConsole.prototype.countReset = function(label) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.group = function(var_data) {};\n\n/**\n * @param {...*} var_data\n * @return {undefined}\n */\nConsole.prototype.groupCollapsed = function(var_data) {};\n\n/**\n * @return {undefined}\n */\nConsole.prototype.groupEnd = function() {};\n\n/**\n * @param {string} label\n * @return {undefined}\n */\nConsole.prototype.time = function(label) {};\n\n/**\n * @param {string} label\n * @param {...*} data\n * @return {undefined}\n */\nConsole.prototype.timeLog = function(label, data) {};\n\n/**\n * @param {string} label\n * @return {undefined}\n */\nConsole.prototype.timeEnd = function(label) {};\n\n/** @type {!Console} */\nWindow.prototype.console;\n\n/**\n * @type {!Console}\n * @suppress {duplicate}\n */\nvar console;\n","externs/nonstandard_console.js":"/*\n * Copyright 2019 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for console debugging facilities implemented in\n * various browsers but not part of https://console.spec.whatwg.org/.\n * @externs\n */\n\n/**\n * @constructor\n * @see https://cs.chromium.org/search/?q=%22interface+MemoryInfo%22+file:idl+file:WebKit+package:chromium&type=cs\n */\nfunction MemoryInfo() {};\n\n/** @type {number} */\nMemoryInfo.prototype.totalJSHeapSize;\n\n/** @type {number} */\nMemoryInfo.prototype.usedJSHeapSize;\n\n/** @type {number} */\nMemoryInfo.prototype.jsHeapSizeLimit;\n\n/**\n * @param {*} value\n * @return {undefined}\n */\nConsole.prototype.markTimeline = function(value) {};\n\n/**\n * @param {string=} title\n * @return {undefined}\n */\nConsole.prototype.profile = function(title) {};\n\n/** @type {Array} */\nConsole.prototype.profiles;\n\n/**\n * @param {string=} title\n * @return {undefined}\n */\nConsole.prototype.profileEnd = function(title) {};\n\n/**\n * @param {*} value\n * @return {undefined}\n */\nConsole.prototype.timeStamp = function(value) {};\n\n/** @type {MemoryInfo} */\nConsole.prototype.memory;\n","externs/w3c_worklets.js":"/*\n * Copyright 2020 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for the Worklets API.\n * This file is based on the W3C Editor's Draft 07 April 2020.\n * @see https://drafts.css-houdini.org/worklets/\n *\n * @externs\n */\n\n/**\n * @interface\n * @see https://drafts.css-houdini.org/worklets/#the-global-scope\n */\nfunction WorkletGlobalScope() {}\n\n/**\n * @record\n * @see https://drafts.css-houdini.org/worklets/#dictdef-workletoptions\n */\nfunction WorkletOptions() {};\n\n/**\n * @type {!RequestCredentials}\n * See https://fetch.spec.whatwg.org/#requestcredentials for valid values.\n */\nWorkletOptions.prototype.credentials;\n\n/**\n * @interface\n * @see https://drafts.css-houdini.org/worklets/#worklet-section\n */\nfunction Worklet() {}\n\n/**\n * @param {string} moduleURL\n * @param {!WorkletOptions=} options\n * @return {!Promise}\n */\nWorklet.prototype.addModule = function(moduleURL, options) {};\n","externs/w3c_audio.js":"/*\n * Copyright 2012 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Definitions for the API related to audio.\n * Definitions for the Web Audio API.\n * This file is based on the W3C Working Draft 08 December 2015.\n * @see http://www.w3.org/TR/webaudio/\n *\n * @externs\n */\n\n/**\n * @implements {EventTarget}\n * @constructor\n */\nfunction BaseAudioContext() {}\n\n/** @type {!AudioDestinationNode} */\nBaseAudioContext.prototype.destination;\n\n/** @type {number} */\nBaseAudioContext.prototype.sampleRate;\n\n/** @type {number} */\nBaseAudioContext.prototype.currentTime;\n\n/** @type {!AudioListener} */\nBaseAudioContext.prototype.listener;\n\n/** @type {!AudioWorklet} */\nBaseAudioContext.prototype.audioWorklet;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#BaseAudioContext for valid values\n */\nBaseAudioContext.prototype.state;\n\n/**\n * @param {number} numberOfChannels\n * @param {number} length\n * @param {number} sampleRate\n * @return {!AudioBuffer}\n */\nBaseAudioContext.prototype.createBuffer =\n function(numberOfChannels, length, sampleRate) {};\n\n/**\n * @param {!ArrayBuffer} audioData\n * @param {function(!AudioBuffer)=} successCallback\n * @param {function(?)=} errorCallback\n * @return {!Promise}\n */\nBaseAudioContext.prototype.decodeAudioData =\n function(audioData, successCallback, errorCallback) {};\n\n/**\n * @return {!AudioBufferSourceNode}\n */\nBaseAudioContext.prototype.createBufferSource = function() {};\n\n/**\n * @deprecated Use createAudioWorker instead\n * @param {number=} bufferSize\n * @param {number=} numberOfInputChannels_opt\n * @param {number=} numberOfOutputChannels_opt\n * @return {!ScriptProcessorNode}\n */\nBaseAudioContext.prototype.createScriptProcessor = function(bufferSize,\n numberOfInputChannels_opt, numberOfOutputChannels_opt) {};\n\n/**\n * @return {!AnalyserNode}\n */\nBaseAudioContext.prototype.createAnalyser = function() {};\n\n/**\n * @return {!GainNode}\n */\nBaseAudioContext.prototype.createGain = function() {};\n\n/**\n * @param {number=} maxDelayTime\n * @return {!DelayNode}\n */\nBaseAudioContext.prototype.createDelay = function(maxDelayTime) {};\n\n/**\n * @return {!BiquadFilterNode}\n */\nBaseAudioContext.prototype.createBiquadFilter = function() {};\n\n/**\n * @return {!WaveShaperNode}\n */\nBaseAudioContext.prototype.createWaveShaper = function() {};\n\n/**\n * @return {!PannerNode}\n */\nBaseAudioContext.prototype.createPanner = function() {};\n\n/**\n * @return {!StereoPannerNode}\n */\nBaseAudioContext.prototype.createStereoPanner = function() {};\n\n/**\n * @return {!ConvolverNode}\n */\nBaseAudioContext.prototype.createConvolver = function() {};\n\n/**\n * @param {number=} numberOfOutputs\n * @return {!ChannelSplitterNode}\n */\nBaseAudioContext.prototype.createChannelSplitter = function(numberOfOutputs) {};\n\n/**\n * @param {number=} numberOfInputs\n * @return {!ChannelMergerNode}\n */\nBaseAudioContext.prototype.createChannelMerger = function(numberOfInputs) {};\n\n/**\n * @return {!ConstantSourceNode}\n */\nBaseAudioContext.prototype.createConstantSource = function() {};\n\n/**\n * @return {!DynamicsCompressorNode}\n */\nBaseAudioContext.prototype.createDynamicsCompressor = function() {};\n\n/**\n * @return {!OscillatorNode}\n */\nBaseAudioContext.prototype.createOscillator = function() {};\n\n/**\n * @param {!Float32Array} real\n * @param {!Float32Array} imag\n * @return {!PeriodicWave}\n */\nBaseAudioContext.prototype.createPeriodicWave = function(real, imag) {};\n\n/**\n * @return {!Promise}\n */\nBaseAudioContext.prototype.resume = function() {};\n\n/**\n * @return {!Promise}\n */\nBaseAudioContext.prototype.suspend = function() {};\n\n/**\n * @return {!Promise}\n */\nBaseAudioContext.prototype.close = function() {};\n\n/** @type {?function(!Event)} */\nBaseAudioContext.prototype.onstatechange;\n\n/**\n * @param {string} scriptURL\n * @return {!Promise}\n */\nBaseAudioContext.prototype.createAudioWorker = function(scriptURL) {};\n\n/**\n * @param {!IArrayLike} feedforward\n * @param {!IArrayLike} feedback\n * @return {!IIRFilterNode}\n */\nBaseAudioContext.prototype.createIIRFilter = function(feedforward, feedback) {};\n\n/**\n * @return {!SpatialPannerNode}\n */\nBaseAudioContext.prototype.createSpatialPanner = function() {};\n\n/**\n * @record\n * @see https://webaudio.github.io/web-audio-api/#idl-def-AudioContextOptions\n */\nfunction AudioContextOptions() {};\n\n/** @type {(undefined|string|number)} */\nAudioContextOptions.prototype.latencyHint;\n\n/** @type {(undefined|number)} */\nAudioContextOptions.prototype.sampleRate;\n\n/**\n * Includes the non-standard contextOptions optional options parameter\n * implemented by Chrome and Firefox.\n * @param {!AudioContextOptions=} contextOptions\n * @constructor\n * @extends {BaseAudioContext}\n */\nfunction AudioContext(contextOptions) {}\n\n/**\n * @param {!HTMLMediaElement} mediaElement\n * @return {!MediaElementAudioSourceNode}\n */\nAudioContext.prototype.createMediaElementSource = function(mediaElement) {};\n\n/**\n * @return {!MediaStreamAudioDestinationNode}\n */\nAudioContext.prototype.createMediaStreamDestination = function() {};\n\n/**\n * @param {!MediaStream} mediaStream\n * @return {!MediaStreamAudioSourceNode}\n */\nAudioContext.prototype.createMediaStreamSource = function(mediaStream) {};\n\n/**\n * @deprecated Use createScriptProcessor instead.\n * @param {number} bufferSize\n * @param {number} numberOfInputs\n * @param {number} numberOfOuputs\n * @return {!ScriptProcessorNode}\n */\nAudioContext.prototype.createJavaScriptNode = function(bufferSize,\n numberOfInputs, numberOfOuputs) {};\n\n/**\n * @deprecated Use createGain instead.\n * @return {!GainNode}\n */\nAudioContext.prototype.createGainNode = function() {};\n\n/**\n * @deprecated Use createDelay instead.\n * @param {number=} maxDelayTime\n * @return {!DelayNode}\n */\nAudioContext.prototype.createDelayNode = function(maxDelayTime) {};\n\n/**\n * @param {number} numberOfChannels\n * @param {number} length\n * @param {number} sampleRate\n * @constructor\n * @extends {BaseAudioContext}\n */\nfunction OfflineAudioContext(numberOfChannels, length, sampleRate) {}\n\n/**\n * @return {!Promise}\n */\nOfflineAudioContext.prototype.startRendering = function() {};\n\n/** @type {function(!OfflineAudioCompletionEvent)} */\nOfflineAudioContext.prototype.oncomplete;\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction OfflineAudioCompletionEvent() {}\n\n/** @type {AudioBuffer} */\nOfflineAudioCompletionEvent.prototype.renderedBuffer;\n\n/**\n * @constructor\n * @implements {EventTarget}\n * @see https://www.w3.org/TR/webaudio/#the-audionode-interface\n */\nfunction AudioNode() {}\n\n/**\n * @override\n */\nAudioNode.prototype.addEventListener = function(type, listener,\n opt_useCapture) {};\n\n/**\n * @override\n */\nAudioNode.prototype.removeEventListener = function(type, listener,\n opt_useCapture) {};\n\n/**\n * @override\n * @return {boolean}\n */\nAudioNode.prototype.dispatchEvent = function(evt) {};\n\n/**\n * @param {!AudioNode|!AudioParam} destination\n * @param {number=} output\n * @param {number=} input\n * @return {AudioNode|void}\n */\nAudioNode.prototype.connect = function(destination, output, input) {};\n\n/**\n * @param {!AudioNode|!AudioParam|number=} destination\n * @param {number=} output\n * @param {number=} input\n */\nAudioNode.prototype.disconnect = function(destination, output, input) {};\n\n/** @type {!AudioContext} */\nAudioNode.prototype.context;\n\n/** @type {number} */\nAudioNode.prototype.numberOfInputs;\n\n/** @type {number} */\nAudioNode.prototype.numberOfOutputs;\n\n/** @type {number} */\nAudioNode.prototype.channelCount;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-audionode-interface for valid values\n */\nAudioNode.prototype.channelCountMode;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-audionode-interface for valid values\n */\nAudioNode.prototype.channelInterpretation;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction AudioSourceNode() {}\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction AudioDestinationNode() {}\n\n/**\n * @deprecated Use AudioDestinationNode#maxChannelCount\n * @type {number}\n */\nAudioDestinationNode.prototype.numberOfChannels;\n\n/** @type {number} */\nAudioDestinationNode.prototype.maxChannelCount;\n\n/**\n * @constructor\n */\nfunction AudioParam() {}\n\n/** @type {number} */\nAudioParam.prototype.value;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#dom-audioparam-automationrate for valid\n * values.\n */\nAudioParam.prototype.automationRate;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioParam.prototype.maxValue;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioParam.prototype.minValue;\n\n/** @type {number} */\nAudioParam.prototype.defaultValue;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioParam.prototype.units;\n\n/**\n * @param {number} value\n * @param {number} startTime\n * @return {!AudioParam}\n * @throws {!TypeError} if startTime is negative or not a finite number\n */\nAudioParam.prototype.setValueAtTime = function(value, startTime) {};\n\n/**\n * @param {number} value\n * @param {number} endTime\n * @return {!AudioParam}\n * @throws {!TypeError} if endTime is negative or not a finite number\n */\nAudioParam.prototype.linearRampToValueAtTime = function(value, endTime) {};\n\n/**\n * @param {number} value\n * @param {number} endTime\n * @return {!AudioParam}\n * @throws {!TypeError} if endTime is negative or not a finite number\n */\nAudioParam.prototype.exponentialRampToValueAtTime = function(value, endTime) {};\n\n/**\n * @param {number} target\n * @param {number} startTime\n * @param {number} timeConstant\n * @return {!AudioParam}\n * @throws {!TypeError} if startTime is negative or not a finite number, or\n * timeConstant is not strictly positive\n */\nAudioParam.prototype.setTargetAtTime = function(target, startTime,\n timeConstant) {};\n\n/**\n * @deprecated Use setTargetAtTime instead.\n * @param {number} target\n * @param {number} startTime\n * @param {number} timeConstant\n * @return {!AudioParam}\n */\nAudioParam.prototype.setTargetValueAtTime = function(target, startTime,\n timeConstant) {};\n\n/**\n * @param {!Float32Array} values\n * @param {number} startTime\n * @param {number} duration\n * @return {!AudioParam}\n * @throws {!TypeError} if startTime is negative or not a finite number\n */\nAudioParam.prototype.setValueCurveAtTime = function(values, startTime,\n duration) {};\n\n/**\n * @param {number} startTime\n * @return {!AudioParam}\n * @throws {!TypeError} if startTime is negative or not a finite number\n */\nAudioParam.prototype.cancelScheduledValues = function(startTime) {};\n\n/**\n * @constructor\n * @extends {AudioParam}\n */\nfunction AudioGain() {}\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction GainNode() {}\n\n/** @type {!AudioParam} */\nGainNode.prototype.gain;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction DelayNode() {}\n\n/** @type {!AudioParam} */\nDelayNode.prototype.delayTime;\n\n/**\n * @constructor\n */\nfunction AudioBuffer() {}\n\n/**\n * @deprecated\n * @type {!AudioGain}\n */\nAudioBuffer.prototype.gain;\n\n/** @type {number} */\nAudioBuffer.prototype.sampleRate;\n\n/** @type {number} */\nAudioBuffer.prototype.length;\n\n/** @type {number} */\nAudioBuffer.prototype.duration;\n\n/** @type {number} */\nAudioBuffer.prototype.numberOfChannels;\n\n/**\n * @param {number} channel\n * @return {!Float32Array}\n */\nAudioBuffer.prototype.getChannelData = function(channel) {};\n\n/**\n * @param {!Float32Array} destination\n * @param {number} channelNumber\n * @param {number=} startInChannel\n */\nAudioBuffer.prototype.copyFromChannel = function(destination,\n channelNumber, startInChannel) {};\n\n/**\n * @param {!Float32Array} source\n * @param {number} channelNumber\n * @param {number=} startInChannel\n */\nAudioBuffer.prototype.copyToChannel = function(source, channelNumber,\n startInChannel) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction AudioBufferSourceNode() {}\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioBufferSourceNode.prototype.UNSCHEDULED_STATE;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioBufferSourceNode.prototype.SCHEDULED_STATE;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioBufferSourceNode.prototype.PLAYING_STATE;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioBufferSourceNode.prototype.FINISHED_STATE;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioBufferSourceNode.prototype.playbackState;\n\n/** @type {AudioBuffer} */\nAudioBufferSourceNode.prototype.buffer;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioBufferSourceNode.prototype.gain;\n\n/** @type {!AudioParam} */\nAudioBufferSourceNode.prototype.playbackRate;\n\n/** @type {boolean} */\nAudioBufferSourceNode.prototype.loop;\n\n/** @type {number} */\nAudioBufferSourceNode.prototype.loopStart;\n\n/** @type {number} */\nAudioBufferSourceNode.prototype.loopEnd;\n\n/** @type {?function(!Event): void} */\nAudioBufferSourceNode.prototype.onended;\n\n/** @type {!AudioParam} */\nAudioBufferSourceNode.prototype.detune;\n\n/**\n * @param {number=} when\n * @param {number=} opt_offset\n * @param {number=} opt_duration\n * @throws {!TypeError} if any parameter is negative\n */\nAudioBufferSourceNode.prototype.start = function(when, opt_offset,\n opt_duration) {};\n\n/**\n * @param {number=} when\n * @throws {!TypeError} if when is negative\n */\nAudioBufferSourceNode.prototype.stop = function(when) {};\n\n/**\n * @deprecated Use AudioBufferSourceNode#start\n * @param {number} when\n * @return {undefined}\n */\nAudioBufferSourceNode.prototype.noteOn = function(when) {};\n\n/**\n * @param {number=} when\n * @param {number=} opt_offset\n * @param {number=} opt_duration\n * @deprecated Use AudioBufferSourceNode#start\n */\nAudioBufferSourceNode.prototype.noteGrainOn = function(when, opt_offset,\n opt_duration) {};\n\n/**\n * @param {number} when\n * @deprecated Use AudioBufferSourceNode#stop\n */\nAudioBufferSourceNode.prototype.noteOff = function(when) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction MediaElementAudioSourceNode() {}\n\n/**\n * @constructor\n */\nfunction AudioWorker() {}\n\n/** @type {?function(!Event)} */\nAudioWorker.prototype.onloaded;\n\n/** @type {?function(!Event)} */\nAudioWorker.prototype.onmessage;\n\n/** @type {!Array} */\nAudioWorker.prototype.parameters;\n\n/**\n * @param {string} name\n * @param {number} defaultValue\n * @return {!AudioParam}\n */\nAudioWorker.prototype.addParameter = function(name, defaultValue) {};\n\n/**\n * @param {number} numberOfInputs\n * @param {number} numberOfOutputs\n * @return {!AudioWorkerNode}\n */\nAudioWorker.prototype.createNode = function(numberOfInputs, numberOfOutputs) {};\n\n/**\n * @param {*} message\n * @param {!Array=} transfer\n */\nAudioWorker.prototype.postMessage = function(message, transfer) {};\n\n/**\n * @param {string} name\n */\nAudioWorker.prototype.removeParameter = function(name) {};\n\n/**\n */\nAudioWorker.prototype.terminate = function() {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction AudioWorkerNode() {}\n\n/** @type {?function(!Event)} */\nAudioWorkerNode.prototype.onmessage;\n\n/**\n * @param {*} message\n * @param {!Array=} transfer\n */\nAudioWorkerNode.prototype.postMessage = function(message, transfer) {};\n\n/**\n * @constructor\n */\nfunction AudioWorkerParamDescriptor() {}\n\n/** @type {number} */\nAudioWorkerParamDescriptor.prototype.defaultValue;\n\n/** @type {string} */\nAudioWorkerParamDescriptor.prototype.name;\n\n/**\n * @constructor\n */\nfunction AudioWorkerGlobalScope() {}\n\n/** @type {?function(!Event)} */\nAudioWorkerGlobalScope.prototype.onaudioprocess;\n\n/** @type {?function(!Event)} */\nAudioWorkerGlobalScope.prototype.onnodecreate;\n\n/** @type {!Array} */\nAudioWorkerGlobalScope.prototype.parameters;\n\n/** @type {number} */\nAudioWorkerGlobalScope.prototype.sampleRate;\n\n/**\n * @param {string} name\n * @param {number} defaultValue\n * @return {!AudioParam}\n */\nAudioWorkerGlobalScope.prototype.addParameter = function(name, defaultValue) {};\n\n/**\n * @param {string} name\n */\nAudioWorkerGlobalScope.prototype.removeParameter = function(name) {};\n\n/**\n * @constructor\n */\nfunction AudioWorkerNodeProcessor() {}\n\n/** @type {?function(!Event)} */\nAudioWorkerNodeProcessor.prototype.onmessage;\n\n/**\n * @param {*} message\n * @param {!Array=} transfer\n */\nAudioWorkerNodeProcessor.prototype.postMessage = function(message, transfer) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n * @deprecated Use AudioWorkerNode\n */\nfunction JavaScriptAudioNode() {}\n\n/**\n * @type {EventListener|(function(!AudioProcessingEvent):(boolean|undefined))}\n * @deprecated Use AudioWorkerNode\n */\nJavaScriptAudioNode.prototype.onaudioprocess;\n\n/**\n * @type {number}\n * @deprecated Use AudioWorkerNode\n */\nJavaScriptAudioNode.prototype.bufferSize;\n\n/**\n * @constructor\n * @extends {AudioNode}\n * @deprecated Use AudioWorkerNode\n */\nfunction ScriptProcessorNode() {}\n\n/**\n * @type {EventListener|(function(!AudioProcessingEvent):(boolean|undefined))}\n * @deprecated Use AudioWorkerNode\n */\nScriptProcessorNode.prototype.onaudioprocess;\n\n/**\n * @type {number}\n * @deprecated Use AudioWorkerNode\n */\nScriptProcessorNode.prototype.bufferSize;\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction AudioWorkerNodeCreationEvent() {}\n\n/** @type {!Array} */\nAudioWorkerNodeCreationEvent.prototype.inputs;\n\n/** @type {!AudioWorkerNodeProcessor} */\nAudioWorkerNodeCreationEvent.prototype.node;\n\n/** @type {!Array} */\nAudioWorkerNodeCreationEvent.prototype.outputs;\n\n/**\n * @constructor\n * @extends {Event}\n */\nfunction AudioProcessEvent() {}\n\n/** @type {!Float32Array} */\nAudioProcessEvent.prototype.inputs;\n\n/** @type {!AudioWorkerNodeProcessor} */\nAudioProcessEvent.prototype.node;\n\n/** @type {!Float32Array} */\nAudioProcessEvent.prototype.outputs;\n\n/** @type {!Object} */\nAudioProcessEvent.prototype.parameters;\n\n/** @type {number} */\nAudioProcessEvent.prototype.playbackTime;\n\n/**\n * @constructor\n * @extends {Event}\n * @deprecated Use AudioProcessEvent\n */\nfunction AudioProcessingEvent() {}\n\n/**\n * @type {!ScriptProcessorNode}\n * @deprecated Use AudioProcessEvent\n */\nAudioProcessingEvent.prototype.node;\n\n/**\n * @type {number}\n * @deprecated Use AudioProcessEvent\n */\nAudioProcessingEvent.prototype.playbackTime;\n\n/**\n * @type {!AudioBuffer}\n * @deprecated Use AudioProcessEvent\n */\nAudioProcessingEvent.prototype.inputBuffer;\n\n/**\n * @type {!AudioBuffer}\n * @deprecated Use AudioProcessEvent\n */\nAudioProcessingEvent.prototype.outputBuffer;\n\n/**\n * @deprecated\n * @constructor\n * @extends {AudioNode}\n */\nfunction AudioPannerNode() {}\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioPannerNode.prototype.EQUALPOWER;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioPannerNode.prototype.HRTF;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioPannerNode.prototype.SOUNDFIELD;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioPannerNode.prototype.LINEAR_DISTANCE;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioPannerNode.prototype.INVERSE_DISTANCE;\n\n/**\n * @deprecated\n * @const {number}\n */\nAudioPannerNode.prototype.EXPONENTIAL_DISTANCE;\n\n/**\n * @deprecated\n * @type {number|string}\n */\nAudioPannerNode.prototype.panningModel;\n\n/**\n * @deprecated\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {undefined}\n */\nAudioPannerNode.prototype.setPosition = function(x, y, z) {};\n\n/**\n * @deprecated\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {undefined}\n */\nAudioPannerNode.prototype.setOrientation = function(x, y, z) {};\n\n/**\n * @deprecated\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @return {undefined}\n */\nAudioPannerNode.prototype.setVelocity = function(x, y, z) {};\n\n/**\n * @deprecated\n * @type {number|string}\n */\nAudioPannerNode.prototype.distanceModel;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioPannerNode.prototype.refDistance;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioPannerNode.prototype.maxDistance;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioPannerNode.prototype.rolloffFactor;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioPannerNode.prototype.coneInnerAngle;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioPannerNode.prototype.coneOuterAngle;\n\n/**\n * @deprecated\n * @type {number}\n */\nAudioPannerNode.prototype.coneOuterGain;\n\n/**\n * @deprecated\n * @type {!AudioGain}\n */\nAudioPannerNode.prototype.coneGain;\n\n/**\n * @deprecated\n * @type {!AudioGain}\n */\nAudioPannerNode.prototype.distanceGain;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction PannerNode() {}\n\n/** @type {number} */\nPannerNode.prototype.coneInnerAngle;\n\n/** @type {number} */\nPannerNode.prototype.coneOuterAngle;\n\n/** @type {number} */\nPannerNode.prototype.coneOuterGain;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-pannernode-interface for valid values\n */\nPannerNode.prototype.distanceModel;\n\n/** @type {number} */\nPannerNode.prototype.maxDistance;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-pannernode-interface for valid values\n */\nPannerNode.prototype.panningModel;\n\n/** @type {number} */\nPannerNode.prototype.refDistance;\n\n/** @type {number} */\nPannerNode.prototype.rolloffFactor;\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\nPannerNode.prototype.setOrientation = function(x, y, z) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\nPannerNode.prototype.setPosition = function(x, y, z) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} z\n */\nPannerNode.prototype.setVelocity = function(x, y, z) {};\n\n/**\n * @constructor\n * @deprecated Use SpatialListener\n */\nfunction AudioListener() {}\n\n/**\n * @type {number}\n * @deprecated Use SpatialListener\n */\nAudioListener.prototype.gain;\n\n/**\n * @type {number}\n * @deprecated Use SpatialListener\n */\nAudioListener.prototype.dopplerFactor;\n\n/**\n * @type {number}\n * @deprecated Use SpatialListener\n */\nAudioListener.prototype.speedOfSound;\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @deprecated Use SpatialListener\n */\nAudioListener.prototype.setPosition = function(x, y, z) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @param {number} xUp\n * @param {number} yUp\n * @param {number} zUp\n * @deprecated Use SpatialListener\n */\nAudioListener.prototype.setOrientation = function(x, y, z, xUp, yUp, zUp) {};\n\n/**\n * @param {number} x\n * @param {number} y\n * @param {number} z\n * @deprecated Use SpatialListener\n */\nAudioListener.prototype.setVelocity = function(x, y, z) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction SpatialPannerNode() {}\n\n/** @type {number} */\nSpatialPannerNode.prototype.coneInnerAngle;\n\n/** @type {number} */\nSpatialPannerNode.prototype.coneOuterAngle;\n\n/** @type {number} */\nSpatialPannerNode.prototype.coneOuterGain;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-pannernode-interface for valid values\n */\nSpatialPannerNode.prototype.distanceModel;\n\n/** @type {number} */\nSpatialPannerNode.prototype.maxDistance;\n\n/** @type {!AudioParam} */\nSpatialPannerNode.prototype.orientationX;\n\n/** @type {!AudioParam} */\nSpatialPannerNode.prototype.orientationY;\n\n/** @type {!AudioParam} */\nSpatialPannerNode.prototype.orientationZ;\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-pannernode-interface for valid values\n */\nSpatialPannerNode.prototype.panningModel;\n\n/** @type {!AudioParam} */\nSpatialPannerNode.prototype.positionX;\n\n/** @type {!AudioParam} */\nSpatialPannerNode.prototype.positionY;\n\n/** @type {!AudioParam} */\nSpatialPannerNode.prototype.positionZ;\n\n/** @type {number} */\nSpatialPannerNode.prototype.refDistance;\n\n/** @type {number} */\nSpatialPannerNode.prototype.rolloffFactor;\n\n/**\n * @constructor\n */\nfunction SpatialListener() {}\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.forwardX;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.forwardY;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.forwardZ;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.positionX;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.positionY;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.positionZ;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.upX;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.upY;\n\n/** @type {!AudioParam} */\nSpatialListener.prototype.upZ;\n\n/**\n * @constructor\n * @extends {AudioNode}\n * @see http://webaudio.github.io/web-audio-api/#the-stereopannernode-interface\n */\nfunction StereoPannerNode() {}\n\n/** @type {!AudioParam} */\nStereoPannerNode.prototype.pan;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction ConvolverNode() {}\n\n/** @type {?AudioBuffer} */\nConvolverNode.prototype.buffer;\n\n/** @type {boolean} */\nConvolverNode.prototype.normalize;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nvar AnalyserNode = function() {};\n\n/**\n * @param {!Float32Array} array\n */\nAnalyserNode.prototype.getFloatFrequencyData = function(array) {};\n\n/**\n * @param {!Uint8Array} array\n */\nAnalyserNode.prototype.getByteFrequencyData = function(array) {};\n\n/**\n * @param {!Uint8Array} array\n */\nAnalyserNode.prototype.getByteTimeDomainData = function(array) {};\n\n/**\n * @param {!Float32Array} array\n */\nAnalyserNode.prototype.getFloatTimeDomainData = function(array) {};\n\n/** @type {number} */\nAnalyserNode.prototype.fftSize;\n\n/** @type {number} */\nAnalyserNode.prototype.frequencyBinCount;\n\n/** @type {number} */\nAnalyserNode.prototype.minDecibels;\n\n/** @type {number} */\nAnalyserNode.prototype.maxDecibels;\n\n/** @type {number} */\nAnalyserNode.prototype.smoothingTimeConstant;\n\n/**\n * @constructor\n * @extends {AnalyserNode}\n * @deprecated Use AnalyserNode\n *\n * This constructor has been added for backwards compatibility.\n */\nvar RealtimeAnalyserNode = function() {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction ChannelSplitterNode() {}\n\n/**\n * @constructor\n * @extends {ChannelSplitterNode}\n * @deprecated Use ChannelSplitterNode\n *\n * This constructor has been added for backwards compatibility.\n */\nfunction AudioChannelSplitter() {}\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction ChannelMergerNode() {}\n\n/**\n * @constructor\n * @extends {ChannelMergerNode}\n * @deprecated Use ChannelMergerNode\n *\n * This constructor has been added for backwards compatibility.\n */\nfunction AudioChannelMerger() {}\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction DynamicsCompressorNode() {}\n\n/** @type {!AudioParam} */\nDynamicsCompressorNode.prototype.threshold;\n\n/** @type {!AudioParam} */\nDynamicsCompressorNode.prototype.knee;\n\n/** @type {!AudioParam} */\nDynamicsCompressorNode.prototype.ratio;\n\n/** @type {number} */\nDynamicsCompressorNode.prototype.reduction;\n\n/** @type {!AudioParam} */\nDynamicsCompressorNode.prototype.attack;\n\n/** @type {!AudioParam} */\nDynamicsCompressorNode.prototype.release;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction BiquadFilterNode() {}\n\n/**\n * A read-able and write-able string that specifies the type of the filter.\n * See http://webaudio.github.io/web-audio-api/#the-biquadfilternode-interface\n * for valid values.\n * @type {string}\n */\nBiquadFilterNode.prototype.type;\n\n/** @type {!AudioParam} */\nBiquadFilterNode.prototype.frequency;\n\n/** @type {!AudioParam} */\nBiquadFilterNode.prototype.detune;\n\n/** @type {!AudioParam} */\nBiquadFilterNode.prototype.Q;\n\n/** @type {!AudioParam} */\nBiquadFilterNode.prototype.gain;\n/**\n * @param {Float32Array} frequencyHz\n * @param {Float32Array} magResponse\n * @param {Float32Array} phaseResponse\n * @return {undefined}\n */\nBiquadFilterNode.prototype.getFrequencyResponse = function(\n frequencyHz, magResponse, phaseResponse) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction IIRFilterNode() {}\n\n/**\n * @param {!Float32Array} frequencyHz\n * @param {!Float32Array} magResponse\n * @param {!Float32Array} phaseResponse\n * @return {undefined}\n */\nIIRFilterNode.prototype.getFrequencyResponse = function(\n frequencyHz, magResponse, phaseResponse) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction WaveShaperNode() {}\n\n/** @type {Float32Array} */\nWaveShaperNode.prototype.curve;\n\n/** @type {string} */\nWaveShaperNode.prototype.oversample;\n\n/**\n * @deprecated\n * @constructor\n */\nfunction WaveTable() {}\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction OscillatorNode() {}\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#the-oscillatornode-interface for valid values\n */\nOscillatorNode.prototype.type;\n\n/**\n * @deprecated\n * @type {number}\n */\nOscillatorNode.prototype.playbackState;\n\n/** @type {!AudioParam} */\nOscillatorNode.prototype.frequency;\n\n/** @type {!AudioParam} */\nOscillatorNode.prototype.detune;\n\n/**\n * @param {number=} when\n */\nOscillatorNode.prototype.start = function(when) {};\n\n/**\n * @param {number=} when\n */\nOscillatorNode.prototype.stop = function(when) {};\n\n/**\n * @deprecated\n * @param {!WaveTable} waveTable\n */\nOscillatorNode.prototype.setWaveTable = function(waveTable) {};\n\n/**\n * @param {!PeriodicWave} periodicWave\n */\nOscillatorNode.prototype.setPeriodicWave = function(periodicWave) {};\n\n/** @type {?function(!Event)} */\nOscillatorNode.prototype.onended;\n\n/**\n * @constructor\n */\nfunction PeriodicWave() {}\n\n/**\n * @record\n * @see https://www.w3.org/TR/webaudio/#dictdef-constantsourceoptions\n */\nfunction ConstantSourceOptions() {};\n\n/** @const {(number|undefined)} */\nConstantSourceOptions.offset;\n\n/**\n * @param {!BaseAudioContext} context\n * @param {!ConstantSourceOptions=} options\n * @constructor\n * @extends {AudioNode}\n * @see https://www.w3.org/TR/webaudio/#ConstantSourceNode\n */\nfunction ConstantSourceNode(context, options) {}\n\n/**\n * @param {number=} when\n */\nConstantSourceNode.prototype.start = function(when) {};\n\n/**\n * @param {number=} when\n */\nConstantSourceNode.prototype.stop = function(when) {};\n\n/** @type {!AudioParam} */\nConstantSourceNode.prototype.offset;\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction MediaStreamAudioSourceNode() {}\n\n/**\n * @constructor\n * @extends {AudioNode}\n */\nfunction MediaStreamAudioDestinationNode() {}\n\n/** @type {!MediaStream} */\nMediaStreamAudioDestinationNode.prototype.stream;\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/webaudio/#audioworklet\n * @implements {Worklet}\n */\nfunction AudioWorklet() {}\n\n/**\n * @constructor\n * @see https://www.w3.org/TR/webaudio/#audioworkletglobalscope\n * @implements {WorkletGlobalScope}\n */\nfunction AudioWorkletGlobalScope() {}\n\n/** @type {number} */\nAudioWorkletGlobalScope.prototype.currentFrame;\n\n/** @type {number} */\nAudioWorkletGlobalScope.prototype.currentTime;\n\n/** @type {number} */\nAudioWorkletGlobalScope.prototype.sampleRate;\n\n/**\n * @param {!string} name\n * @param {!function()} processorCtor\n */\nAudioWorkletGlobalScope.prototype.registerProcessor = function(\n name, processorCtor) {};\n\n/**\n * @constructor\n * @extends {AudioNode}\n * @param {!BaseAudioContext} context\n * @param {string} name\n * @param {!AudioWorkletNodeOptions=} options\n * @see https://www.w3.org/TR/webaudio/#audioworkletnode\n */\nfunction AudioWorkletNode(context, name, options) {}\n\n/** @type {!EventListener|function()} */\nAudioWorkletNode.prototype.onprocesserror;\n\n/** @type {!Object} */\nAudioWorkletNode.prototype.parameters;\n\n/** @type {!MessagePort} */\nAudioWorkletNode.prototype.port;\n\n/**\n * @record\n * @see https://webaudio.github.io/web-audio-api/#dictdef-audioworkletnodeoptions\n */\nfunction AudioWorkletNodeOptions() {};\n\n/** @type {number} */\nAudioWorkletNodeOptions.prototype.numberOfInputs;\n\n/** @type {number} */\nAudioWorkletNodeOptions.prototype.numberOfOutputs;\n\n/** @type {!Array} */\nAudioWorkletNodeOptions.prototype.outputChannelCount;\n\n/** @type {!Object} */\nAudioWorkletNodeOptions.prototype.parameterData;\n\n/** @type {?Object} */\nAudioWorkletNodeOptions.prototype.processorOptions;\n\n/**\n * @constructor\n * @param {!AudioWorkletNodeOptions=} options\n * @see https://www.w3.org/TR/webaudio/#audioworkletprocessor\n */\nfunction AudioWorkletProcessor(options) {}\n\n/** @type {!MessagePort} */\nAudioWorkletProcessor.prototype.port;\n\n/**\n * @param {!Array>} inputs\n * @param {!Array>} outputs\n * @param {!Object} parameters\n * @return {boolean}\n */\nAudioWorkletProcessor.prototype.process = function(\n inputs, outputs, parameters) {};\n\n/**\n * @record\n * @see https://www.w3.org/TR/webaudio/#dictdef-audioparamdescriptor\n */\nfunction AudioParamDescriptor() {};\n\n/**\n * @type {string}\n * See https://www.w3.org/TR/webaudio/#dom-audioparam-automationrate for valid\n * values.\n */\nAudioParamDescriptor.prototype.automationRate;\n\n/** @type {number} */\nAudioParamDescriptor.prototype.defaultValue;\n\n/** @type {number} */\nAudioParamDescriptor.prototype.maxValue;\n\n/** @type {number} */\nAudioParamDescriptor.prototype.minValue;\n\n/** @type {string} */\nAudioParamDescriptor.prototype.name;\n","externs/wicg_uach.js":"/*\n * Copyright 2008 The Closure Compiler Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview The current draft spec of User Agent Client Hint interface.\n * @see https://wicg.github.io/ua-client-hints/#interface\n * @externs\n */\n\n/**\n * @see https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion\n * @record\n * @struct\n */\nfunction NavigatorUABrandVersion() {}\n\n/** @type {string} */\nNavigatorUABrandVersion.prototype.brand;\n\n/** @type {string} */\nNavigatorUABrandVersion.prototype.version;\n\n\n/**\n * @see https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues\n * @record\n * @struct\n */\nfunction UADataValues() {}\n\n/** @type {string} */\nUADataValues.prototype.platform;\n\n/** @type {string} */\nUADataValues.prototype.platformVersion;\n\n/** @type {string} */\nUADataValues.prototype.architecture;\n\n/** @type {string} */\nUADataValues.prototype.model;\n\n/** @type {string} */\nUADataValues.prototype.uaFullVersion;\n\n/**\n * @see https://wicg.github.io/ua-client-hints/#navigatoruadata\n * @record\n * @struct\n */\nfunction NavigatorUAData() {}\n\n/** @type {!Array} */\nNavigatorUAData.prototype.brands;\n\n/** @type {boolean} */\nNavigatorUAData.prototype.mobile;\n\n/** @type {function(!Array) : !Promise} */\nNavigatorUAData.prototype.getHighEntropyValues;\n\n/**\n * @type {?NavigatorUAData}\n * @see https://wicg.github.io/ua-client-hints/#interface\n */\nNavigator.prototype.userAgentData;\n\n/**\n * @type {?NavigatorUAData}\n * @see https://wicg.github.io/ua-client-hints/#interface\n */\nWorkerNavigator.prototype.userAgentData;\n","js/base.js":"/*\n * Copyright 2012 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview The base namespace for code injected by the compiler\n * at compile-time.\n */\n\n/** @const */\nvar $jscomp = $jscomp || {};\n\n/** @const Locals for goog.scope */\n$jscomp.scope = {};\n","js/es6/array.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Brings in all ES6 Array polyfills.\n * @suppress {uselessCode}\n */\n'require es6/array/copywithin';\n'require es6/array/entries';\n'require es6/array/fill';\n'require es6/array/find';\n'require es6/array/findindex';\n'require es6/array/flat';\n'require es6/array/flatmap';\n'require es6/array/from';\n'require es6/array/includes';\n'require es6/array/keys';\n'require es6/array/of';\n'require es6/array/values';\n","js/es6/array/copywithin.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.copyWithin', function(orig) {\n // requires strict mode to throw for invalid `this` or params\n 'use strict';\n\n if (orig) return orig;\n\n /**\n * Copies elements from one part of the array to another.\n *\n * @this {!IArrayLike}\n * @param {number} target Start index to copy elements to.\n * @param {number} start Start index to copy elements from.\n * @param {number=} opt_end Index from which to end copying.\n * @return {!IArrayLike} The array, with the copy performed in-place.\n * @template VALUE\n */\n var polyfill = function(target, start, opt_end) {\n var len = this.length;\n target = toInteger(target);\n start = toInteger(start);\n var end = opt_end === undefined ? len : toInteger(opt_end);\n var to = target < 0 ? Math.max(len + target, 0) : Math.min(target, len);\n var from = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);\n var final = end < 0 ? Math.max(len + end, 0) : Math.min(end, len);\n if (to < from) {\n while (from < final) {\n if (from in this) {\n this[to++] = this[from++];\n } else {\n delete this[to++];\n from++;\n }\n }\n } else {\n final = Math.min(final, len + from - to);\n to += final - from;\n while (final > from) {\n if (--final in this) {\n this[--to] = this[final];\n } else {\n delete this[--to];\n }\n }\n }\n return this;\n };\n\n /**\n * @param {number} arg\n * @return {number}\n */\n function toInteger(arg) {\n var n = Number(arg);\n if (n === Infinity || n === -Infinity) {\n return n;\n }\n return n | 0;\n }\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/entries.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/util/iteratorfromarray';\n\n$jscomp.polyfill('Array.prototype.entries', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns an iterator of [key, value] arrays, one for each entry\n * in the given array.\n *\n * @this {!IArrayLike}\n * @return {!IteratorIterable>}\n * @template VALUE\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function() {\n return $jscomp.iteratorFromArray(\n this, function(i, v) { return [i, v]; });\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/fill.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.fill', function(orig) {\n if (orig) return orig;\n\n /**\n * Fills elements of an array with a constant value.\n *\n * @this {!IArrayLike}\n * @param {VALUE} value Value to fill.\n * @param {number=} opt_start Start index, or zero if omitted.\n * @param {number=} opt_end End index, or length if omitted.\n * @return {!IArrayLike} The array, with the fill performed in-place.\n * @template VALUE\n * @suppress {reportUnknownTypes, strictPrimitiveOperators}\n */\n var polyfill = function(value, opt_start, opt_end) {\n var length = this.length || 0;\n if (opt_start < 0) {\n opt_start = Math.max(0, length + /** @type {number} */ (opt_start));\n }\n if (opt_end == null || opt_end > length) opt_end = length;\n opt_end = Number(opt_end);\n if (opt_end < 0) opt_end = Math.max(0, length + opt_end);\n for (var i = Number(opt_start || 0); i < opt_end; i++) {\n this[i] = value;\n }\n return this;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/find.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/findinternal';\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.find', function(orig) {\n if (orig) return orig;\n\n /**\n * Finds and returns an element that satisfies the given predicate.\n *\n * @this {!IArrayLike}\n * @param {function(this: THIS, VALUE, number, !IArrayLike): *}\n * callback\n * @param {THIS=} opt_thisArg\n * @return {VALUE|undefined} The found value, or undefined.\n * @template VALUE, THIS\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function(callback, opt_thisArg) {\n return $jscomp.findInternal(this, callback, opt_thisArg).v;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/findindex.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/findinternal';\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.findIndex', function(orig) {\n if (orig) return orig;\n\n /**\n * Finds an element that satisfies the given predicate, returning its index.\n *\n * @this {!IArrayLike}\n * @param {function(this: THIS, VALUE, number, !IArrayLike): *}\n * callback\n * @param {THIS=} opt_thisArg\n * @return {number} The found value, or undefined.\n * @template VALUE, THIS\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function(callback, opt_thisArg) {\n return $jscomp.findInternal(this, callback, opt_thisArg).i;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/flat.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @fileoverview @suppress {uselessCode} */\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.flat', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfills Array.prototype.flat.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n *\n * @param {number=} depth\n * @return {!Array}\n * @this {!IArrayLike}\n * @template T, S\n * @suppress {reportUnknownTypes}\n */\n var flat = function(depth) {\n // TODO(sdh): Consider respecting Symbol.species (b/121061255).\n depth = depth === undefined ? 1 : depth;\n var flattened = [];\n for (var i = 0; i < this.length; i++) {\n var element = this[i];\n if (Array.isArray(element) && depth > 0) {\n var inner = Array.prototype.flat.call(element, depth - 1);\n flattened.push.apply(flattened, inner);\n } else {\n flattened.push(element);\n }\n }\n return flattened;\n };\n\n return flat;\n}, 'es9', 'es5');\n","js/es6/array/flatmap.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @fileoverview @suppress {uselessCode} */\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.flatMap', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfills Array.prototype.flatMap.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap\n *\n * @param {function(this: THIS, T, number, !IArrayLike): !Array} callback\n * @param {THIS=} thisArg\n * @return {!Array}\n * @this {!IArrayLike}\n * @template T, THIS, S\n * @suppress {reportUnknownTypes}\n */\n var flatMap = function(callback, thisArg) {\n var mapped = [];\n for (var i = 0; i < this.length; i++) {\n var result = callback.call(thisArg, this[i], i, this);\n if (Array.isArray(result)) {\n mapped.push.apply(mapped, result);\n } else {\n // NOTE: The specification says the callback can return a non-Array.\n // We intentionally don't include that in the type information on\n // this function or the corresponding extern in order to encourage\n // more readable code and avoid complex TTL in the type annotations,\n // but we still want to behave correctly if the callback gives us a\n // non-Array.\n mapped.push(result);\n }\n }\n return mapped;\n };\n\n return flatMap;\n}, 'es9', 'es5');\n","js/es6/array/from.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Array.from', function(orig) {\n if (orig) return orig;\n\n /**\n * Creates a new Array from an array-like or iterable object.\n *\n *

Polyfills the static function Array.from(). Does not support\n * constructor inheritance (i.e. (subclass of Array).from), and\n * relies on the compiler to check the validity of inputs rather\n * than producing spec-compliant TypeErrors.\n *\n * @param {!IArrayLike|!Iterable} arrayLike\n * An array-like or iterable.\n * @param {(function(this: THIS, INPUT, number): OUTPUT)=} opt_mapFn\n * Function to call on each argument.\n * @param {THIS=} opt_thisArg\n * Object to use as 'this' when calling mapFn.\n * @return {!Array}\n * @template INPUT, OUTPUT, THIS\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function(arrayLike, opt_mapFn, opt_thisArg) {\n opt_mapFn = opt_mapFn != null ? opt_mapFn : function(x) { return x; };\n var result = [];\n // NOTE: this is cast to ? because [] on @struct is an error\n var iteratorFunction = typeof Symbol != 'undefined' && Symbol.iterator &&\n (/** @type {?} */ (arrayLike)[Symbol.iterator]);\n if (typeof iteratorFunction == 'function') {\n arrayLike = iteratorFunction.call(arrayLike);\n var next;\n var k = 0;\n while (!(next = arrayLike.next()).done) {\n result.push(\n opt_mapFn.call(/** @type {?} */ (opt_thisArg), next.value, k++));\n }\n } else {\n var len = arrayLike.length; // need to support non-iterables\n for (var i = 0; i < len; i++) {\n result.push(\n opt_mapFn.call(/** @type {?} */ (opt_thisArg), arrayLike[i], i));\n }\n }\n return result;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/includes.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/object/is';\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.includes', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfills Array.prototype.includes.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes\n *\n * @this {!IArrayLike}\n * @param {T} searchElement\n * @param {number=} opt_fromIndex\n * @return {boolean}\n * @template T\n * @suppress {reportUnknownTypes}\n */\n var includes = function(searchElement, opt_fromIndex) {\n var array = this;\n if (array instanceof String) {\n array = /** @type {!IArrayLike} */ (String(array));\n }\n var len = array.length;\n var i = opt_fromIndex || 0;\n if (i < 0) {\n i = Math.max(i + len, 0);\n }\n for (; i < len; i++) {\n var element = array[i];\n if (element === searchElement || Object.is(element, searchElement)) {\n return true;\n }\n }\n return false;\n };\n\n return includes;\n}, 'es7', 'es3');\n","js/es6/array/keys.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/util/iteratorfromarray';\n'require util/polyfill';\n\n$jscomp.polyfill('Array.prototype.keys', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns an iterator of keys of the given array.\n *\n * @this {!IArrayLike}\n * @return {!IteratorIterable}\n */\n var polyfill = function() {\n return $jscomp.iteratorFromArray(this, function(i) { return i; });\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/of.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/array/from';\n'require util/polyfill';\n\n$jscomp.polyfill('Array.of', function(orig) {\n if (orig) return orig;\n\n /**\n * Creates an array from a fixed set of arguments.\n *\n *

Polyfills the static function Array.of(). Does not support\n * constructor inheritance (i.e. (subclass of Array).of).\n *\n * @param {...T} var_args Elements to include in the array.\n * @return {!Array}\n * @template T\n */\n var polyfill = function(var_args) {\n return Array.from(arguments);\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/array/values.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/util/iteratorfromarray';\n'require util/polyfill';\n\n// NOTE: Although Array.prototype.values was added to the 2015 edition of the\n// spec, we consider it an \"ES8\" feature because many browsers which are\n// otherwise ES6-compatible, have not implemented it due to web compatibility\n// issues. See https://bugs.chromium.org/p/chromium/issues/detail?id=615873\n$jscomp.polyfill('Array.prototype.values', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns an iterator of values of the given array.\n *\n * @this {!IArrayLike}\n * @return {!IteratorIterable}\n * @template VALUE\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function() {\n return $jscomp.iteratorFromArray(this, function(k, v) { return v; });\n };\n\n return polyfill;\n}, 'es8', 'es3');\n","js/es6/async_generator_wrapper.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Runtime logic for transpiled Async Generators.\n * @suppress {uselessCode}\n */\n'require base';\n'require es6/util/makeasynciterator';\n\n\n/** @enum {number} */\n$jscomp.AsyncGeneratorWrapper$ActionEnum = {\n /** Yield the value from the wrapper generator */\n YIELD_VALUE: 0,\n /** Yield each value from a delegate generator */\n YIELD_STAR: 1,\n /** Resolve the value as a Promise and continue execution */\n AWAIT_VALUE: 2,\n};\n\n/**\n * @param {!$jscomp.AsyncGeneratorWrapper$ActionEnum} action\n * @param {VALUE} value\n * @constructor\n * @template VALUE\n * @struct\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper$ActionRecord = function(action, value) {\n /**\n * @public\n * @const\n * @type {!$jscomp.AsyncGeneratorWrapper$ActionEnum}\n */\n this.action = action;\n\n /**\n * @public\n * @const\n * @type {VALUE}\n */\n this.value = /** @type {VALUE} */ (value);\n};\n\n/** @enum {string} */\n$jscomp.AsyncGeneratorWrapper$GeneratorMethod = {\n NEXT: 'next', THROW: 'throw', RETURN: 'return',\n};\n\n/**\n * Records the details of a call to `next()`, `throw()`, or `return()`.\n *\n * One of these objects will be created for each call.\n *\n * @param {$jscomp.AsyncGeneratorWrapper$GeneratorMethod} method\n * Method to call on generator\n * @param {?} param\n * Parameter for method called on generator\n *\n * @param {function(!IIterableResult)} resolve\n * Function to resolve the Promise associated with this frame.\n * @param {function(?)} reject\n * Function to reject the Promise associated with this frame.\n *\n * @constructor\n * @private\n * @template VALUE\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionFrame_ = function(\n method, param, resolve, reject) {\n /** @type {$jscomp.AsyncGeneratorWrapper$GeneratorMethod} */\n this.method = method;\n /** @type {?} */\n this.param = param;\n /** @type {function(!IIterableResult)} */\n this.resolve = resolve;\n /** @type {function(?)} */\n this.reject = reject;\n};\n\n/**\n * @param {!$jscomp.AsyncGeneratorWrapper$ExecutionFrame_} frame\n * The frame at this position in the queue\n * @param {$jscomp.AsyncGeneratorWrapper$ExecutionNode_} next\n * The node containing the frame to be executed after this one completes\n *\n * @constructor\n * @private\n * @template VALUE\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionNode_ = function(frame, next) {\n /** @type {!$jscomp.AsyncGeneratorWrapper$ExecutionFrame_} */\n this.frame = frame;\n /** @type {$jscomp.AsyncGeneratorWrapper$ExecutionNode_} */\n this.next = next;\n};\n\n/**\n * A minimalistic queue backed by a linked-list.\n *\n * @constructor\n * @private\n * @template VALUE\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionQueue_ = function() {\n /**\n * @type {$jscomp.AsyncGeneratorWrapper$ExecutionNode_}\n * @private\n */\n this.head_ = null;\n\n /**\n *\n * @type {$jscomp.AsyncGeneratorWrapper$ExecutionNode_}\n * @private\n */\n this.tail_ = null;\n};\n\n/**\n * @return {boolean}\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionQueue_.prototype.isEmpty = function() {\n return this.head_ === null;\n};\n\n/**\n * Returns the current head frame if it exists, otherwise throws Error.\n *\n * @return {!$jscomp.AsyncGeneratorWrapper$ExecutionFrame_}\n * @throws {Error} if the queue is empty\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionQueue_.prototype.first = function() {\n if (this.head_) {\n return this.head_.frame;\n } else {\n throw new Error('no frames in executionQueue');\n }\n};\n\n/**\n * Drops the current head frame off the head of the queue. Performs same\n * operations as a theoretical \"pop\", but saves time by not storing or returning\n * the popped frame.\n *\n * If the queue is empty, no operation is performed.\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionQueue_.prototype.drop = function() {\n if (this.head_) {\n this.head_ = this.head_.next;\n if (!this.head_) {\n this.tail_ = null;\n }\n }\n};\n\n/**\n * @param {!$jscomp.AsyncGeneratorWrapper$ExecutionFrame_} newFrame\n * the new frame to be executed after all frames currently in the queue\n */\n$jscomp.AsyncGeneratorWrapper$ExecutionQueue_.prototype.enqueue = function(\n newFrame) {\n var node = new $jscomp.AsyncGeneratorWrapper$ExecutionNode_(newFrame, null);\n if (this.tail_) {\n this.tail_.next = node;\n this.tail_ = node;\n } else {\n this.head_ = node;\n this.tail_ = node;\n }\n};\n\n/**\n * @constructor\n * @implements {AsyncGenerator}\n * @implements {AsyncIterable}\n * @template VALUE\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper = function(\n /** @type {!Generator<$jscomp.AsyncGeneratorWrapper$ActionRecord>} */\n generator) {\n /** @private */\n this.generator_ = generator;\n\n /**\n * @private\n * @type {AsyncIterator}\n */\n this.delegate_ = null;\n\n /**\n * @type {!$jscomp.AsyncGeneratorWrapper$ExecutionQueue_}\n * @private\n */\n this.executionQueue_ = new $jscomp.AsyncGeneratorWrapper$ExecutionQueue_();\n\n /** @type {$jscomp.AsyncGeneratorWrapper} */\n this[Symbol.asyncIterator] =\n /** @return {$jscomp.AsyncGeneratorWrapper} */ function() {\n return this;\n };\n\n var self = this;\n\n /**\n * @this {undefined}\n * @param {!IIterableResult} record\n * @private\n */\n this.boundHandleDelegateResult_ = function(record) {\n self.handleDelegateResult_(record);\n };\n\n /**\n * @this {undefined}\n * @param {*} thrownError\n * @private\n */\n this.boundHandleDelegateError_ = function(thrownError) {\n self.handleDelegateError_(thrownError);\n };\n\n /**\n * @this {undefined}\n * @param {*} err\n * @private\n */\n this.boundRejectAndClose_ = function(err) {\n self.rejectAndClose_(err);\n };\n};\n\n/**\n * @param {!$jscomp.AsyncGeneratorWrapper$GeneratorMethod} method\n * @param {?} param\n * @return {!Promise>}\n * @private\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.enqueueMethod_ = function(\n method, param) {\n var self = this;\n return new Promise(function(resolve, reject) {\n var wasEmpty = self.executionQueue_.isEmpty();\n self.executionQueue_.enqueue(\n new $jscomp.AsyncGeneratorWrapper$ExecutionFrame_(\n method, param, resolve, reject));\n if (wasEmpty) {\n self.runFrame_();\n }\n });\n};\n\n/**\n * @override\n * @param {?=} opt_value\n * @return {!Promise>}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.next = function(opt_value) {\n return this.enqueueMethod_(\n $jscomp.AsyncGeneratorWrapper$GeneratorMethod.NEXT, opt_value);\n};\n\n/**\n * @override\n * @param {VALUE} value\n * @return {!Promise>}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.return = function(value) {\n return this.enqueueMethod_(\n $jscomp.AsyncGeneratorWrapper$GeneratorMethod.RETURN,\n new $jscomp.AsyncGeneratorWrapper$ActionRecord(\n $jscomp.AsyncGeneratorWrapper$ActionEnum.YIELD_VALUE, value));\n};\n\n/**\n * @override\n * @param {*=} exception\n * @return {!Promise>}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.throw = function(exception) {\n return this.enqueueMethod_(\n $jscomp.AsyncGeneratorWrapper$GeneratorMethod.THROW, exception);\n};\n\n/**\n * Recursively executes all frames in the executionQueue until it is empty.\n * Frames that are added to the queue while execution is being performed will\n * be executed when they are reached.\n *\n * In order to guarantee each frame in the entire queue will be processed\n * exactly once, each branch in runDelegateFrame and runGeneratorFrame should\n * conclude with the following specification:\n *\n * If the frame is ready to be resolved/rejected:\n *\n * 1. Resolve or reject the frame.\n * 2. Drop the frame from the head of the queue.\n * 3. End with a call to runFrame.\n *\n * Otherwise, if another action must be performed:\n *\n * 1. Mutate the frame's method and param to reflect the next action.\n * 2. End with a call to runFrame.\n *\n * @private\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.runFrame_ = function() {\n if (!this.executionQueue_.isEmpty()) {\n try {\n if (this.delegate_) {\n this.runDelegateFrame_();\n } else {\n this.runGeneratorFrame_();\n }\n } catch (err) {\n this.rejectAndClose_(err);\n }\n }\n};\n\n/**\n * For safety, all branches should meet invariants listed in runFrame.\n *\n * @private\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.runGeneratorFrame_ = function() {\n var self = this;\n var frame = this.executionQueue_.first();\n try {\n var genRec = this.generator_[frame.method](frame.param);\n if (genRec.value instanceof $jscomp.AsyncGeneratorWrapper$ActionRecord) {\n switch (genRec.value.action) {\n case $jscomp.AsyncGeneratorWrapper$ActionEnum.YIELD_VALUE:\n Promise.resolve(genRec.value.value)\n .then(\n function(resolvedValue) {\n frame.resolve({value: resolvedValue, done: genRec.done});\n self.executionQueue_.drop();\n self.runFrame_();\n },\n function(e) {\n frame.reject(e);\n self.executionQueue_.drop();\n self.runFrame_();\n })\n .catch(this.boundRejectAndClose_);\n return;\n\n case $jscomp.AsyncGeneratorWrapper$ActionEnum.YIELD_STAR:\n self.delegate_ = $jscomp.makeAsyncIterator(genRec.value.value);\n frame.method = $jscomp.AsyncGeneratorWrapper$GeneratorMethod.NEXT;\n frame.param = undefined;\n self.runFrame_();\n return;\n\n case $jscomp.AsyncGeneratorWrapper$ActionEnum.AWAIT_VALUE:\n Promise.resolve(genRec.value.value)\n .then(\n function(resolvedValue) {\n frame.method =\n $jscomp.AsyncGeneratorWrapper$GeneratorMethod.NEXT;\n frame.param = resolvedValue;\n self.runFrame_();\n },\n function(thrownErr) {\n frame.method =\n $jscomp.AsyncGeneratorWrapper$GeneratorMethod.THROW;\n frame.param = thrownErr;\n self.runFrame_();\n })\n .catch(this.boundRejectAndClose_);\n return;\n\n default:\n throw new Error('Unrecognized AsyncGeneratorWrapper$ActionEnum');\n }\n }\n else {\n frame.resolve(genRec);\n self.executionQueue_.drop();\n self.runFrame_();\n }\n } catch (e) {\n frame.reject(e);\n self.executionQueue_.drop();\n self.runFrame_();\n }\n};\n\n\n/**\n * For safety, all branches should meet invariants listed in runFrame.\n *\n * @private\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.runDelegateFrame_ = function() {\n if (!this.delegate_) {\n throw new Error(\"no delegate to perform execution\");\n }\n var frame = this.executionQueue_.first();\n if (frame.method in this.delegate_) {\n try {\n this.delegate_[frame.method](frame.param)\n .then(this.boundHandleDelegateResult_, this.boundHandleDelegateError_)\n .catch(this.boundRejectAndClose_);\n } catch (err) {\n this.handleDelegateError_(err);\n }\n } else {\n this.delegate_ = null;\n this.runFrame_();\n }\n};\n\n/**\n * @param {!IIterableResult} record\n * @private\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.handleDelegateResult_ = function(\n record) {\n var frame = this.executionQueue_.first();\n if (record.done === true) {\n // Delegate is done. Its return value becomes the value of the `yield*`\n // expression. We must continue the async generator as if next() were called\n // with that value here.\n this.delegate_ = null;\n frame.method = $jscomp.AsyncGeneratorWrapper$GeneratorMethod.NEXT;\n frame.param = record.value;\n this.runFrame_();\n } else {\n frame.resolve({value: record.value, done: false});\n this.executionQueue_.drop();\n this.runFrame_();\n }\n};\n\n/**\n * @param {*} thrownError\n * @private\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncGeneratorWrapper.prototype.handleDelegateError_ = function(\n thrownError) {\n var frame = this.executionQueue_.first();\n // The delegate threw an exception or rejected a promise, so we must continue\n // our generator as if the `yield *` threw the exception.\n this.delegate_ = null;\n frame.method = $jscomp.AsyncGeneratorWrapper$GeneratorMethod.THROW;\n frame.param = thrownError;\n this.runFrame_();\n};\n\n/**\n * Rejects the current frame and closes the generator.\n *\n * @param {*} err Error causing the rejection\n * @private\n */\n$jscomp.AsyncGeneratorWrapper.prototype.rejectAndClose_ = function(err) {\n if (!this.executionQueue_.isEmpty()) {\n this.executionQueue_.first().reject(err);\n this.executionQueue_.drop();\n }\n\n if (this.delegate_ && 'return' in this.delegate_) {\n this.delegate_['return'](undefined);\n this.delegate_ = null;\n }\n this.generator_['return'](undefined);\n\n // Keep processing all frames remaining in the queue.\n // Note: Some of these frames might be throw requests, but our backing\n // generator will handle these appropriately.\n this.runFrame_();\n};\n","js/es6/conformance.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/global';\n\n\n/**\n * @fileoverview Check one of the most obscure features of ES6 as a proxy\n * for full conformance. If this is enabled, this test is used instead of\n * larger, more specific conformance tests.\n */\n\n/**\n * Check ES6 conformance by checking an obscure detail of Proxy that\n * wasn't implemented correctly until after all other ES6 features in\n * most browsers.\n * @return {boolean} Whether Proxy works correctly.\n * @suppress {reportUnknownTypes}\n */\n$jscomp.checkEs6ConformanceViaProxy = function() {\n try {\n var proxied = {};\n var proxy = Object.create(new $jscomp.global['Proxy'](proxied, {\n 'get': function (target, key, receiver) {\n return target == proxied && key == 'q' && receiver == proxy;\n }\n }));\n return proxy['q'] === true;\n } catch (err) {\n return false;\n }\n};\n\n/**\n * If this is true, assume that a runtime which implements Proxy also\n * implements the rest of the ECMAScript 2015 spec.\n * @define {boolean}\n */\n$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS = false;\n\n/**\n * Whether the runtime implements the entire ECMAScript 2015 spec.\n * @const {boolean}\n */\n$jscomp.ES6_CONFORMANCE =\n $jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS &&\n $jscomp.checkEs6ConformanceViaProxy();\n","js/es6/execute_async_generator.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Runtime logic for transpiled async functions.\n * @suppress {uselessCode}\n */\n'require base';\n'require es6/generator_engine';\n\n/**\n * Handles the execution of an async function.\n *\n * An async function, foo(a, b), will be rewritten as:\n *\n * ```\n * function foo(a, b) {\n * let $jscomp$async$this = this;\n * let $jscomp$async$arguments = arguments;\n * let $jscomp$async$super$get$x = () => super.x;\n * function* $jscomp$async$generator() {\n * // original body of foo() with:\n * // - await (x) replaced with yield (x)\n * // - arguments replaced with $jscomp$async$arguments\n * // - this replaced with $jscomp$async$this\n * // - super.x replaced with $jscomp$async$super$get$x()\n * // - super.x(5) replaced with $jscomp$async$super$get$x()\n * // .call($jscomp$async$this, 5)\n * }\n * return $jscomp.executeAsyncGenerator($jscomp$async$generator());\n * }\n * ```\n * @param {!Generator} generator\n * @return {!Promise}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.asyncExecutePromiseGenerator = function(generator) {\n function passValueToGenerator(value) {\n return generator.next(value);\n }\n\n function passErrorToGenerator(error) {\n return generator.throw(error);\n }\n\n return new Promise(function(resolve, reject) {\n function handleGeneratorRecord(/** !IIterableResult<*> */ genRec) {\n if (genRec.done) {\n resolve(genRec.value);\n } else {\n // One can await a non-promise, so genRec.value\n // might not already be a promise.\n Promise.resolve(genRec.value)\n .then(passValueToGenerator, passErrorToGenerator)\n .then(handleGeneratorRecord, reject);\n }\n }\n\n handleGeneratorRecord(generator.next());\n });\n};\n\n/**\n * Handles the execution of a generator function returning promises.\n *\n * An async function, foo(a, b), will be rewritten as:\n *\n * ```\n * function foo(a, b) {\n * let $jscomp$async$this = this;\n * let $jscomp$async$arguments = arguments;\n * let $jscomp$async$super$get$x = () => super.x;\n * return $jscomp.asyncExecutePromiseGeneratorFunction(\n * function* () {\n * // original body of foo() with:\n * // - await (x) replaced with yield (x)\n * // - arguments replaced with $jscomp$async$arguments\n * // - this replaced with $jscomp$async$this\n * // - super.x replaced with $jscomp$async$super$get$x()\n * // - super.x(5) replaced with $jscomp$async$super$get$x()\n * // .call($jscomp$async$this, 5)\n * });\n * }\n * ```\n * @param {function(): !Generator} generatorFunction\n * @return {!Promise}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.asyncExecutePromiseGeneratorFunction = function(generatorFunction) {\n return $jscomp.asyncExecutePromiseGenerator(generatorFunction());\n};\n\n/**\n * Handles the execution of a state machine program that represents transpiled\n * async function.\n *\n * @final\n * @param {function(!$jscomp.generator.Context): (void|{value: ?})} program\n * @return {!Promise}\n * @suppress {reportUnknownTypes, visibility}\n */\n$jscomp.asyncExecutePromiseGeneratorProgram = function(program) {\n return $jscomp.asyncExecutePromiseGenerator(\n new $jscomp.generator.Generator_(\n new $jscomp.generator.Engine_(\n program)));\n};\n","js/es6/generator_engine.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require base';\n'require es6/util/setprototypeof';\n'require es6/util/makeiterator';\n\n/**\n * @fileoverview Implementation for $jscomp.generator\n *\n * This closure-compiler internal JavaScript library provides an ES3-compatible\n * API for writing generator functions using a minimum of boilerplate.\n *\n * Example:\n * ```javascript\n * // yields numbers starting with the given value, then incrementing by the\n * // value supplied to the next() method until the computed value is <= min or\n * // >= max. Then it returns the total number of times it yielded.\n * // If the client code calls throw(), the error will be logged and then\n * // yielded, but the generator won't terminate.\n * function *es6Definition(start, min, max) {\n * let currentValue = start;\n * let yieldCount = 0;\n * while (currentValue > min && currentValue < max) {\n * try {\n * currentValue += yield(currentValue);\n * } catch (e) {\n * yield(e);\n * console.log('client threw error', e);\n * } finally {\n * yieldCount++;\n * }\n * }\n * return [yieldCount, currentValue];\n * }\n *\n * function es3Definition(start, min, max) {\n * var currentValue;\n * var yieldCount;\n * var e;\n *\n * return $jscomp.generator.createGenerator(\n * es3Definition,\n * function (context$) {\n * switch (context$.nextAddress) {\n * case 1: // execution always starts with 1\n * currentValue = start;\n * yieldCount = 0;\n * // fall-through\n *\n * case 2:\n * if (!(currentValue > min && currentValue < max)) {\n * // exit while loop:\n * return context$.jumpTo(3);\n * }\n * // try {\n * JSCompiler_temp_const$jscomp$1 = currentValue;\n * context$.setCatchFinallyBlocks(4, 5);\n * return context$.yield(currentValue, 7);\n *\n * case 7:\n * currentValue =\n * JSCompiler_temp_const$jscomp$1 + context$.yieldResult;\n * // fall-through: execute finally block\n *\n * case 5: // finally block start\n * context$.enterFinallyBlock();\n * yieldCount++;\n * return context$.leaveFinallyBlock(6);\n *\n * case 4: // catch block start\n * e = context$.enterCatchBlock();\n * return context$.yield(e, 8);\n *\n * case 8: // finish catch block\n * console.log('client threw error', e);\n * return context$.jumpTo(5);\n *\n * case 6:\n * context$.jumpTo(2);\n * break;\n *\n * case 3:\n * // come back here when while loop block exits\n * return context$.return([yieldCount, currentValue]);\n * }\n * }\n * });\n * };\n * ```\n */\n\n/** @const */\n$jscomp.generator = {};\n\n/**\n * Ensures that the iterator result is actually an object.\n *\n * @private\n * @final\n * @param {*} result\n * @return {void}\n * @throws {TypeError} if the result is not an instenace of Object.\n */\n$jscomp.generator.ensureIteratorResultIsObject_ = function(result) {\n if (result instanceof Object) {\n return;\n }\n throw new TypeError('Iterator result ' + result + ' is not an object');\n};\n\n\n/**\n * Tracks state machine state used by generator.Engine.\n *\n * @template VALUE\n * @constructor\n * @final\n * @struct\n */\n$jscomp.generator.Context = function() {\n /**\n * Whether the generator program is being executed at the moment in the\n * current context. Is used to prevent reentrancy.\n *\n * @private\n * @type {boolean}\n */\n this.isRunning_ = false;\n\n /**\n * An iterator that should yield all its values before the main program can\n * continue.\n *\n * @private\n * @type {?Iterator}\n */\n this.yieldAllIterator_ = null;\n\n /**\n * The value that will be sent to the program as the result of suspended\n * yield expression.\n *\n * @type {?}\n */\n this.yieldResult = undefined;\n\n /**\n * The next address where the state machine execution should be resumed.\n *\n *

Program execution starts at 1 and ends at 0.\n *\n * @type {number}\n */\n this.nextAddress = 1;\n\n /**\n * The address that should be executed once an exception is thrown.\n *\n *

Value of 0 means no catch block exist that would handles an exception.\n *\n * @private\n * @type {number}\n */\n this.catchAddress_ = 0;\n\n /**\n * The address that should be executed once the result is being returned\n * or if the exception is thrown and there is no catchAddress specified.\n *\n *

Value of 0 means no finally block is set.\n *\n * @private\n * @type {number}\n */\n this.finallyAddress_ = 0;\n\n /**\n * Stores information for the runtime propagation of values and control\n * flow such as the behaviour of statements (break, continue, return and\n * throw) that perform nonlocal transfers of control.\n *\n * @private\n * @type {null|{return: VALUE}|{exception, isException: boolean}|{jumpTo: number}}.\n */\n this.abruptCompletion_ = null;\n\n /**\n * The preserved abruptCompletion_ when entering a `finally` block. If\n * the `finally` block completes normally the preserved abruptCompletion_ is\n * restored:\n *

\n   * try {\n   * } finally {  // nesting level 0\n   *   // abruptCompletion_ is saved in finallyContexts_[0]\n   *   try {\n   *   } finally {  // nesting level 1\n   *     // abruptCompletion_ is saved in finallyContexts_[1]\n   *     ...\n   *     // abruptCompletion_ is restored from finallyContexts_[1]\n   *   }\n   *   // abruptCompletion_ is restored from finallyContexts_[0]\n   * }\n   * 
\n   *\n   * @private\n   * @type {?Array}.\n   */\n  this.finallyContexts_ = null;\n};\n\n/**\n * Marks generator program as being run.\n *\n * @private\n * @final\n * @return {void}\n * @throws {TypeError} if generator is already running.\n */\n$jscomp.generator.Context.prototype.start_ = function() {\n  if (this.isRunning_) {\n    throw new TypeError('Generator is already running');\n  }\n  this.isRunning_ = true;\n};\n\n/**\n *\n *\n * @private\n * @final\n * @return {void}\n */\n$jscomp.generator.Context.prototype.stop_ = function() {\n  this.isRunning_ = false;\n};\n\n/**\n * Transfers program execution to an appropriate catch/finally block that\n * should be executed if exception occurs.\n *\n * @private\n * @final\n * @return {void}\n */\n$jscomp.generator.Context.prototype.jumpToErrorHandler_ = function() {\n  this.nextAddress = this.catchAddress_ || this.finallyAddress_;\n};\n\n/**\n * Sets the result of suspended yield expression.\n *\n * @private\n * @final\n * @param {?=} value The value to send to the generator.\n * @return {void}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.next_ = function(value) {\n  this.yieldResult = value;\n};\n\n/**\n * Throws exception as the result of suspended yield.\n *\n * @private\n * @final\n * @param {?} e\n * @return {void}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.throw_ = function(e) {\n  this.abruptCompletion_ = {exception: e, isException: true};\n  this.jumpToErrorHandler_();\n};\n\n/**\n * Returns a value as the result of generator function.\n *\n * @final\n * @param {VALUE=} value\n * @return {void}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.return = function(value) {\n  this.abruptCompletion_ = {return: /** @type {VALUE} */ (value)};\n  this.nextAddress = this.finallyAddress_;\n};\n\n/**\n * Changes the context so the program execution will continue from the given\n * state after executing nessesary pending finally blocks first.\n *\n * @final\n * @param {number} nextAddress The state that should be run.\n * @return {void}\n */\n$jscomp.generator.Context.prototype.jumpThroughFinallyBlocks = function(\n    nextAddress) {\n  this.abruptCompletion_ = {jumpTo: nextAddress};\n  this.nextAddress = this.finallyAddress_;\n};\n\n/**\n * Pauses the state machine program assosiated with generator function to yield\n * a value.\n *\n * @final\n * @param {VALUE} value The value to return from the generator function via\n *     the iterator protocol.\n * @param {number} resumeAddress The address where the program should resume.\n * @return {{value: VALUE}}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.yield = function(value, resumeAddress) {\n  this.nextAddress = resumeAddress;\n  return {value: value};\n};\n\n/**\n * Causes the state machine program to yield all values from an iterator.\n *\n * @final\n * @param {string|!Iterator|!Iterable|!Arguments} iterable\n *     Iterator to yeild all values from.\n * @param {number} resumeAddress The address where the program should resume.\n * @return {void | {value: VALUE}}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.yieldAll = function(\n    iterable, resumeAddress) {\n  /** @const @type {!Iterator} */ var iterator =\n      $jscomp.makeIterator(iterable);\n  /** @const */ var result = iterator.next();\n  $jscomp.generator.ensureIteratorResultIsObject_(result);\n  if (result.done) {\n    // If `someGenerator` in `x = yield *someGenerator` completes immediately,\n    // x is the return value of that generator.\n    this.yieldResult = result.value;\n    this.nextAddress = resumeAddress;\n    return;\n  }\n  this.yieldAllIterator_ = iterator;\n  return this.yield(result.value, resumeAddress);\n};\n\n/**\n * Changes the context so the program execution will continue from the given\n * state.\n *\n * @final\n * @param {number} nextAddress The state the program should continue\n * @return {void}\n */\n$jscomp.generator.Context.prototype.jumpTo = function(nextAddress) {\n  this.nextAddress = nextAddress;\n};\n\n/**\n * Changes the context so the program execution ends.\n *\n * @final\n * @return {void}\n */\n$jscomp.generator.Context.prototype.jumpToEnd = function() {\n  this.nextAddress = 0;\n};\n\n/**\n * Sets catch / finally handlers.\n * Used for try statements with catch blocks.\n *\n * @final\n * @param {number} catchAddress The address of the catch block.\n * @param {number=} finallyAddress The address of the finally block.\n * @return {void}\n */\n$jscomp.generator.Context.prototype.setCatchFinallyBlocks = function(\n    catchAddress, finallyAddress) {\n  this.catchAddress_ = catchAddress;\n  if (finallyAddress != undefined) {\n    this.finallyAddress_ = finallyAddress;\n  }\n};\n\n/**\n * Sets finally handler.\n * Used for try statements without catch blocks.\n *\n * @const\n * @param {number=} finallyAddress The address of the finally block or 0.\n * @return {void}\n */\n$jscomp.generator.Context.prototype.setFinallyBlock = function(finallyAddress) {\n  this.catchAddress_ = 0;\n  this.finallyAddress_ = finallyAddress || 0;\n};\n\n/**\n * Sets a catch handler and jumps to the next address.\n * Used for try statements without finally blocks.\n *\n * @final\n * @param {number} nextAddress The state that should be run next.\n * @param {number=} catchAddress The address of the catch block or 0.\n * @return {void}\n */\n$jscomp.generator.Context.prototype.leaveTryBlock = function(\n    nextAddress, catchAddress) {\n  this.nextAddress = nextAddress;\n  this.catchAddress_ = catchAddress || 0;\n};\n\n/**\n * Initializes exception variable in the beginning of catch block.\n *\n * @final\n * @param {number=} nextCatchBlockAddress The address of the next catch block\n *     that is preceded by no finally blocks.\n * @return {?} Returns an exception that was thrown from \"try\" block.\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.enterCatchBlock = function(\n    nextCatchBlockAddress) {\n  this.catchAddress_ = nextCatchBlockAddress || 0;\n  /** @const */ var exception =\n      /** @type {{exception, isException: boolean}} */ (this.abruptCompletion_)\n          .exception;\n  this.abruptCompletion_ = null;\n  return exception;\n};\n\n/**\n * Saves the current throw context which will be restored at the end of finally\n * block.\n *\n * @final\n * @param {number=} nextCatchAddress\n * @param {number=} nextFinallyAddress\n * @param {number=} finallyDepth The nesting level of current \"finally\" block.\n * @return {void}\n */\n$jscomp.generator.Context.prototype.enterFinallyBlock = function(\n    nextCatchAddress, nextFinallyAddress, finallyDepth) {\n  if (!finallyDepth) {\n    this.finallyContexts_ = [this.abruptCompletion_];\n  } else {\n    /**\n     * @type {!Array}\n     */\n    (this.finallyContexts_)[finallyDepth] = this.abruptCompletion_;\n  }\n  this.catchAddress_ = nextCatchAddress || 0;\n  this.finallyAddress_ = nextFinallyAddress || 0;\n};\n\n/**\n * Figures out whether the program execution should continue normally, or jump\n * to the closest catch/finally block.\n *\n * @final\n * @param {number} nextAddress The state that should be run next.\n * @param {number=} finallyDepth The nesting level of current \"finally\" block.\n * @return {void}\n * @suppress {strictMissingProperties}\n */\n$jscomp.generator.Context.prototype.leaveFinallyBlock = function(\n    nextAddress, finallyDepth) {\n  // There could be trailing finally contexts if a nested finally throws an\n  // exception or return.\n  // e.g.\n  // try {\n  //   ...\n  //   return 1;\n  // } finally {\n  //   // finallyDepth == 0\n  //   // finallyContext == [{return: 1}]\n  //   try {\n  //     ...\n  //     try {\n  //       throw new Error(2);\n  //     } finally {\n  //       // finallyDepth == 1\n  //       // finallyContext == [{return: 1}, {exception: Error(2)}]\n  //       try {\n  //         throw new Error(3);\n  //       } finally {\n  //         // finallyDepth == 2\n  //         // finallyContext == [\n  //         //     {return: 1},\n  //         //     {exception: Error(2)},\n  //         //     {exception: Error(3)}\n  //         // ]\n  //         throw new Error(4); // gets written in abruptCompletion_\n  //         // leaveFinallyBlock() never gets called here\n  //       }\n  //       // leaveFinallyBlock() never gets called here\n  //     }\n  //   } catch (e) {\n  //      // swallow error\n  //      // abruptCompletion becomes null\n  //   } finally {\n  //     // finallyDepth == 1\n  //     // finallyContext == [\n  //     //     {return: 1},\n  //     //     null, // overwritten, because catch swallowed the error\n  //     //     {exception: Error(3)}  // left over\n  //     // ]\n  //     // leaveFinallyBlock() called here\n  //     // finallyContext == [{return: 1}]\n  //     // abruptCompletion == null\n  //   }\n  //   // leaveFinallyBlock() called here\n  //   // finallyContext = []\n  //   // abruptCompletion == {return: 1};\n  // }\n  /** @const */ var preservedContext =\n      /**\n       * @type {!Array}\n       */\n      (this.finallyContexts_).splice(finallyDepth || 0)[0];\n  /** @const */ var abruptCompletion = this.abruptCompletion_ =\n      this.abruptCompletion_ || preservedContext;\n  if (abruptCompletion) {\n    if (abruptCompletion.isException) {\n      return this.jumpToErrorHandler_();\n    }\n    // Check if there is a pending break/continue jump that is not preceded by\n    // finally blocks that should be executed before.\n    // We always generate case numbers for the start and end of loops before\n    // numbers for anything they contain, so any finally blocks within will be\n    // guaranteed to have higher addresses than the loop break and continue\n    // positions.\n    // e.g.\n    // l1: while (...) {            // generated addresses: 100: break l1;\n    //       try {                  // generated addresses: 101: finally,\n    //         try {                // generated addresses: 102: finally,\n    //           l2: while (...) {  // generated addresses: 103: break l2;\n    //\n    //                 if (...) {\n    //                   break l1;  // becomes\n    //                              // $context.jumpThroughFinallyBlocks(101),\n    //                              // since 2 finally blocks must be crossed\n    //                 }\n    //                 break l2;    // becomes $context.jumpTo(103)\n    //               }\n    //         } finally {\n    //           // When leaving this finally block:\n    //           // 1. We keep the abrupt completion indicating 'break l1'\n    //           // 2. We jump to the enclosing finally block.\n    //         }\n    //       } finally {\n    //         // When leaving this finally block:\n    //         // 1. We complete the abruptCompletion indicating 'break l1' by\n    //         //   jumping to the loop start address.\n    //         // 2. Abrupt completion is now null, so normal execution\n    //         //   continues from there.\n    //       }\n    //     }\n    if (abruptCompletion.jumpTo != undefined &&\n        this.finallyAddress_ < abruptCompletion.jumpTo) {\n      this.nextAddress = abruptCompletion.jumpTo;\n      this.abruptCompletion_ = null;\n    } else {\n      this.nextAddress = this.finallyAddress_;\n    }\n  } else {\n    this.nextAddress = nextAddress;\n  }\n};\n\n/**\n * Is used in transpilation of `for in` statements.\n *\n * 

for (var i in obj) {...} becomes:\n *

\n * for (var i, $for$in = context$.forIn(obj);\n *      (i = $for$in.getNext()) != null;\n *      ) {\n *   ...\n * }\n * 
\n *\n * @final\n * @param {?} object\n * @return {!$jscomp.generator.Context.PropertyIterator}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.prototype.forIn = function(object) {\n return new $jscomp.generator.Context.PropertyIterator(object);\n};\n\n/**\n * @constructor\n * @final\n * @struct\n * @param {?} object\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.PropertyIterator = function(object) {\n /**\n * @private\n * @const\n * @type {?}\n */\n this.object_ = object;\n\n /**\n * @private\n * @const\n * @type {!Array}\n */\n this.properties_ = [];\n\n for (var property in /** @type {!Object} */ (object)) {\n this.properties_.push(property);\n }\n this.properties_.reverse();\n};\n\n/**\n * Returns the next object's property that is still valid.\n *\n * @final\n * @return {?string}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Context.PropertyIterator.prototype.getNext = function() {\n // The JS spec does not require that properties added after the loop begins\n // be included in the loop, but it does require that the current property\n // must still exist on the object when the loop iteration starts.\n while (this.properties_.length > 0) {\n /** @const */ var property = this.properties_.pop();\n if (property in /** @type {!Object} */ (this.object_)) {\n return property;\n }\n }\n return null;\n};\n\n/**\n * Engine handling execution of a state machine associated with the generator\n * program and its context.\n *\n * @private\n * @template VALUE\n * @constructor\n * @final\n * @struct\n * @param {function(!$jscomp.generator.Context): (void|{value: VALUE})} program\n */\n$jscomp.generator.Engine_ = function(program) {\n /**\n * @private\n * @const\n * @type {!$jscomp.generator.Context}\n */\n this.context_ = new $jscomp.generator.Context();\n\n /**\n * @private\n * @const\n * @type {function(!$jscomp.generator.Context): (void|{value: VALUE})}\n */\n this.program_ = program;\n};\n\n/**\n * Returns an object with two properties done and value.\n * You can also provide a parameter to the next method to send a value to the\n * generator.\n *\n * @private\n * @final\n * @param {?=} value The value to send to the generator.\n * @return {!IIterableResult}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Engine_.prototype.next_ = function(value) {\n this.context_.start_();\n if (this.context_.yieldAllIterator_) {\n return this.yieldAllStep_(\n this.context_.yieldAllIterator_.next, value, this.context_.next_);\n }\n this.context_.next_(value);\n return this.nextStep_();\n};\n\n/**\n * Attempts to finish the generator with a given value.\n *\n * @private\n * @final\n * @param {VALUE} value The value to return.\n * @return {!IIterableResult}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Engine_.prototype.return_ = function(value) {\n this.context_.start_();\n /** @const */ var yieldAllIterator = this.context_.yieldAllIterator_;\n if (yieldAllIterator) {\n /** @const @type {function(VALUE): !IIterableResult} */ var\n returnFunction =\n 'return' in yieldAllIterator ? yieldAllIterator['return'] :\n function(v) {\n return {value: v, done: true};\n };\n return this.yieldAllStep_(returnFunction, value, this.context_.return);\n }\n this.context_.return(value);\n return this.nextStep_();\n};\n\n/**\n * Resumes the execution of a generator by throwing an error into it and\n * returns an object with two properties done and value.\n *\n * @private\n * @final\n * @param {?} exception The exception to throw.\n * @return {!IIterableResult}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Engine_.prototype.throw_ = function(exception) {\n this.context_.start_();\n if (this.context_.yieldAllIterator_) {\n return this.yieldAllStep_(\n this.context_.yieldAllIterator_['throw'], exception,\n this.context_.next_);\n }\n this.context_.throw_(exception);\n return this.nextStep_();\n};\n\n/**\n * Redirects next/throw/return method calls to an iterator passed to \"yield *\".\n *\n * @private\n * @final\n * @template T\n * @param {function(this:Iterator, T): !IIterableResult} action\n * @param {T} value\n * @param {function(this:$jscomp.generator.Context, VALUE): void} nextAction\n * @return {!IIterableResult}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Engine_.prototype.yieldAllStep_ = function(\n action, value, nextAction) {\n try {\n /** @const */ var result = action.call(\n /** @type {!Iterator} */ (this.context_.yieldAllIterator_),\n value);\n $jscomp.generator.ensureIteratorResultIsObject_(result);\n if (!result.done) {\n this.context_.stop_();\n return result;\n }\n // After `x = yield *someGenerator()` x is the return value of the\n // generator, not a value passed to this generator by the next() method.\n /** @const */ var resultValue = result.value;\n } catch (e) {\n this.context_.yieldAllIterator_ = null;\n this.context_.throw_(e);\n return this.nextStep_();\n }\n this.context_.yieldAllIterator_ = null;\n nextAction.call(this.context_, resultValue);\n return this.nextStep_();\n};\n\n/**\n * Continues/resumes program execution until the next suspension point (yield).\n *\n * @private\n * @final\n * @return {!IIterableResult}\n * @suppress {reportUnknownTypes, strictMissingProperties}\n */\n$jscomp.generator.Engine_.prototype.nextStep_ = function() {\n while (this.context_.nextAddress) {\n try {\n /** @const */ var yieldValue = this.program_(this.context_);\n if (yieldValue) {\n this.context_.stop_();\n return {value: yieldValue.value, done: false};\n }\n } catch (e) {\n this.context_.yieldResult = undefined;\n this.context_.throw_(e);\n }\n }\n\n this.context_.stop_();\n if (this.context_.abruptCompletion_) {\n /** @const */ var abruptCompletion = this.context_.abruptCompletion_;\n this.context_.abruptCompletion_ = null;\n if (abruptCompletion.isException) {\n throw abruptCompletion.exception;\n }\n return {value: abruptCompletion.return, done: true};\n }\n return {value: /** @type {?} */ (undefined), done: true};\n};\n\n/**\n * The Generator object that is returned by a generator function and it\n * conforms to both the iterable protocol and the iterator protocol.\n *\n * @private\n * @template VALUE\n * @constructor\n * @final\n * @implements {Generator}\n * @param {!$jscomp.generator.Engine_} engine\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.Generator_ = function(engine) {\n /** @const @override */\n this.next = function(opt_value) {\n return engine.next_(opt_value);\n };\n\n /** @const @override */\n this.throw = function(exception) {\n return engine.throw_(exception);\n };\n\n /** @const @override */\n this.return = function(value) {\n return engine.return_(value);\n };\n\n /** @this {$jscomp.generator.Generator_} */\n this[Symbol.iterator] = function() {\n return this;\n };\n\n // TODO(skill): uncomment once Symbol.toStringTag is polyfilled:\n // this[Symbol.toStringTag] = 'Generator';\n};\n\n/**\n * Creates a generator backed up by Engine running a given program.\n *\n * @final\n * @template VALUE\n * @param {function(this:?, ...): (!Iterator|!Iterable)} generator\n * @param {function(!$jscomp.generator.Context): (void|{value: VALUE})} program\n * @return {!Generator}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.generator.createGenerator = function(generator, program) {\n /** @const */ var result =\n new $jscomp.generator.Generator_(new $jscomp.generator.Engine_(program));\n // The spec says that `myGenFunc() instanceof myGenFunc` must be true.\n // We'll make this work by setting the prototype before calling the\n // constructor every time. All of the methods of the object are defined on the\n // instance by the constructor, so this does no harm.\n // We also cast Generator_ to Object to hide dynamic inheritance from\n // jscompiler, it makes ConformanceRules$BanUnknownThis happy.\n // In some transpiled cases there may not be an explicit prototype, in which\n // case we skip this step.\n if ($jscomp.setPrototypeOf && generator.prototype) {\n /** @type {function(!Object, ?Object): !Object} */ ($jscomp.setPrototypeOf)(\n result, generator.prototype);\n }\n return result;\n};\n","js/es6/globalthis.js":"/*\n * Copyright 2019 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n'require util/global';\n\n$jscomp.polyfill('globalThis', function(orig) {\n return orig || $jscomp.global;\n}, 'es_2020', 'es3');\n","js/es6/map.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/conformance';\n'require es6/symbol';\n'require es6/util/makeiterator';\n'require es6/weakmap';\n'require util/defines';\n'require util/owns';\n'require util/polyfill';\n\n\n/**\n * Internal record type for entries.\n * @record\n * @template KEY, VALUE\n * @suppress {reportUnknownTypes}\n */\n$jscomp.MapEntry = function() {\n /** @type {!$jscomp.MapEntry} */\n this.previous;\n /** @type {!$jscomp.MapEntry} */\n this.next;\n /** @type {?Object} */\n this.head;\n /** @type {KEY} */\n this.key;\n /** @type {VALUE} */\n this.value;\n};\n\n\n$jscomp.polyfill('Map',\n /**\n * @param {*} NativeMap\n * @return {*}\n * @suppress {reportUnknownTypes}\n */\n function(NativeMap) {\n\n /**\n * Checks conformance of the existing Map.\n * @return {boolean} True if the browser's implementation conforms.\n * @suppress {missingProperties} \"entries\" unknown prototype\n */\n function isConformant() {\n if ($jscomp.ASSUME_NO_NATIVE_MAP ||\n !NativeMap ||\n typeof NativeMap != \"function\" ||\n !NativeMap.prototype.entries ||\n typeof Object.seal != 'function') {\n return false;\n }\n // Some implementations don't support constructor arguments.\n try {\n NativeMap = /** @type {function(new: Map, !Iterator=)} */ (NativeMap);\n var key = Object.seal({x: 4});\n var map = new NativeMap($jscomp.makeIterator([[key, 's']]));\n if (map.get(key) != 's' || map.size != 1 || map.get({x: 4}) ||\n map.set({x: 4}, 't') != map || map.size != 2) {\n return false;\n }\n var /** !Iterator */ iter = map.entries();\n var item = iter.next();\n if (item.done || item.value[0] != key || item.value[1] != 's') {\n return false;\n }\n item = iter.next();\n if (item.done || item.value[0].x != 4 ||\n item.value[1] != 't' || !iter.next().done) {\n return false;\n }\n return true;\n } catch (err) { // This should hopefully never happen, but let's be safe.\n return false;\n }\n }\n\n if ($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS) {\n if (NativeMap && $jscomp.ES6_CONFORMANCE) return NativeMap;\n } else {\n if (isConformant()) return NativeMap;\n }\n\n /** @const {!WeakMap} */\n var idMap = new WeakMap();\n\n\n /**\n * Polyfill for the global Map data type.\n * @constructor\n * @struct\n * @extends {Map}\n * @implements {Iterable>}\n * @template KEY, VALUE\n * @param {!Iterable>|!Array>|null=}\n * opt_iterable Optional data to populate the map.\n */\n // TODO(sdh): fix param type if heterogeneous arrays ever supported.\n var PolyfillMap = function(opt_iterable) {\n /** @private {!Object>>} */\n this.data_ = {};\n\n /** @private {!$jscomp.MapEntry} */\n this.head_ = createHead();\n\n // Note: this property should not be changed. If we're willing to give up\n // ES3 support, we could define it as a property directly. It should be\n // marked readonly if such an annotation ever comes into existence.\n /** @type {number} */\n this.size = 0;\n\n if (opt_iterable) {\n var iter = $jscomp.makeIterator(opt_iterable);\n var entry;\n while (!(entry = iter.next()).done) {\n var item =\n /** @type {!IIterableResult>} */ (entry).value;\n this.set(/** @type {KEY} */ (item[0]), /** @type {VALUE} */ (item[1]));\n }\n }\n };\n\n\n /** @override */\n PolyfillMap.prototype.set = function(key, value) {\n // normalize -0/+0 to +0\n key = key === 0 ? 0 : key;\n var r = maybeGetEntry(this, key);\n if (!r.list) {\n r.list = (this.data_[r.id] = []);\n }\n if (!r.entry) {\n r.entry = {\n next: this.head_,\n previous: this.head_.previous,\n head: this.head_,\n key: key,\n value: value,\n };\n r.list.push(r.entry);\n this.head_.previous.next = r.entry;\n this.head_.previous = r.entry;\n this.size++;\n } else {\n r.entry.value = value;\n }\n return this;\n };\n\n\n /** @override */\n PolyfillMap.prototype.delete = function(key) {\n var r = maybeGetEntry(this, key);\n if (r.entry && r.list) {\n r.list.splice(r.index, 1);\n if (!r.list.length) delete this.data_[r.id];\n r.entry.previous.next = r.entry.next;\n r.entry.next.previous = r.entry.previous;\n r.entry.head = null;\n this.size--;\n return true;\n }\n return false;\n };\n\n\n /** @override */\n PolyfillMap.prototype.clear = function() {\n this.data_ = {};\n this.head_ = this.head_.previous = createHead();\n this.size = 0;\n };\n\n\n /** @override */\n PolyfillMap.prototype.has = function(key) {\n return !!(maybeGetEntry(this, key).entry);\n };\n\n\n /** @override */\n PolyfillMap.prototype.get = function(key) {\n var entry = maybeGetEntry(this, key).entry;\n // NOTE: this cast is a lie, but so is the extern.\n return /** @type {VALUE} */ (entry &&\n /** @type {VALUE} */ (entry.value));\n };\n\n\n /** @override */\n PolyfillMap.prototype.entries = function() {\n return makeIterator(this, /** @return {!Array<(KEY|VALUE)>} */ function(\n /** !$jscomp.MapEntry */ entry) {\n return ([entry.key, entry.value]);\n });\n };\n\n\n /** @override */\n PolyfillMap.prototype.keys = function() {\n return makeIterator(this, /** @return {KEY} */ function(\n /** !$jscomp.MapEntry */ entry) {\n return entry.key;\n });\n };\n\n\n /** @override */\n PolyfillMap.prototype.values = function() {\n return makeIterator(this, /** @return {VALUE} */ function(\n /** !$jscomp.MapEntry */ entry) {\n return entry.value;\n });\n };\n\n\n /** @override */\n PolyfillMap.prototype.forEach = function(callback, opt_thisArg) {\n var iter = this.entries();\n var item;\n while (!(item = iter.next()).done) {\n var entry = item.value;\n callback.call(\n /** @type {?} */ (opt_thisArg),\n /** @type {VALUE} */ (entry[1]),\n /** @type {KEY} */ (entry[0]),\n this);\n }\n };\n\n\n /** @type {?} */ (PolyfillMap.prototype)[Symbol.iterator] =\n PolyfillMap.prototype.entries;\n\n\n /**\n * Returns an entry or undefined.\n * @param {!PolyfillMap} map\n * @param {KEY} key\n * @return {{id: string,\n * list: (!Array>|undefined),\n * index: number,\n * entry: (!$jscomp.MapEntry|undefined)}}\n * @template KEY, VALUE\n */\n var maybeGetEntry = function(map, key) {\n var id = getId(key);\n var list = map.data_[id];\n if (list && $jscomp.owns(map.data_, id)) {\n for (var index = 0; index < list.length; index++) {\n var entry = list[index];\n if ((key !== key && entry.key !== entry.key) || key === entry.key) {\n return {id: id, list: list, index: index, entry: entry};\n }\n }\n }\n return {id: id, list: list, index: -1, entry: undefined};\n };\n\n\n /**\n * Maps over the entries with the given function.\n * @param {!PolyfillMap} map\n * @param {function(!$jscomp.MapEntry): T} func\n * @return {!IteratorIterable}\n * @template KEY, VALUE, T\n * @private\n */\n var makeIterator = function(map, func) {\n var entry = map.head_;\n return $jscomp.iteratorPrototype(function() {\n if (entry) {\n while (entry.head != map.head_) {\n entry = entry.previous;\n }\n while (entry.next != entry.head) {\n entry = entry.next;\n return {done: false, value: func(entry)};\n }\n entry = null; // make sure depletion is permanent\n }\n return {done: true, value: void 0};\n });\n };\n\n\n /**\n * Makes a new \"head\" element.\n * @return {!$jscomp.MapEntry}\n * @template KEY, VALUE\n * @suppress {checkTypes} ignore missing key/value for head only\n */\n var createHead = function() {\n var head = /** type {!$jscomp.MapEntry} */ ({});\n head.previous = head.next = head.head = head;\n return head;\n };\n\n\n /**\n * Counter for generating IDs.\n * @private {number}\n */\n var mapIndex = 0;\n\n\n /**\n * @param {*} obj An extensible object.\n * @return {string} A unique ID.\n */\n var getId = function(obj) {\n var type = obj && typeof obj;\n if (type == 'object' || type == 'function') {\n obj = /** @type {!Object} */ (obj);\n if (!idMap.has(obj)) {\n var id = '' + (++mapIndex);\n idMap.set(obj, id);\n return id;\n }\n return idMap.get(obj);\n }\n // Add a prefix since obj could be '__proto__';\n return 'p_' + obj;\n };\n\n\n return PolyfillMap;\n}, 'es6', 'es3');\n","js/es6/math.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Brings in all ES6 Math polyfills.\n * @suppress {uselessCode}\n */\n'require es6/math/acosh';\n'require es6/math/asinh';\n'require es6/math/atanh';\n'require es6/math/cbrt';\n'require es6/math/clz32';\n'require es6/math/cosh';\n'require es6/math/expm1';\n'require es6/math/fround';\n'require es6/math/hypot';\n'require es6/math/imul';\n'require es6/math/log10';\n'require es6/math/log1p';\n'require es6/math/log2';\n'require es6/math/sign';\n'require es6/math/sinh';\n'require es6/math/tanh';\n'require es6/math/trunc';\n","js/es6/math/acosh.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.acosh', function(orig) {\n if (orig) return orig;\n\n /**\n * Computes the inverse hyperbolic cosine.\n *\n *

Polyfills the static function Math.acosh().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The inverse hyperbolic cosine of x.\n */\n var polyfill = function(x) {\n x = Number(x);\n return Math.log(x + Math.sqrt(x * x - 1));\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/asinh.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.asinh', function(orig) {\n if (orig) return orig;\n\n /**\n * Computes the inverse hyperbolic sine.\n *\n *

Polyfills the static function Math.asinh().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The inverse hyperbolic sine of x.\n */\n var polyfill = function(x) {\n x = Number(x);\n if (x === 0) return x;\n var y = Math.log(Math.abs(x) + Math.sqrt(x * x + 1));\n return x < 0 ? -y : y;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/atanh.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/math/log1p';\n\n$jscomp.polyfill('Math.atanh', function(orig) {\n if (orig) return orig;\n var log1p = Math.log1p;\n\n /**\n * Computes the inverse hyperbolic tangent.\n *\n *

Polyfills the static function Math.atanh().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The inverse hyperbolic tangent +x.\n */\n var polyfill = function(x) {\n x = Number(x);\n return (log1p(x) - log1p(-x)) / 2;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/cbrt.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.cbrt', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the cube root of the number, handling negatives safely.\n *\n *

Polyfills the static function Math.cbrt().\n *\n * @param {number} x Any number, or value that can be coerced into a number.\n * @return {number} The cube root of x.\n */\n var polyfill = function(x) {\n if (x === 0) return x;\n x = Number(x);\n var y = Math.pow(Math.abs(x), 1 / 3);\n return x < 0 ? -y : y;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/clz32.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.clz32', function(orig) {\n if (orig) return orig;\n\n /**\n * Counts the leading zeros in the 32-bit binary representation.\n *\n *

Polyfills the static function Math.clz32().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The number of leading zero bits.\n */\n var polyfill = function(x) {\n // This binary search algorithm is taken from v8.\n x = Number(x) >>> 0; // first ensure we have a 32-bit unsigned integer.\n if (x === 0) return 32;\n var result = 0;\n if ((x & 0xFFFF0000) === 0) {\n x <<= 16;\n result += 16;\n }\n if ((x & 0xFF000000) === 0) {\n x <<= 8;\n result += 8;\n }\n if ((x & 0xF0000000) === 0) {\n x <<= 4;\n result += 4;\n }\n if ((x & 0xC0000000) === 0) {\n x <<= 2;\n result += 2;\n }\n if ((x & 0x80000000) === 0) result++;\n return result;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/cosh.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.cosh', function(orig) {\n if (orig) return orig;\n var exp = Math.exp;\n\n /**\n * Computes the hyperbolic cosine.\n *\n *

Polyfills the static function Math.cosh().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The hyperbolic cosine of x.\n */\n var polyfill = function(x) {\n x = Number(x);\n return (exp(x) + exp(-x)) / 2;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/expm1.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Implements Math.expm1 polyfill\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n\n$jscomp.polyfill('Math.expm1', function(orig) {\n if (orig) return orig;\n\n /**\n * Exponentiates x and then subtracts one. This is implemented in a\n * way that is accurate for numbers close to zero.\n *\n *

Polyfills the static function Math.expm1().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The exponential of x, less 1.\n */\n var polyfill = function(x) {\n // This implementation is based on the Taylor expansion\n // exp(x) ~ 1 + x + x^2/2 + x^3/6 + x^4/24 + ...\n x = Number(x);\n if (x < .25 && x > -.25) {\n var y = x;\n var d = 1;\n var z = x;\n var zPrev = 0;\n while (zPrev != z) {\n y *= x / (++d);\n z = (zPrev = z) + y;\n }\n return z;\n }\n return Math.exp(x) - 1;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/fround.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require util/defines';\n\n$jscomp.polyfill('Math.fround', function(orig) {\n if (orig) return orig;\n\n if ($jscomp.SIMPLE_FROUND_POLYFILL || typeof Float32Array !== 'function') {\n // Explicitly requested a no-op polyfill, or Float32Array not available.\n return /** @return {number} */ function(/** number */ arg) {\n return arg;\n };\n }\n\n var arr = new Float32Array(1);\n /**\n * Rounds the given double-precision number to single-precision (float32).\n *\n * Polyfills the static function Math.fround().\n *\n * This polyfill is slightly incorrect for IE8 and IE9, where it performs no\n * rounding at all. This is generally not a problem, since Math.fround is\n * primarily used for optimization (to force faster 32-bit operations rather\n * than 64-bit), but in cases where (a) the logic actually depends on a\n * correct fround implementation and (b) the application targets very old\n * browsers, this polyfill will be insufficient. For that case, see\n * https://gist.github.com/shicks/7a97ec6b3f10212e60a89a7f6d2d097d for a\n * more correct polyfill that does not depend on Float32Array.\n *\n * @param {number} arg A 64-bit double-precision number.\n * @return {number} The closest float32 to the argument.\n */\n var polyfill = function(arg) {\n arr[0] = arg;\n return arr[0];\n };\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/hypot.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.hypot', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the sum of its arguments in quadrature.\n *\n *

Polyfills the static function Math.hypot().\n *\n * @param {...number} var_args Any number, or value that can be coerced to a\n * number.\n * @return {number} The square root of the sum of the squares.\n */\n var polyfill = function(var_args) {\n if (arguments.length < 2) {\n return arguments.length ? Math.abs(arguments[0]) : 0;\n }\n\n var i, z, sum, max;\n // Note: we need to normalize the numbers in case of over/underflow.\n for (max = 0, i = 0; i < arguments.length; i++) {\n max = Math.max(max, Math.abs(arguments[i]));\n }\n // TODO(sdh): Document where these constants come from.\n if (max > 1e100 || max < 1e-100) {\n if (!max) return max; // Handle 0 and NaN before trying to divide.\n sum = 0;\n for (i = 0; i < arguments.length; i++) {\n z = Number(arguments[i]) / max;\n sum += z * z;\n }\n return Math.sqrt(sum) * max;\n } else {\n sum = 0;\n for (i = 0; i < arguments.length; i++) {\n z = Number(arguments[i]);\n sum += z * z;\n }\n return Math.sqrt(sum);\n }\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/imul.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.imul', function(orig) {\n if (orig) return orig;\n\n /**\n * Performs C-like 32-bit signed integer multiplication.\n *\n *

Polyfills the static function Math.imul().\n *\n * @param {number} a Any number, or value that can be coerced to a number.\n * @param {number} b Any number, or value that can be coerced to a number.\n * @return {number} The 32-bit integer product of a and b.\n */\n var polyfill = function(a, b) {\n // This algorithm is taken from v8.\n // Note: If multiplication overflows 32 bits, then we risk losing\n // precision. We must therefore break the inputs into 16-bit\n // words and multiply separately.\n a = Number(a);\n b = Number(b);\n var ah = (a >>> 16) & 0xFFFF; // Treat individual words as unsigned\n var al = a & 0xFFFF;\n var bh = (b >>> 16) & 0xFFFF;\n var bl = b & 0xFFFF;\n var lh = ((ah * bl + al * bh) << 16) >>> 0; // >>> 0 casts to uint\n return (al * bl + lh) | 0; // | 0 casts back to signed\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/log10.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.log10', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the base-10 logarithm.\n *\n *

Polyfills the static function Math.log10().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The common log of x.\n */\n var polyfill = function(x) {\n return Math.log(x) / Math.LN10;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/log1p.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.log1p', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the natural logarithm of 1+x, implemented in a way that is\n * accurate for numbers close to zero.\n *\n *

Polyfills the static function Math.log1p().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The natural log of 1+x.\n */\n var polyfill = function(x) {\n // This implementation is based on the Taylor expansion\n // log(1 + x) ~ x - x^2/2 + x^3/3 - x^4/4 + x^5/5 - ...\n x = Number(x);\n if (x < 0.25 && x > -0.25) {\n var y = x;\n var d = 1;\n var z = x;\n var zPrev = 0;\n var s = 1;\n while (zPrev != z) {\n y *= x;\n s *= -1;\n z = (zPrev = z) + s * y / (++d);\n }\n return z;\n }\n return Math.log(1 + x);\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/log2.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.log2', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the base-2 logarithm.\n *\n *

Polyfills the static function Math.log2().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The base-2 log of x.\n */\n var polyfill = function(x) {\n return Math.log(x) / Math.LN2;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/sign.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.sign', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the sign of the number, indicating whether it is\n * positive, negative, or zero.\n *\n *

Polyfills the static function Math.sign().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The sign, +1 if x is positive, -1 if x is\n * negative, or 0 if x is zero.\n */\n var polyfill = function(x) {\n x = Number(x);\n return x === 0 || isNaN(x) ? x : x > 0 ? 1 : -1;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/sinh.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.sinh', function(orig) {\n if (orig) return orig;\n var exp = Math.exp;\n\n /**\n * Computes the hyperbolic sine.\n *\n *

Polyfills the static function Math.sinh().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The hyperbolic sine of x.\n */\n var polyfill = function(x) {\n x = Number(x);\n if (x === 0) return x;\n return (exp(x) - exp(-x)) / 2;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/tanh.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.tanh', function(orig) {\n if (orig) return orig;\n\n /**\n * Computes the hyperbolic tangent.\n *\n *

Polyfills the static function Math.tanh().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number} The hyperbolic tangent of x.\n */\n var polyfill = function(x) {\n x = Number(x);\n if (x === 0) return x;\n // Ensure exponent is negative to prevent overflow.\n var y = Math.exp(-2 * Math.abs(x));\n var z = (1 - y) / (1 + y);\n return x < 0 ? -z : z;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/math/trunc.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Math.trunc', function(orig) {\n if (orig) return orig;\n\n /**\n * Truncates any fractional digits from its argument (towards zero).\n *\n *

Polyfills the static function Math.trunc().\n *\n * @param {number} x Any number, or value that can be coerced to a number.\n * @return {number}\n */\n var polyfill = function(x) {\n x = Number(x);\n if (isNaN(x) || x === Infinity || x === -Infinity || x === 0) return x;\n var y = Math.floor(Math.abs(x));\n return x < 0 ? -y : y;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/modules/runtime.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Light weight implementation of a module loader that is based on\n * CommonJS.\n *\n * This is meant to be used by the Closure Library to help debug load transpiled\n * ES6 modules. Closure can transpile ES6 modules to a function that is\n * compatible with registerModule. Then it can call the global $jscomp.require\n * when it wants to retrieve a reference to the module object.\n *\n * Example:\n * \"import {x} from './other.js'; export {x as Y}; use(x);\"\n *\n * Might be transpiled as:\n *\n * $jscomp.registerModule(function($$exports, $$require, $$module) {\n * Object.defineProperties($$exports, {\n * Y: enumerable: true, get: function() { return module$other.x }\n * });\n * const module$other = $$require('./other.js');\n * use(module$other.x);\n * }, 'example.js', ['./other.js']);\n *\n * @suppress {uselessCode} The require statements below are not useless.\n */\n\n'require base';\n'require es6/map';\n'require es6/set';\n'require util/global';\n\n(function() {\n/**\n * @param {string} id\n * @param {?=} opt_exports\n *\n * @struct @constructor @final\n */\nvar Module = function(id, opt_exports) {\n /** @const {string} */\n this.id = id;\n /** @type {?} */\n this.exports = opt_exports || {};\n};\n\n\n/**\n * @param {?} other\n */\nModule.prototype.exportAllFrom = function(other) {\n var module = this;\n var define = {};\n for (var key in other) {\n if (key == 'default' || key in module.exports || key in define) {\n continue;\n }\n define[key] = {\n enumerable: true,\n get: (function(key) {\n return function() {\n return other[key];\n };\n })(key)\n };\n }\n $jscomp.global.Object.defineProperties(module.exports, define);\n};\n\n\n/**\n * @param {?function(function(string), ?, !Module)} def The module definition\n * function which has the arguments (require, exports, module).\n * @param {!Module} module\n * @param {string} path\n *\n * @struct @constructor @final\n */\nvar CacheEntry = function(def, module, path) {\n /** @type {?function(function(string), ?, !Module)} */\n this.def = def;\n /** @type {!Module} */\n this.module = module;\n /** @type {string} */\n this.path = path;\n /** @const {!Set} */\n this.blockingDeps = new Set();\n};\n\n\n/**\n * Loads the module by calling its module definition function if it has not\n * already been loaded.\n *\n * @return {?} The module's exports property.\n */\nCacheEntry.prototype.load = function() {\n if (this.def) {\n var def = this.def;\n this.def = null;\n callRequireCallback(def, this.module);\n }\n\n return this.module.exports;\n};\n\n\n/**\n * @param {function(function(string), ?, !Module)|function(function(string))}\n * callback A module definition function with arguments (require, exports,\n * module) or a require.ensure callback which has the argument (require).\n * @param {!Module=} opt_module If provided then the callback is assumed to be\n * this module's definition function.\n */\nfunction callRequireCallback(callback, opt_module) {\n var oldPath = currentModulePath;\n\n try {\n if (opt_module) {\n currentModulePath = opt_module.id;\n callback.call(\n opt_module, createRequire(opt_module), opt_module.exports,\n opt_module);\n } else {\n callback($jscomp.require);\n }\n } finally {\n currentModulePath = oldPath;\n }\n}\n\n\n/** @type {!Map} */\nvar moduleCache = new Map();\n\n\n/** @type {string} */\nvar currentModulePath = '';\n\n\n/**\n * Normalize a file path by removing redundant \"..\" and extraneous \".\" file\n * path components.\n *\n * @param {string} path\n * @return {string}\n */\nfunction normalizePath(path) {\n var components = path.split('/');\n var i = 0;\n while (i < components.length) {\n if (components[i] == '.') {\n components.splice(i, 1);\n } else if (\n i && components[i] == '..' && components[i - 1] &&\n components[i - 1] != '..') {\n components.splice(--i, 2);\n } else {\n i++;\n }\n }\n return components.join('/');\n}\n\n\n/** @return {?string} */\n$jscomp.getCurrentModulePath = function() {\n return currentModulePath;\n};\n\n\n/**\n * @param {string} id\n * @return {!CacheEntry}\n */\nfunction getCacheEntry(id) {\n var cacheEntry = moduleCache.get(id);\n if (cacheEntry === undefined) {\n throw new Error('Module ' + id + ' does not exist.');\n }\n return cacheEntry;\n}\n\n\n/**\n * Map of absolute module path to list of require.ensure callbacks waiting for\n * the given module to load.\n *\n * @const {!Map>}\n */\nvar ensureMap = new Map();\n\n\n/**\n * @param {!Set} requireSet\n * @param {function(function(string))} callback\n *\n * @struct @constructor @final\n */\nvar CallbackEntry = function(requireSet, callback) {\n /** @const */\n this.requireSet = requireSet;\n /** @const */\n this.callback = callback;\n};\n\n\n/**\n * Normalizes two paths if the second is relative.\n *\n * @param {string} root\n * @param {string} absOrRelativePath\n * @return {string}\n */\nfunction maybeNormalizePath(root, absOrRelativePath) {\n if (absOrRelativePath.startsWith('./') ||\n absOrRelativePath.startsWith('../')) {\n return normalizePath(root + '/../' + absOrRelativePath);\n } else {\n return absOrRelativePath;\n }\n}\n\n\n/**\n * Creates a require function which resolves paths against the given module, if\n * any.\n *\n * @param {!Module=} opt_module\n * @return {function(string):?}\n */\nfunction createRequire(opt_module) {\n /**\n * @param {string} absOrRelativePath\n * @return {?}\n */\n function require(absOrRelativePath) {\n var absPath = absOrRelativePath;\n if (opt_module) {\n absPath = maybeNormalizePath(opt_module.id, absPath);\n }\n return getCacheEntry(absPath).load();\n }\n\n /**\n * @param {!Array} requires\n * @param {function(function(string))} callback\n */\n function requireEnsure(requires, callback) {\n if (currentModulePath) {\n for (var i = 0; i < requires.length; i++) {\n requires[i] = maybeNormalizePath(currentModulePath, requires[i]);\n }\n }\n\n var blockingRequires = [];\n for (var i = 0; i < requires.length; i++) {\n var required = moduleCache.get(requires[i]);\n if (!required || required.blockingDeps.size) {\n blockingRequires.push(requires[i]);\n }\n }\n\n if (blockingRequires.length) {\n var requireSet = new Set(blockingRequires);\n var callbackEntry = new CallbackEntry(requireSet, callback);\n requireSet.forEach(function(require) {\n var arr = ensureMap.get(require);\n if (!arr) {\n arr = [];\n ensureMap.set(require, arr);\n }\n arr.push(callbackEntry);\n });\n } else {\n callback(require);\n }\n }\n require.ensure = requireEnsure;\n\n return require;\n}\n\n\n/** @const {function(string): ?} */\n$jscomp.require = createRequire();\n\n\n/**\n * @param {string} id\n * @return {boolean}\n */\n$jscomp.hasModule = function(id) {\n return moduleCache.has(id);\n};\n\n\n/**\n * Marks the given module as being available and calls any require.ensure\n * callbacks waiting for it.\n *\n * @param {string} absModulePath\n */\nfunction markAvailable(absModulePath) {\n var ensures = ensureMap.get(absModulePath);\n\n if (ensures) {\n for (var i = 0; i < ensures.length; i++) {\n var entry = ensures[i];\n entry.requireSet.delete(absModulePath);\n if (!entry.requireSet.size) {\n ensures.splice(i--, 1);\n callRequireCallback(entry.callback);\n }\n }\n\n if (!ensures.length) {\n ensureMap.delete(absModulePath);\n }\n }\n}\n\n\n/**\n * Registers a CommonJS-like module for use with this runtime. Does not execute\n * the module until it is required.\n *\n * @param {function(function(string), ?, !Module)} moduleDef The module\n * definition.\n * @param {string} absModulePath\n * @param {!Array=} opt_shallowDeps List of dependencies this module\n * directly depends on. Paths can be relative to the given module. This\n * module will considered available until all of its dependencies are also\n * available for require.\n */\n$jscomp.registerModule = function(moduleDef, absModulePath, opt_shallowDeps) {\n if (moduleCache.has(absModulePath)) {\n throw new Error(\n 'Module ' + absModulePath + ' has already been registered.');\n }\n\n if (currentModulePath) {\n throw new Error('Cannot nest modules.');\n }\n\n var shallowDeps = opt_shallowDeps || [];\n for (var i = 0; i < shallowDeps.length; i++) {\n shallowDeps[i] = maybeNormalizePath(absModulePath, shallowDeps[i]);\n }\n\n var /** !Set */ blockingDeps = new Set();\n for (var i = 0; i < shallowDeps.length; i++) {\n getTransitiveBlockingDepsOf(shallowDeps[i]).forEach(function(transitive) {\n blockingDeps.add(transitive);\n });\n }\n\n // Make sure this module isn't blocking itself in the event of a cycle.\n blockingDeps.delete(absModulePath);\n\n var cacheEntry =\n new CacheEntry(moduleDef, new Module(absModulePath), absModulePath);\n moduleCache.set(absModulePath, cacheEntry);\n\n blockingDeps.forEach(function(blocker) {\n addAsBlocking(cacheEntry, blocker);\n });\n\n if (!blockingDeps.size) {\n markAvailable(cacheEntry.module.id);\n }\n\n removeAsBlocking(cacheEntry);\n};\n\n\n/**\n * @param {string} moduleId\n * @return {!Set}\n */\nfunction getTransitiveBlockingDepsOf(moduleId) {\n var cacheEntry = moduleCache.get(moduleId);\n var /** !Set */ blocking = new Set();\n\n if (cacheEntry) {\n cacheEntry.blockingDeps.forEach(function(dep) {\n getTransitiveBlockingDepsOf(dep).forEach(function(transitive) {\n blocking.add(transitive);\n });\n });\n } else {\n blocking.add(moduleId);\n }\n\n return blocking;\n}\n\n\n/** @const {!Map>} */\nvar blockingModulePathToBlockedModules = new Map();\n\n\n/**\n * @param {!CacheEntry} blocked\n * @param {string} blocker\n */\nfunction addAsBlocking(blocked, blocker) {\n if (blocked.module.id != blocker) {\n var blockedModules = blockingModulePathToBlockedModules.get(blocker);\n\n if (!blockedModules) {\n blockedModules = new Set();\n blockingModulePathToBlockedModules.set(blocker, blockedModules);\n }\n\n blockedModules.add(blocked);\n blocked.blockingDeps.add(blocker);\n }\n}\n\n\n/**\n * Marks the given module as no longer blocking any modules. Instead marks the\n * module's blockers as blocking these modules. If this totally unblocks a\n * module it is marked as available.\n *\n * @param {!CacheEntry} cacheEntry\n */\nfunction removeAsBlocking(cacheEntry) {\n var blocked = blockingModulePathToBlockedModules.get(cacheEntry.module.id);\n\n if (blocked) {\n blockingModulePathToBlockedModules.delete(cacheEntry.module.id);\n\n blocked.forEach(function(blockedCacheEntry) {\n blockedCacheEntry.blockingDeps.delete(cacheEntry.module.id);\n\n cacheEntry.blockingDeps.forEach(function(blocker) {\n addAsBlocking(blockedCacheEntry, blocker);\n });\n\n if (!blockedCacheEntry.blockingDeps.size) {\n removeAsBlocking(blockedCacheEntry);\n markAvailable(blockedCacheEntry.module.id);\n }\n });\n }\n}\n\n\n/**\n * Forces module evaluation as soon as it is available for require.\n *\n * @param {function(function(string), ?, !Module)} moduleDef\n * @param {string} absModulePath\n * @param {!Array} shallowDeps\n * @suppress {strictMissingProperties} \"ensure\" is not declared.\n */\n$jscomp.registerAndLoadModule = function(\n moduleDef, absModulePath, shallowDeps) {\n $jscomp.require.ensure([absModulePath], function(require) {\n require(absModulePath);\n });\n $jscomp.registerModule(moduleDef, absModulePath, shallowDeps);\n};\n\n\n/**\n * Registers an object as if it is the exports of an ES6 module so that it may\n * be retrieved via $jscomp.require.\n *\n * Used by Closure Library in the event that only some ES6 modules need\n * transpilation.\n *\n * @param {string} absModulePath\n * @param {?} exports\n */\n$jscomp.registerEs6ModuleExports = function(absModulePath, exports) {\n if (moduleCache.has(absModulePath)) {\n throw new Error(\n 'Module at path ' + absModulePath + ' is already registered.');\n }\n\n var entry =\n new CacheEntry(null, new Module(absModulePath, exports), absModulePath);\n moduleCache.set(absModulePath, entry);\n markAvailable(absModulePath);\n};\n\n\n/**\n * Hook to clear all loaded modules. Meant to only be used by tests.\n */\n$jscomp.clearModules = function() {\n moduleCache.clear();\n};\n})();\n","js/es6/nopolyfill.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview Specifies objects that the compiler does NOT polyfill.\n * NOTE: this file should never be injected, since all the implementations\n * are null.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Proxy', null, 'es6', 'es6');\n\n$jscomp.polyfill('String.raw', null, 'es6', 'es6');\n$jscomp.polyfill('String.prototype.normalize', null, 'es6', 'es6');\n","js/es6/number.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Brings in all ES6 Number polyfills.\n */\n'require es6/number/constants';\n'require es6/number/isfinite';\n'require es6/number/isinteger';\n'require es6/number/isnan';\n'require es6/number/issafeinteger';\n'require es6/number/parsefloat';\n'require es6/number/parseint';\n","js/es6/number/constants.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n\n$jscomp.polyfill('Number.EPSILON', function(orig) {\n /**\n * The difference 1 and the smallest number greater than 1.\n *\n *

Polyfills the static field Number.EPSILON.\n */\n return Math.pow(2, -52);\n}, 'es6', 'es3');\n\n\n$jscomp.polyfill('Number.MAX_SAFE_INTEGER', function() {\n /**\n * The maximum safe integer, 2^53 - 1.\n *\n *

Polyfills the static field Number.MAX_SAFE_INTEGER.\n */\n return 0x1fffffffffffff;\n}, 'es6', 'es3');\n\n\n$jscomp.polyfill('Number.MIN_SAFE_INTEGER', function() {\n /**\n * The minimum safe integer, -(2^53 - 1).\n *\n *

Polyfills the static field Number.MIN_SAFE_INTEGER.\n */\n return -0x1fffffffffffff;\n}, 'es6', 'es3');\n","js/es6/number/isfinite.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Number.isFinite', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns whether the given argument is a finite number.\n *\n *

Polyfills the static function Number.isFinite().\n *\n * @param {number} x Any value.\n * @return {boolean} True if x is a number and not NaN or infinite.\n */\n var polyfill = function(x) {\n if (typeof x !== 'number') return false;\n return !isNaN(x) && x !== Infinity && x !== -Infinity;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/number/isinteger.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/number/isfinite';\n'require util/polyfill';\n\n$jscomp.polyfill('Number.isInteger', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns whether the given argument is an integer.\n *\n *

Polyfills the static function Number.isInteger().\n *\n * @param {number} x Any value.\n * @return {boolean} True if x is an integer.\n */\n var polyfill = function(x) {\n if (!Number.isFinite(x)) return false;\n return x === Math.floor(x);\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/number/isnan.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Number.isNaN', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns whether the given argument is the value NaN,\n * guaranteeing not to coerce to a number first.\n *\n *

Polyfills the static function Number.isNaN().\n *\n * @param {number} x Any value.\n * @return {boolean} True if x is exactly NaN.\n */\n var polyfill = function(x) {\n return typeof x === 'number' && isNaN(x);\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/number/issafeinteger.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/number/constants';\n'require es6/number/isinteger';\n'require util/polyfill';\n\n$jscomp.polyfill('Number.isSafeInteger', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns whether the given argument is a \"safe\" integer,\n * that is, its magnitude is less than 2^53.\n *\n *

Polyfills the static function Number.isSafeInteger().\n *\n * @param {number} x Any value.\n * @return {boolean} True if x is a safe integer.\n */\n var polyfill = function(x) {\n return Number.isInteger(x) && Math.abs(x) <= Number.MAX_SAFE_INTEGER;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/number/parsefloat.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Number.parseFloat', function(orig) {\n return orig || parseFloat;\n}, 'es6', 'es3');\n","js/es6/number/parseint.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Number.parseInt', function(orig) {\n return orig || parseInt;\n}, 'es6', 'es3');\n","js/es6/object.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Brings in all ES6 Object polyfills.\n * @suppress {uselessCode}\n */\n'require es6/object/assign';\n'require es6/object/entries';\n'require es6/object/fromentries';\n'require es6/object/getownpropertydescriptors';\n'require es6/object/getownpropertysymbols';\n'require es6/object/is';\n'require es6/object/setprototypeof';\n'require es6/object/values';\n","js/es6/object/assign.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require es6/util/assign';\n'require util/polyfill';\n\n$jscomp.polyfill('Object.assign', function(orig) {\n return orig || $jscomp.assign;\n}, 'es6', 'es3');\n","js/es6/object/entries.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/owns';\n'require util/polyfill';\n\n$jscomp.polyfill('Object.entries', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns an array of [key, value] arrays, one for each entry\n * in the given object.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n *\n * @param {!Object} obj\n * @return {!Array>}\n * @template KEY, VALUE\n */\n var entries = function(obj) {\n var result = [];\n for (var key in obj) {\n if ($jscomp.owns(obj, key)) {\n result.push([key, obj[key]]);\n }\n }\n return result;\n };\n\n return entries;\n}, 'es8', 'es3');\n","js/es6/object/fromentries.js":"/*\n * Copyright 2019 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require es6/symbol';\n'require util/defineproperty';\n'require util/polyfill';\n\n$jscomp.polyfill('Object.fromEntries', function(orig) {\n if (orig) {\n return orig;\n }\n\n /**\n * @param {!Iterable<*>} iter\n * @return {!Object}\n * @see https://github.com/tc39/proposal-object-from-entries/blob/master/polyfill.js\n */\n function fromEntries(iter) {\n var obj = {};\n\n if (!(Symbol.iterator in iter)) {\n throw new TypeError('' + iter + ' is not iterable');\n }\n\n var iteratorFn = (/** @type {function(): !Iterator>} */ (\n iter[Symbol.iterator]));\n var iterator = iteratorFn.call(iter);\n\n for (var result = iterator.next(); !result.done; result = iterator.next()) {\n var pair = result.value;\n\n if (Object(pair) !== pair) {\n throw new TypeError('iterable for fromEntries should yield objects');\n }\n\n var key = pair[0];\n var val = pair[1];\n obj[key] = val;\n }\n\n return obj;\n }\n\n return fromEntries;\n}, 'es_2019', 'es3');\n","js/es6/object/getownpropertydescriptors.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/reflect/ownkeys';\n'require util/polyfill';\n\n$jscomp.polyfill('Object.getOwnPropertyDescriptors', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfills Object.getOwnPropertyDescriptors.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n *\n * @param {!Object} obj\n * @return {!Object}\n */\n var getOwnPropertyDescriptors = function(obj) {\n var result = {};\n var keys = Reflect.ownKeys(obj);\n for (var i = 0; i < keys.length; i++) {\n result[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);\n }\n return result;\n };\n\n return getOwnPropertyDescriptors;\n}, 'es8', 'es5');\n","js/es6/object/getownpropertysymbols.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Object.getOwnPropertySymbols', function(orig) {\n if (orig) return orig;\n\n // NOTE: The symbol polyfill is a string, so symbols show up in\n // Object.getOwnProperytyNames instead. It's been decided that\n // the trade-off of \"fixing\" this behavior is not worth the costs\n // in (a) code size, (b) brittleness, and (c) complexity.\n return function() { return []; };\n}, 'es6', 'es5'); // Same as Object.getOwnPropertyNames\n","js/es6/object/is.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('Object.is', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfill for Object.is() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n *\n * Determines whether two values are the same value (that is,\n * functionally equivalent). This is the same as ===-equality,\n * except for two cases: 0 is not the same as -0, and NaN is\n * the same as NaN.\n *\n * @param {*} left\n * @param {*} right\n * @return {boolean}\n */\n var polyfill = function(left, right) {\n if (left === right) {\n // Handle the 0 === -0 exception\n return (left !== 0) || (1 / left === 1 / /** @type {number} */ (right));\n } else {\n // Handle the NaN !== NaN exception\n return (left !== left) && (right !== right);\n }\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/object/setprototypeof.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n'require es6/util/setprototypeof';\n\n\n$jscomp.polyfill('Object.setPrototypeOf', function(orig) {\n // Note that $jscomp.setPrototypeOf will be `null` if it isn't possible to\n // implement this method.\n return orig || $jscomp.setPrototypeOf;\n}, 'es6', 'es5');\n","js/es6/object/values.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/owns';\n'require util/polyfill';\n\n$jscomp.polyfill('Object.values', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns an array of values from the given object.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values\n *\n * @param {!Object} obj\n * @return {!Array}\n * @template KEY, VALUE\n */\n var values = function(obj) {\n var result = [];\n for (var key in obj) {\n if ($jscomp.owns(obj, key)) {\n result.push(obj[key]);\n }\n }\n return result;\n };\n\n return values;\n}, 'es8', 'es3');\n","js/es6/promise.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Brings in all Promise polyfills.\n * @suppress {uselessCode}\n */\n'require es6/promise/promise';\n'require es6/promise/allSettled';\n'require es6/promise/finally';\n","js/es6/promise/allSettled.js":"/*\n * Copyright 2019 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n'require es6/promise/promise';\n'require es6/array/from';\n\n$jscomp.polyfill('Promise.allSettled', function(orig) {\n if (orig) return orig;\n\n /**\n * @param {*} value\n * @return {{status: string, value: *}}\n */\n function fulfilledResult(value) {\n return {status: 'fulfilled', value: value};\n }\n\n /**\n * @param {*} reason\n * @return {{status: string, reason: *}}\n */\n function rejectedResult(reason) {\n return {status: 'rejected', reason: reason};\n }\n\n /**\n * These types are weaker than they could be, but they're strong enough for\n * this context.\n * @this {typeof Promise}\n * @param {!Iterable<*>} thenablesOrValues\n * @return {!Promise>}\n */\n var polyfill = function(thenablesOrValues) {\n // The spec requires allSettled to be called directly on the Promise\n // constructor, which is consistent with its requirement for Promise.all().\n /** @type {typeof Promise} */\n var PromiseConstructor = this;\n\n /**\n * @param {*} maybeThenable\n * @return {!Promise<*>}\n */\n function convertToAllSettledResult(maybeThenable) {\n return PromiseConstructor.resolve(maybeThenable)\n .then(fulfilledResult, rejectedResult);\n }\n\n // Create an array of promises that resolve to the appropriate result\n // objects and never reject.\n var wrappedResults =\n Array.from(thenablesOrValues, convertToAllSettledResult);\n return PromiseConstructor.all(wrappedResults);\n };\n return polyfill;\n}, 'es_2020', 'es3');\n","js/es6/promise/finally.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/promise/promise';\n\n$jscomp.polyfill('Promise.prototype.finally', function(orig) {\n if (orig) return orig;\n\n /**\n * @this {!Promise}\n * @param {function():?} onFinally\n * @return {!Promise}\n * @template VALUE\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function(onFinally) {\n return this.then(\n function(value) {\n var promise = Promise.resolve(onFinally());\n return promise.then(function () { return value; });\n },\n function(reason) {\n var promise = Promise.resolve(onFinally());\n return promise.then(function () { throw reason; });\n });\n };\n\n return polyfill;\n}, 'es9', 'es3');\n","js/es6/promise/promise.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require base';\n'require es6/util/makeiterator';\n'require util/global';\n'require util/polyfill';\n\n/**\n * Should we unconditionally override a native Promise implementation with our\n * own?\n * @define {boolean}\n */\n$jscomp.FORCE_POLYFILL_PROMISE = false;\n\n\n$jscomp.polyfill('Promise',\n /**\n * @param {*} NativePromise\n * @return {*}\n * @suppress {reportUnknownTypes}\n */\n function(NativePromise) {\n // TODO(bradfordcsmith): Do we need to add checks for standards conformance?\n // e.g. The version of FireFox we currently use for testing has a Promise\n // that fails to reject attempts to fulfill it with itself, but that\n // isn't reasonably testable here.\n if (NativePromise && !$jscomp.FORCE_POLYFILL_PROMISE) {\n return NativePromise;\n }\n\n /**\n * Schedules code to be executed asynchronously.\n * @constructor\n * @struct\n */\n function AsyncExecutor() {\n /**\n * Batch of functions to execute.\n *\n * Will be `null` initially and immediately after a batch finishes\n * executing.\n * @private {?Array}\n */\n this.batch_ = null;\n }\n\n /**\n * Schedule a function to execute asynchronously.\n *\n * - The function will execute:\n * - After the current call stack has completed executing.\n * - After any functions previously scheduled using this object.\n * - The return value will be ignored.\n * - An exception thrown by the method will be caught and asynchronously\n * rethrown when it cannot interrupt any other code. This class provides\n * no way to catch such exceptions.\n * @param {function():?} f\n */\n AsyncExecutor.prototype.asyncExecute = function(f) {\n if (this.batch_ == null) {\n // no batch created yet, or last batch was fully executed\n this.batch_ = [];\n var self = this;\n this.asyncExecuteFunction(function() { self.executeBatch_(); });\n }\n this.batch_.push(f);\n };\n\n // NOTE: We want to make sure AsyncExecutor will work as expected even if\n // testing code should override setTimeout()\n /** @const {function(!Function, number)} */\n var nativeSetTimeout = $jscomp.global['setTimeout'];\n\n /**\n * Schedule a function to execute asynchronously as soon as possible.\n *\n * NOTE: May be overridden for testing.\n * @package\n * @param {function()} f\n */\n AsyncExecutor.prototype.asyncExecuteFunction = function(f) {\n nativeSetTimeout(f, 0);\n };\n\n /**\n * Execute scheduled jobs in a batch until all are executed or the batch\n * execution time limit has been reached.\n * @private\n */\n AsyncExecutor.prototype.executeBatch_ = function() {\n while (this.batch_ && this.batch_.length) {\n var /** !Array */ executingBatch = this.batch_;\n // Executions scheduled while executing this batch go into a new one to\n // avoid the batch array getting too big.\n this.batch_ = [];\n for (var i = 0; i < executingBatch.length; ++i) {\n var f = /** @type {function()} */ (executingBatch[i]);\n executingBatch[i] = null; // free memory\n try {\n f();\n } catch (error) {\n this.asyncThrow_(error);\n }\n }\n }\n // All jobs finished executing, so force scheduling a new batch next\n // time asyncExecute() is called.\n this.batch_ = null;\n };\n\n /**\n * @private\n * @param {*} exception\n */\n AsyncExecutor.prototype.asyncThrow_ = function(exception) {\n this.asyncExecuteFunction(function() { throw exception; });\n };\n\n /**\n * @enum {number}\n */\n var PromiseState = {\n /** The Promise is waiting for resolution. */\n PENDING: 0,\n\n /** The Promise has been resolved with a fulfillment value. */\n FULFILLED: 1,\n\n /** The Promise has been resolved with a rejection reason. */\n REJECTED: 2\n };\n\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n * @param {function(\n * function((TYPE|IThenable|Thenable|null)=),\n * function(*=))} executor\n * @constructor\n * @extends {Promise}\n * @template TYPE\n */\n var PolyfillPromise = function(executor) {\n /** @private {PromiseState} */\n this.state_ = PromiseState.PENDING;\n\n /**\n * The settled result of the Promise. Immutable once set with either a\n * fulfillment value or rejection reason.\n * @private {*}\n */\n this.result_ = undefined;\n\n /**\n * These functions must be asynchronously executed when this promise\n * settles.\n * @private {?Array}\n */\n this.onSettledCallbacks_ = [];\n\n var resolveAndReject = this.createResolveAndReject_();\n try {\n executor(resolveAndReject.resolve, resolveAndReject.reject);\n } catch (e) {\n resolveAndReject.reject(e);\n }\n };\n\n\n /**\n * Create a pair of functions for resolving or rejecting this Promise.\n *\n *

After the resolve or reject function has been called once, later calls\n * do nothing.\n * @private\n * @return {{\n * resolve: function((TYPE|IThenable|Thenable|null)=),\n * reject: function(*=)\n * }}\n */\n PolyfillPromise.prototype.createResolveAndReject_ = function() {\n var thisPromise = this;\n var alreadyCalled = false;\n /**\n * @param {function(this:PolyfillPromise, T=)} method\n * @return {function(T=)}\n * @template T\n */\n function firstCallWins(method) {\n return function(/** T= */ x) {\n if (!alreadyCalled) {\n alreadyCalled = true;\n method.call(thisPromise, x);\n }\n };\n }\n return {\n resolve: firstCallWins(this.resolveTo_),\n reject: firstCallWins(this.reject_)\n };\n };\n\n\n /**\n * @private\n * @param {*=} value\n */\n PolyfillPromise.prototype.resolveTo_ = function(value) {\n if (value === this) {\n this.reject_(new TypeError('A Promise cannot resolve to itself'));\n } else if (value instanceof PolyfillPromise) {\n this.settleSameAsPromise_(/** @type {!PolyfillPromise} */ (value));\n } else if (isObject(value)) {\n this.resolveToNonPromiseObj_(/** @type {!Object} */ (value));\n } else {\n this.fulfill_(value);\n }\n };\n\n\n /**\n * @private\n * @param {!Object} obj\n * @suppress {strictMissingProperties} obj.then\n */\n PolyfillPromise.prototype.resolveToNonPromiseObj_ = function(obj) {\n var thenMethod = undefined;\n\n try {\n thenMethod = obj.then;\n } catch (error) {\n this.reject_(error);\n return;\n }\n if (typeof thenMethod == 'function') {\n this.settleSameAsThenable_(thenMethod, /** @type {!Thenable} */ (obj));\n } else {\n this.fulfill_(obj);\n }\n };\n\n\n /**\n * @param {*} value anything\n * @return {boolean}\n */\n function isObject(value) {\n switch (typeof value) {\n case 'object':\n return value != null;\n case 'function':\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Reject this promise for the given reason.\n * @private\n * @param {*=} reason\n * @throws {!Error} if this promise is already fulfilled or rejected.\n */\n PolyfillPromise.prototype.reject_ = function(reason) {\n this.settle_(PromiseState.REJECTED, reason);\n };\n\n /**\n * Fulfill this promise with the given value.\n * @private\n * @param {!TYPE} value\n * @throws {!Error} when this promise is already fulfilled or rejected.\n */\n PolyfillPromise.prototype.fulfill_ = function(value) {\n this.settle_(PromiseState.FULFILLED, value);\n };\n\n /**\n * Fulfill or reject this promise with the given value/reason.\n * @private\n * @param {!PromiseState} settledState (FULFILLED or REJECTED)\n * @param {*} valueOrReason\n * @throws {!Error} when this promise is already fulfilled or rejected.\n */\n PolyfillPromise.prototype.settle_ = function(settledState, valueOrReason) {\n if (this.state_ != PromiseState.PENDING) {\n throw new Error(\n 'Cannot settle(' + settledState + ', ' + valueOrReason +\n '): Promise already settled in state' + this.state_);\n }\n this.state_ = settledState;\n this.result_ = valueOrReason;\n this.executeOnSettledCallbacks_();\n };\n\n PolyfillPromise.prototype.executeOnSettledCallbacks_ = function() {\n if (this.onSettledCallbacks_ != null) {\n for (var i = 0; i < this.onSettledCallbacks_.length; ++i) {\n asyncExecutor.asyncExecute(this.onSettledCallbacks_[i]);\n }\n this.onSettledCallbacks_ = null; // free memory\n }\n };\n\n /**\n * All promise async execution is managed by a single executor for the\n * sake of efficiency.\n * @const {!AsyncExecutor}\n */\n var asyncExecutor = new AsyncExecutor();\n\n /**\n * Arrange to settle this promise in the same way as the given thenable.\n * @private\n * @param {!PolyfillPromise} promise\n */\n PolyfillPromise.prototype.settleSameAsPromise_ = function(promise) {\n var methods = this.createResolveAndReject_();\n\n // Calling then() would create an unnecessary extra promise.\n promise.callWhenSettled_(methods.resolve, methods.reject);\n };\n\n /**\n * Arrange to settle this promise in the same way as the given thenable.\n * @private\n * @param {function(\n * function((TYPE|IThenable|Thenable|null)=),\n * function(*=))\n * } thenMethod\n * @param {!Thenable} thenable\n */\n PolyfillPromise.prototype.settleSameAsThenable_ = function(\n thenMethod, thenable) {\n var methods = this.createResolveAndReject_();\n\n // Don't trust an unknown thenable implementation not to throw exceptions.\n try {\n thenMethod.call(thenable, methods.resolve, methods.reject);\n } catch (error) {\n methods.reject(error);\n }\n };\n\n /** @override */\n PolyfillPromise.prototype.then = function(onFulfilled, onRejected) {\n var resolveChild;\n var rejectChild;\n var childPromise = new PolyfillPromise(function(resolve, reject) {\n resolveChild = resolve;\n rejectChild = reject;\n });\n function createCallback(paramF, defaultF) {\n // The spec says to ignore non-function values for onFulfilled and\n // onRejected\n if (typeof paramF == 'function') {\n return function(x) {\n try {\n resolveChild(paramF(x));\n } catch (error) {\n rejectChild(error);\n }\n };\n } else {\n return defaultF;\n }\n }\n\n this.callWhenSettled_(\n createCallback(onFulfilled, resolveChild),\n createCallback(onRejected, rejectChild));\n return childPromise;\n };\n\n /** @override */\n PolyfillPromise.prototype.catch = function(onRejected) {\n return this.then(undefined, onRejected);\n };\n\n\n PolyfillPromise.prototype.callWhenSettled_ = function(\n onFulfilled, onRejected) {\n var /** !PolyfillPromise */ thisPromise = this;\n function callback() {\n switch (thisPromise.state_) {\n case PromiseState.FULFILLED:\n onFulfilled(thisPromise.result_);\n break;\n case PromiseState.REJECTED:\n onRejected(thisPromise.result_);\n break;\n default:\n throw new Error('Unexpected state: ' + thisPromise.state_);\n }\n }\n if (this.onSettledCallbacks_ == null) {\n // we've already settled\n asyncExecutor.asyncExecute(callback);\n } else {\n this.onSettledCallbacks_.push(callback);\n }\n };\n\n // called locally, so give it a name\n function resolvingPromise(opt_value) {\n if (opt_value instanceof PolyfillPromise) {\n return opt_value;\n } else {\n return new PolyfillPromise(function(resolve, reject) {\n resolve(opt_value);\n });\n }\n }\n PolyfillPromise['resolve'] = resolvingPromise;\n\n\n PolyfillPromise['reject'] = function(opt_reason) {\n return new PolyfillPromise(function(resolve, reject) {\n reject(opt_reason);\n });\n };\n\n\n PolyfillPromise['race'] = function(thenablesOrValues) {\n return new PolyfillPromise(function(resolve, reject) {\n var /** !Iterator<*> */ iterator =\n $jscomp.makeIterator(thenablesOrValues);\n for (var /** !IIterableResult<*> */ iterRec = iterator.next();\n !iterRec.done;\n iterRec = iterator.next()) {\n // Using resolvingPromise() allows us to treat all elements the same\n // way.\n // NOTE: resolvingPromise(promise) always returns the argument\n // unchanged.\n // Using .callWhenSettled_() instead of .then() avoids creating an\n // unnecessary extra promise.\n resolvingPromise(iterRec.value).callWhenSettled_(resolve, reject);\n }\n });\n };\n\n\n PolyfillPromise['all'] = function(thenablesOrValues) {\n var /** !Iterator<*> */ iterator = $jscomp.makeIterator(thenablesOrValues);\n var /** !IIterableResult<*> */ iterRec = iterator.next();\n\n if (iterRec.done) {\n return resolvingPromise([]);\n } else {\n return new PolyfillPromise(function(resolveAll, rejectAll) {\n var resultsArray = [];\n var unresolvedCount = 0;\n\n function onFulfilled(i) {\n return function(ithResult) {\n resultsArray[i] = ithResult;\n unresolvedCount--;\n if (unresolvedCount == 0) {\n resolveAll(resultsArray);\n }\n };\n }\n\n do {\n resultsArray.push(undefined);\n unresolvedCount++;\n // Using resolvingPromise() allows us to treat all elements the same\n // way.\n // NOTE: resolvingPromise(promise) always returns the argument\n // unchanged. Using .callWhenSettled_() instead of .then() avoids\n // creating an unnecessary extra promise.\n resolvingPromise(iterRec.value)\n .callWhenSettled_(\n onFulfilled(resultsArray.length - 1), rejectAll);\n iterRec = iterator.next();\n } while (!iterRec.done);\n });\n }\n };\n\n return PolyfillPromise;\n}, 'es6', 'es3');\n","js/es6/reflect.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Rolls together all ES6 Reflect polyfills.\n */\n'require es6/reflect/apply';\n'require es6/reflect/construct';\n'require es6/reflect/defineproperty';\n'require es6/reflect/deleteproperty';\n'require es6/reflect/get';\n'require es6/reflect/getownpropertydescriptor';\n'require es6/reflect/getprototypeof';\n'require es6/reflect/has';\n'require es6/reflect/isextensible';\n'require es6/reflect/ownkeys';\n'require es6/reflect/preventextensions';\n'require es6/reflect/set';\n'require es6/reflect/setprototypeof';\n","js/es6/reflect/apply.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.apply', function(orig) {\n if (orig) return orig;\n var apply = Function.prototype.apply;\n\n /**\n * Polyfill for Reflect.apply() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply\n *\n * Calls a target function with arguments as specified, just\n * as Function.prototype.apply.\n *\n * @param {function(this: THIS, ...*): RESULT} target The function to call.\n * @param {THIS} thisArg The 'this' argument.\n * @param {!Array} argList The arguments as a list.\n * @return {RESULT} The result of the function call.\n * @template THIS, RESULT\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function(target, thisArg, argList) {\n return apply.call(target, thisArg, argList);\n };\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/reflect/construct.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n\n'require es6/util/construct';\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n$jscomp.polyfill('Reflect.construct', function(orig) {\n // NOTE: This is just Reflect.construct if it's present and functional.\n return $jscomp.construct;\n}, 'es6', 'es3');\n","js/es6/reflect/defineproperty.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.defineProperty', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfill for Reflect.defineProperty() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty\n *\n * Version of Object.defineProperty that returns a boolean.\n *\n * @param {!Object} target Target on which to define the property.\n * @param {string} propertyKey Name of the property to define.\n * @param {!ObjectPropertyDescriptor} attributes Property attributes.\n * @return {boolean} Whether the property was defined.\n */\n var polyfill = function(target, propertyKey, attributes) {\n try {\n Object.defineProperty(target, propertyKey, attributes);\n var desc = Object.getOwnPropertyDescriptor(target, propertyKey);\n if (!desc) return false;\n return desc.configurable === (attributes.configurable || false) &&\n desc.enumerable === (attributes.enumerable || false) &&\n ('value' in desc ?\n desc.value === attributes.value &&\n desc.writable === (attributes.writable || false) :\n desc.get === attributes.get &&\n desc.set === attributes.set);\n } catch (err) {\n return false;\n }\n };\n return polyfill;\n}, 'es6', 'es5'); // ES5: Requires Object.defineProperty\n","js/es6/reflect/deleteproperty.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/owns';\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.deleteProperty', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfill for Reflect.deleteProperty() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/deleteProperty\n *\n * Applies the 'delete' operator as a function.\n *\n * @param {!Object} target Target on which to delete the property.\n * @param {string} propertyKey Name of the property to delete.\n * @return {boolean} Whether the property was deleted.\n */\n var polyfill = function(target, propertyKey) {\n if (!$jscomp.owns(target, propertyKey)) {\n return true;\n }\n try {\n return delete target[propertyKey];\n } catch (err) {\n return false;\n }\n };\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/reflect/get.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/finddescriptor';\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.get', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfill for Reflect.get() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get\n *\n * Applies the 'getprop' operator as a function.\n *\n * @param {!Object} target Target on which to get the property.\n * @param {string} propertyKey Name of the property to get.\n * @param {!Object=} opt_receiver An optional 'this' to use for a getter.\n * @return {*} The value of the property.\n * @suppress {reportUnknownTypes}\n */\n var polyfill = function(target, propertyKey, opt_receiver) {\n if (arguments.length <= 2) {\n return target[propertyKey];\n }\n var property = $jscomp.findDescriptor(target, propertyKey);\n if (property) {\n return property.get ? property.get.call(opt_receiver) : property.value;\n }\n return undefined;\n };\n return polyfill;\n}, 'es6', 'es5'); // ES5: findDescriptor requires getPrototypeOf\n","js/es6/reflect/getownpropertydescriptor.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.getOwnPropertyDescriptor', function(orig) {\n // NOTE: We don't make guarantees about correct throwing behavior.\n // Non-object arguments should be prevented by the type checker.\n return orig || Object.getOwnPropertyDescriptor;\n}, 'es6', 'es5'); // ES5: Requires Object.getOwnPropertyDescriptor\n","js/es6/reflect/getprototypeof.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.getPrototypeOf', function(orig) {\n // NOTE: We don't make guarantees about correct throwing behavior.\n // Non-object arguments should be prevented by the type checker.\n return orig || Object.getPrototypeOf;\n}, 'es6', 'es5'); // ES5: Requires Object.getPrototypeOf\n","js/es6/reflect/has.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.has', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfill for Reflect.has() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has\n *\n * Applies the 'in' operator as a function.\n *\n * @param {!Object} target\n * @param {*} propertyKey\n * @return {boolean}\n */\n var polyfill = function(target, propertyKey) {\n return propertyKey in target;\n };\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/reflect/isextensible.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/defines';\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.isExtensible', function(orig) {\n if (orig) return orig;\n if ($jscomp.ASSUME_ES5 || typeof Object.isExtensible == 'function') {\n return Object.isExtensible;\n }\n return function() { return true; };\n}, 'es6', 'es3');\n","js/es6/reflect/ownkeys.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n'require es6/reflect/reflect';\n'require es6/object/getownpropertysymbols';\n\n\n$jscomp.polyfill('Reflect.ownKeys',\n /**\n * @param {*} orig\n * @return {*}\n * @suppress {reportUnknownTypes}\n */\n function(orig) {\n if (orig) return orig;\n\n var symbolPrefix = 'jscomp_symbol_';\n function isSymbol(key) {\n return key.substring(0, symbolPrefix.length) == symbolPrefix;\n }\n\n /**\n * Polyfill for Reflect.ownKeys() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys\n *\n * Returns an array of the object's own property keys.\n *\n * @param {!Object} target\n * @return {!Array<(string|symbol)>}\n */\n var polyfill = function(target) {\n var keys = [];\n var names = Object.getOwnPropertyNames(target);\n var symbols = Object.getOwnPropertySymbols(target);\n for (var i = 0; i < names.length; i++) {\n (isSymbol(names[i]) ? symbols : keys).push(names[i]);\n }\n return keys.concat(symbols);\n };\n return polyfill;\n}, 'es6', 'es5'); // ES5: Requires Object.getOwnPropertyNames\n","js/es6/reflect/preventextensions.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/defines';\n'require util/polyfill';\n'require es6/reflect/reflect';\n\n\n$jscomp.polyfill('Reflect.preventExtensions', function(orig) {\n if (orig) return orig;\n\n if (!($jscomp.ASSUME_ES5 || typeof Object.preventExtensions == 'function')) {\n return function() { return false; };\n }\n\n /**\n * Polyfill for Reflect.preventExtensions() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions\n *\n * Same function as Object.preventExtensions (the spec says\n * to throw if the input is not an object, but jscompiler will\n * fail to typecheck, so there's no reason to distinguish here).\n *\n * @param {!Object} target\n * @return {boolean}\n */\n var polyfill = function(target) {\n Object.preventExtensions(target);\n return !Object.isExtensible(target);\n };\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/reflect/reflect.js":"/*\n * Copyright 2020 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n// This must execute before any Reflect.* static method polyfills.\n$jscomp.polyfill('Reflect', function(orig) {\n if (orig) return orig;\n return {};\n}, 'es6', 'es3');\n","js/es6/reflect/set.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/reflect/isextensible';\n'require es6/reflect/reflect';\n'require util/finddescriptor';\n'require util/polyfill';\n\n\n$jscomp.polyfill('Reflect.set', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfill for Reflect.set() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set\n *\n * Applies the 'setprop' operator as a function.\n *\n * @param {!Object} target Target on which to get the property.\n * @param {string} propertyKey Name of the property to get.\n * @param {*} value Value to set.\n * @param {!Object=} opt_receiver An optional 'this' to use for a setter.\n * @return {boolean} Whether setting was successful.\n */\n var polyfill = function(target, propertyKey, value, opt_receiver) {\n var property = $jscomp.findDescriptor(target, propertyKey);\n if (!property) {\n if (Reflect.isExtensible(target)) {\n target[propertyKey] = value;\n return true;\n }\n return false;\n }\n if (property.set) {\n property.set.call(arguments.length > 3 ? opt_receiver : target, value);\n return true;\n } else if (property.writable && !Object.isFrozen(target)) {\n target[propertyKey] = value;\n return true;\n }\n return false;\n };\n return polyfill;\n}, 'es6', 'es5'); // ES5: findDescriptor requires getPrototypeOf\n","js/es6/reflect/setprototypeof.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n'require es6/reflect/reflect';\n'require es6/util/setprototypeof';\n\n\n$jscomp.polyfill(\n 'Reflect.setPrototypeOf',\n /**\n * These annotations are intended to match the signature of\n * $jscomp.polyfill(). Being more specific makes the compiler unhappy.\n * @suppress {reportUnknownTypes}\n * @param {?*} orig\n * @return {*}\n */\n function(orig) {\n if (orig) {\n return orig;\n } else if ($jscomp.setPrototypeOf) {\n /** @const {!function(!Object,?Object):!Object} */\n var setPrototypeOf = $jscomp.setPrototypeOf;\n /**\n * @param {!Object} target\n * @param {?Object} proto\n * @return {boolean}\n */\n var polyfill = function(target, proto) {\n try {\n setPrototypeOf(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n };\n return polyfill;\n } else {\n // it isn't possible to implement this method\n return null;\n }\n },\n 'es6', 'es5');\n","js/es6/set.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/conformance';\n'require es6/map';\n'require es6/symbol';\n'require util/defines';\n'require util/polyfill';\n\n$jscomp.polyfill('Set',\n /**\n * @param {*} NativeSet\n * @return {*}\n * @suppress {reportUnknownTypes}\n */\n function(NativeSet) {\n\n /**\n * Checks conformance of the existing Set.\n * @return {boolean} True if the browser's implementation conforms.\n * @suppress {missingProperties} \"entries\" unknown prototype\n */\n function isConformant() {\n if ($jscomp.ASSUME_NO_NATIVE_SET ||\n !NativeSet ||\n typeof NativeSet != \"function\" ||\n !NativeSet.prototype.entries ||\n typeof Object.seal != 'function') {\n return false;\n }\n // Some implementations don't support constructor arguments.\n try {\n NativeSet = /** @type {function(new: Set, !Iterator=)} */ (NativeSet);\n var value = Object.seal({x: 4});\n var set = new NativeSet($jscomp.makeIterator([value]));\n if (!set.has(value) || set.size != 1 || set.add(value) != set ||\n set.size != 1 || set.add({x: 4}) != set || set.size != 2) {\n return false;\n }\n var iter = set.entries();\n var item = iter.next();\n if (item.done || item.value[0] != value || item.value[1] != value) {\n return false;\n }\n item = iter.next();\n if (item.done || item.value[0] == value || item.value[0].x != 4 ||\n item.value[1] != item.value[0]) {\n return false;\n }\n return iter.next().done;\n } catch (err) { // This should hopefully never happen, but let's be safe.\n return false;\n }\n }\n\n if ($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS) {\n if (NativeSet && $jscomp.ES6_CONFORMANCE) return NativeSet;\n } else {\n if (isConformant()) return NativeSet;\n }\n\n /**\n * Polyfill for the global Map data type.\n * @constructor\n * @struct\n * @extends {Set}\n * @implements {Iterable}\n * @template KEY, VALUE\n * @param {!Iterable|!Array|null=} opt_iterable\n * Optional data to populate the set.\n */\n // TODO(sdh): fix param type if heterogeneous arrays ever supported.\n var PolyfillSet = function(opt_iterable) {\n /** @private @const {!Map} */\n this.map_ = new Map();\n if (opt_iterable) {\n var iter = $jscomp.makeIterator(opt_iterable);\n var entry;\n while (!(entry = iter.next()).done) {\n var item = /** @type {!IIterableResult} */ (entry).value;\n this.add(item);\n }\n }\n // Note: this property should not be changed. If we're willing to give up\n // ES3 support, we could define it as a property directly. It should be\n // marked readonly if such an annotation ever comes into existence.\n this.size = this.map_.size;\n };\n\n\n /** @override */\n PolyfillSet.prototype.add = function(value) {\n // normalize -0/+0 to +0\n value = value === 0 ? 0 : value;\n this.map_.set(value, value);\n this.size = this.map_.size;\n return this;\n };\n\n\n /** @override */\n PolyfillSet.prototype.delete = function(value) {\n var result = this.map_.delete(value);\n this.size = this.map_.size;\n return result;\n };\n\n\n /** @override */\n PolyfillSet.prototype.clear = function() {\n this.map_.clear();\n this.size = 0;\n };\n\n\n /** @override */\n PolyfillSet.prototype.has = function(value) {\n return this.map_.has(value);\n };\n\n\n /** @override */\n PolyfillSet.prototype.entries = function() {\n return this.map_.entries();\n };\n\n\n /** @override */\n PolyfillSet.prototype.values = function() {\n return this.map_.values();\n };\n\n\n /** @override */\n PolyfillSet.prototype.keys = PolyfillSet.prototype.values;\n\n\n /** @type {?} */ (PolyfillSet.prototype)[Symbol.iterator] =\n PolyfillSet.prototype.values;\n\n\n /** @override */\n PolyfillSet.prototype.forEach = function(callback, opt_thisArg) {\n var set = this;\n this.map_.forEach(function(value) {\n return callback.call(/** @type {?} */ (opt_thisArg), value, value, set);\n });\n };\n\n\n return PolyfillSet;\n}, 'es6', 'es3');\n","js/es6/string.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Brings in all ES6 String polyfills.\n * @suppress {uselessCode}\n */\n'require es6/string/codepointat';\n'require es6/string/endswith';\n'require es6/string/fromcodepoint';\n'require es6/string/includes';\n'require es6/string/matchall';\n'require es6/string/padend';\n'require es6/string/padstart';\n'require es6/string/repeat';\n'require es6/string/startswith';\n'require es6/string/trimend';\n'require es6/string/trimstart';\n","js/es6/string/codepointat.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.codePointAt', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns the UTF-16 codepoint at the given index.\n *\n *

Polyfills the instance method String.prototype.codePointAt().\n *\n * @this {string}\n * @param {number} position\n * @return {number|undefined} The codepoint.\n */\n var polyfill = function(position) {\n // NOTE: this is taken from v8's harmony-string.js StringCodePointAt\n 'use strict';\n var string = $jscomp.checkStringArgs(this, null, 'codePointAt');\n var size = string.length;\n // Make 'position' a number (non-number coerced to NaN and then or to zero).\n position = Number(position) || 0;\n if (!(position >= 0 && position < size)) {\n return void 0;\n }\n // Truncate 'position' to an integer.\n position = position | 0;\n var first = string.charCodeAt(position);\n if (first < 0xD800 || first > 0xDBFF || position + 1 === size) {\n return first;\n }\n var second = string.charCodeAt(position + 1);\n if (second < 0xDC00 || second > 0xDFFF) {\n return first;\n }\n return (first - 0xD800) * 0x400 + second + 0x2400;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/string/endswith.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.endsWith', function(orig) {\n if (orig) return orig;\n\n /**\n * Tests whether the string ends with a given substring.\n *\n *

Polyfills the instance method String.prototype.endsWith().\n *\n * @this {string}\n * @param {string} searchString\n * @param {number=} opt_position\n * @return {boolean}\n */\n var polyfill = function(searchString, opt_position) {\n 'use strict';\n var string = $jscomp.checkStringArgs(this, searchString, 'endsWith');\n searchString = searchString + '';\n if (opt_position === void 0) opt_position = string.length;\n var i = Math.max(0, Math.min(opt_position | 0, string.length));\n var j = searchString.length;\n while (j > 0 && i > 0) {\n if (string[--i] != searchString[--j]) return false;\n }\n return j <= 0;\n };\nreturn polyfill;\n}, 'es6', 'es3');\n","js/es6/string/fromcodepoint.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/polyfill';\n\n$jscomp.polyfill('String.fromCodePoint', function(orig) {\n if (orig) return orig;\n\n /**\n * Creates a new string from the given codepoints.\n *\n *

Polyfills the static function String.fromCodePoint().\n *\n * @param {...number} var_args\n * @return {string}\n */\n var polyfill = function(var_args) {\n // Note: this is taken from v8's harmony-string.js StringFromCodePoint.\n var result = '';\n for (var i = 0; i < arguments.length; i++) {\n var code = Number(arguments[i]);\n if (code < 0 || code > 0x10FFFF || code !== Math.floor(code)) {\n throw new RangeError('invalid_code_point ' + code);\n }\n if (code <= 0xFFFF) {\n result += String.fromCharCode(code);\n } else {\n code -= 0x10000;\n result += String.fromCharCode((code >>> 10) & 0x3FF | 0xD800);\n result += String.fromCharCode(code & 0x3FF | 0xDC00);\n }\n }\n return result;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/string/includes.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.includes', function(orig) {\n if (orig) return orig;\n\n /**\n * Searches for a substring, starting at the given position.\n *\n *

Polyfills the instance method String.prototype.includes().\n *\n * @this {string}\n * @param {string} searchString\n * @param {number=} opt_position\n * @return {boolean}\n */\n var polyfill = function(searchString, opt_position) {\n 'use strict';\n var string = $jscomp.checkStringArgs(this, searchString, 'includes');\n return string.indexOf(searchString, opt_position || 0) !== -1;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/string/matchall.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require es6/symbol';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.matchAll', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns an iterator of all results matching a string against a\n * regular expression, including capturing groups.\n *\n * Polyfills the instance method String.prototype.matchAll().\n *\n * The spec calls for any non-RegExp object to be automatically converted,\n * so we accept anything here, even though our externs only allow\n * RegExp|string.\n *\n * @this {string}\n * @param {*} regexp\n * A regular expression object. If a non-RegExp object obj is passed,\n * it is implicitly converted to a RegExp with a global tag by using\n * new RegExp(obj).\n * @return {!IteratorIterable}\n */\n var polyfill = function(regexp) {\n if (regexp instanceof RegExp && !regexp.global) {\n throw new TypeError('RegExp passed into String.prototype.matchAll() must have global tag.');\n }\n var /** !RegExp */ regexCopy =\n new RegExp(regexp, regexp instanceof RegExp ? undefined : 'g');\n var matchString = this;\n var /** boolean */ finished = false;\n var matchAllIterator = {\n next: function() {\n var result = {};\n var previousIndex = regexCopy.lastIndex;\n if (finished) {\n return {value: undefined, done: true};\n }\n var match = regexCopy.exec(matchString);\n if (!match) {\n finished = true;\n return {value: undefined, done: true};\n }\n if (regexCopy.lastIndex === previousIndex) {\n // matchAll() is not allowed to get \"stuck\" returning an empty\n // string match infinitely, so we must make sure lastIndex always\n // increases.\n regexCopy.lastIndex += 1;\n }\n result.value = match;\n result.done = false;\n return result;\n }\n };\n matchAllIterator[Symbol.iterator] = function() { return matchAllIterator; };\n return /**@type {!IteratorIterable}> */ (matchAllIterator);\n };\n return polyfill;\n}, 'es_2020', 'es3');\n","js/es6/string/padend.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/stringpadding';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.padEnd', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfills String.prototype.padEnd.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd\n *\n * @this {string}\n * @param {number} targetLength\n * @param {string=} opt_padString\n * @return {string}\n */\n var padEnd = function(targetLength, opt_padString) {\n var string = $jscomp.checkStringArgs(this, null, 'padStart');\n var padLength = targetLength - string.length;\n return string + $jscomp.stringPadding(opt_padString, padLength);\n };\n\n return padEnd;\n}, 'es8', 'es3');\n","js/es6/string/padstart.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/polyfill';\n'require util/stringpadding';\n\n$jscomp.polyfill('String.prototype.padStart', function(orig) {\n if (orig) return orig;\n\n /**\n * Polyfills String.prototype.padStart.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\n *\n * @this {string}\n * @param {number} targetLength\n * @param {string=} opt_padString\n * @return {string}\n */\n var padStart = function(targetLength, opt_padString) {\n var string = $jscomp.checkStringArgs(this, null, 'padStart');\n var padLength = targetLength - string.length;\n return $jscomp.stringPadding(opt_padString, padLength) + string;\n };\n\n return padStart;\n}, 'es8', 'es3');\n","js/es6/string/repeat.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.repeat', function(orig) {\n if (orig) return orig;\n\n /**\n * Returns a new string repeated the given number of times.\n *\n *

Polyfills the instance method String.prototype.repeat().\n *\n * @this {string}\n * @param {number} copies\n * @return {string}\n */\n var polyfill = function(copies) {\n 'use strict';\n var string = $jscomp.checkStringArgs(this, null, 'repeat');\n if (copies < 0 || copies > 0x4FFFFFFF) { // impose a 1GB limit\n throw new RangeError('Invalid count value');\n }\n copies = copies | 0; // cast to a signed integer.\n var result = '';\n while (copies) {\n if (copies & 1) result += string;\n if ((copies >>>= 1)) string += string;\n }\n return result;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/string/startswith.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require util/checkstringargs';\n'require util/polyfill';\n\n$jscomp.polyfill('String.prototype.startsWith', function(orig) {\n if (orig) return orig;\n\n /**\n * Tests whether the string starts with a given substring.\n *\n *

Polyfills the instance method String.prototype.startsWith().\n *\n * @this {string}\n * @param {string} searchString\n * @param {number=} opt_position\n * @return {boolean}\n */\n var polyfill = function(searchString, opt_position) {\n 'use strict';\n var string = $jscomp.checkStringArgs(this, searchString, 'startsWith');\n searchString = searchString + '';\n var strLen = string.length;\n var searchLen = searchString.length;\n var i = Math.max(\n 0,\n Math.min(/** @type {number} */ (opt_position) | 0, string.length));\n var j = 0;\n while (j < searchLen && i < strLen) {\n if (string[i++] != searchString[j++]) return false;\n }\n return j >= searchLen;\n };\n\n return polyfill;\n}, 'es6', 'es3');\n","js/es6/string/trimend.js":"/*\n * Copyright 2019 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n\n// Most browsers implemented trimRight around ES5-time-frame, but it wasn't\n// officially part of the language specification until ES_2019, so we have\n// to provide a polyfill for it.\n// IE11 doesn't have it, of course...\n$jscomp.polyfill('String.prototype.trimRight', function(orig) {\n /**\n * @this {string}\n * @return {string}\n */\n function polyfill() {\n return this.replace(/[\\s\\xa0]+$/, '');\n }\n return orig || polyfill;\n}, 'es_2019', 'es3');\n\n$jscomp.polyfill('String.prototype.trimEnd', function(orig) {\n return orig || String.prototype.trimRight;\n}, 'es_2019', 'es3');\n","js/es6/string/trimstart.js":"/*\n * Copyright 2019 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/polyfill';\n\n// Most browsers implemented trimLeft around ES5-time-frame, but it wasn't\n// officially part of the language specification until ES_2019, so we have\n// to provide a polyfill for it.\n// IE11 doesn't have it, of course...\n$jscomp.polyfill('String.prototype.trimLeft', function(orig) {\n /**\n * @this {string}\n * @return {string}\n */\n function polyfill() {\n return this.replace(/^[\\s\\xa0]+/, '');\n }\n return orig || polyfill;\n}, 'es_2019', 'es3');\n\n$jscomp.polyfill('String.prototype.trimStart', function(orig) {\n return orig || String.prototype.trimLeft;\n}, 'es_2019', 'es3');\n","js/es6/symbol.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Symbol polyfill.\n * @suppress {uselessCode}\n */\n\n'require es6/util/arrayiterator';\n'require util/defineproperty';\n'require util/global';\n'require util/polyfill';\n\n/**\n * Initializes the Symbol function.\n * @noinline\n */\n// TODO(rishipal): Remove this function\n$jscomp.initSymbol = function() {};\n\n$jscomp.polyfill('Symbol', function(orig) {\n if (orig) return orig; // no polyfill needed\n\n /**\n * @struct @constructor\n * @param {string} id\n * @param {string=} opt_description\n */\n var SymbolClass = function(id, opt_description) {\n /** @private @const {string} */\n this.$jscomp$symbol$id_ = id;\n\n /** @const {string|undefined} */\n this.description;\n\n // description is read-only.\n $jscomp.defineProperty(\n this, 'description',\n {configurable: true, writable: true, value: opt_description});\n };\n\n\n /** @override */\n SymbolClass.prototype.toString = function() {\n return this.$jscomp$symbol$id_;\n };\n\n\n /** @const {string} */\n var SYMBOL_PREFIX = 'jscomp_symbol_';\n\n var counter = 0;\n\n /**\n * Produces \"symbols\" (actually just unique strings).\n * @param {string=} opt_description\n * @return {!SymbolClass}\n * @this {?Object}\n */\n var symbolPolyfill = function(opt_description) {\n if (this instanceof symbolPolyfill) {\n throw new TypeError('Symbol is not a constructor');\n }\n return (new SymbolClass(\n SYMBOL_PREFIX + (opt_description || '') + '_' + (counter++),\n opt_description));\n };\n\n return symbolPolyfill;\n}, 'es6', 'es3');\n\n/**\n * Initializes Symbol.iterator (if it's not already defined) and adds a\n * Symbol.iterator property to the Array prototype.\n */\n// TODO(rishipal): Remove this function\n$jscomp.initSymbolIterator = function() {};\n\n$jscomp.polyfill('Symbol.iterator', function(orig) {\n if (orig) return orig; // no polyfill needed\n\n var symbolIterator = Symbol('Symbol.iterator');\n\n // Polyfill 'Symbol.iterator' onto Array and the various TypedArray* objects.\n // This array uses strings to index into $jscomp.global because the TypedArray\n // objects are present in IE11 but not on older browsers. Using bracket access\n // saves code size compared to `typeof Int8Array === 'function' && Int8Array`.\n var /** !Array */ arrayLikes = [\n 'Array',\n // List taken from https://tc39.es/ecma262/#sec-typedarray-objects.\n // The BigInt*Arrays are intentionally omitted because they are only present\n // in browsers where Symbol is fully supported.\n 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',\n 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n\n for (var i = 0; i < arrayLikes.length; i++) {\n var ArrayLikeCtor = /** @type {*} */ ($jscomp.global[arrayLikes[i]]);\n if (typeof ArrayLikeCtor === 'function' &&\n typeof ArrayLikeCtor.prototype[symbolIterator] != 'function') {\n $jscomp.defineProperty(ArrayLikeCtor.prototype, symbolIterator, {\n configurable: true,\n writable: true,\n /**\n * @this {IArrayLike}\n * @return {!IteratorIterable}\n */\n value: function() {\n return $jscomp.iteratorPrototype($jscomp.arrayIteratorImpl(this));\n }\n });\n }\n }\n return symbolIterator;\n}, 'es6', 'es3');\n\n/**\n * Initializes Symbol.asyncIterator (if it's not already defined)\n */\n// TODO(rishipal): Remove this function\n$jscomp.initSymbolAsyncIterator = function() {};\n\n$jscomp.polyfill('Symbol.asyncIterator', function(orig) {\n if (orig) {\n return orig;\n }\n return Symbol('Symbol.asyncIterator');\n}, 'es9', 'es3');\n\n/**\n * Returns an iterator with the given `next` method. Passing\n * all iterators through this function allows easily extending\n * the definition of `%IteratorPrototype%` if methods are ever\n * added to it in the future.\n *\n * @param {function(this: Iterator): T} next\n * @return {!IteratorIterable}\n * @template T\n */\n$jscomp.iteratorPrototype = function(next) {\n var iterator = {next: next};\n /**\n * @this {IteratorIterable}\n * @return {!IteratorIterable}\n */\n iterator[Symbol.iterator] = function() {\n return this;\n };\n return /** @type {!IteratorIterable} */ (iterator);\n};\n","js/es6/util/arrayfromiterable.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Polyfill for array destructuring.\n */\n'require es6/util/makeiterator';\n'require es6/util/arrayfromiterator';\n\n\n/**\n * Copies the values from an Iterable into an Array.\n * @param {string|!Array|!Iterable|!Arguments} iterable\n * @return {!Array}\n * @template T\n */\n$jscomp.arrayFromIterable = function(iterable) {\n if (iterable instanceof Array) {\n return iterable;\n } else {\n return $jscomp.arrayFromIterator($jscomp.makeIterator(iterable));\n }\n};\n","js/es6/util/arrayfromiterator.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Polyfill for array destructuring.\n */\n'require base';\n\n\n/**\n * Copies the values from an Iterator into an Array. The important difference\n * between this and $jscomp.arrayFromIterable is that if the iterator's\n * next() method has already been called one or more times, this method returns\n * only the values that haven't been yielded yet.\n * @param {!Iterator} iterator\n * @return {!Array}\n * @template T\n * @suppress {reportUnknownTypes}\n */\n$jscomp.arrayFromIterator = function(iterator) {\n var i;\n var arr = [];\n while (!(i = iterator.next()).done) {\n arr.push(i.value);\n }\n return arr;\n};\n","js/es6/util/arrayiterator.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Utility method for creating an iterator for Arrays.\n */\n'require base';\n\n/**\n * Returns an internal iterator from the given array.\n * @param {!IArrayLike} array\n * @return {function():!IIterableResult}\n * @template T\n */\n$jscomp.arrayIteratorImpl = function(array) {\n var index = 0;\n return function() {\n if (index < array.length) {\n return {\n done: false,\n value: array[index++],\n };\n } else {\n return {done: true};\n }\n };\n};\n\n/**\n * Returns an internal iterator from the given array.\n * @param {!Array} array\n * @return {!Iterator}\n * @template T\n */\n$jscomp.arrayIterator = function(array) {\n return /** @type {!Iterator} */ ({next: $jscomp.arrayIteratorImpl(array)});\n};\n\n","js/es6/util/assign.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n'require util/owns';\n'require util/polyfill';\n'require util/shouldpolyfill';\n\n/**\n * Equivalent to the Object.assign() method, but guaranteed to be available for use in code\n * generated by the compiler.\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n *\n * Copies values of all enumerable own properties from one or more\n * sources to the given target object, and returns the target.\n *\n * @final\n * @param {!Object} target The target object onto which to copy.\n * @param {...?Object} var_args The source objects.\n * @return {!Object} The target object is returned.\n */\n$jscomp.assign =\n ($jscomp.TRUST_ES6_POLYFILLS && typeof Object.assign == 'function') ?\n Object.assign :\n /**\n * @param {!Object} target\n * @param {...?Object} var_args\n * @return {!Object}\n * @suppress {reportUnknownTypes}\n */\n function(target, var_args) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n if (!source) continue;\n for (var key in source) {\n if ($jscomp.owns(source, key)) target[key] = source[key];\n }\n }\n return target;\n };\n","js/es6/util/construct.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n\n'require util/objectcreate';\n'require util/polyfill';\n'require util/shouldpolyfill';\n\n/**\n * Find or create a method that implements the behavior of `Reflect.construct`.\n *\n * @return {!Function}\n */\n$jscomp.getConstructImplementation = function() {\n // Check for https://github.com/Microsoft/ChakraCore/issues/3217\n /** @return {boolean} */\n function reflectConstructWorks() {\n /** @constructor */ function Base() {}\n /** @constructor */ function Derived() {}\n new Base();\n Reflect.construct(Base, [], Derived);\n return new Base() instanceof Base;\n }\n\n if ($jscomp.TRUST_ES6_POLYFILLS && typeof Reflect != 'undefined' &&\n Reflect.construct) {\n if (reflectConstructWorks()) return Reflect.construct;\n var brokenConstruct = Reflect.construct;\n /**\n * @param {function(new: ?, ...?)} target The constructor to call.\n * @param {!Array} argList The arguments as a list.\n * @param {function(new: TARGET, ...?)=} opt_newTarget The constructor to\n * instantiate.\n * @return {TARGET} The result of the function call.\n * @template TARGET\n * @suppress {reportUnknownTypes}\n */\n var patchedConstruct = function(target, argList, opt_newTarget) {\n var out = brokenConstruct(target, argList);\n if (opt_newTarget) Reflect.setPrototypeOf(out, opt_newTarget.prototype);\n return out;\n };\n return patchedConstruct;\n }\n\n /**\n * @param {function(new: ?, ...?)} target The constructor to call.\n * @param {!Array} argList The arguments as a list.\n * @param {function(new: TARGET, ...?)=} opt_newTarget The constructor to\n * instantiate.\n * @return {TARGET} The result of the function call.\n * @template TARGET\n * @suppress {reportUnknownTypes}\n */\n function construct(target, argList, opt_newTarget) {\n if (opt_newTarget === undefined) opt_newTarget = target;\n var proto = opt_newTarget.prototype || Object.prototype;\n var obj = $jscomp.objectCreate(proto);\n var apply = Function.prototype.apply;\n var out = apply.call(target, obj, argList);\n return out || obj;\n }\n return construct;\n};\n\n/**\n * Polyfill for Reflect.construct() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct\n *\n * The call to `$jscomp.getConstructImplementation()` is wrapped up as an object\n * literal `valueOf()` call in order to hide the (meaningless) side-effects\n * it contains that would otherwise prevent its definition from being removed,\n * even when nothing refers to `$jscomp.construct`.\n * @const\n */\n$jscomp.construct =\n /** @type {typeof Reflect.construct} */ (\n {valueOf: $jscomp.getConstructImplementation}.valueOf());\n","js/es6/util/createtemplatetagfirstarg.js":"/*\n * Copyright 2020 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Polyfill for a tagged template's argument\n * @suppress {uselessCode}\n */\n'require base';\n\n/**\n * Simply accepts an ITemplateArray and returns it after setting its raw\n * property\n * @param {!ITemplateArray} arrayStrings\n * @return {!ITemplateArray}\n * @noinline\n */\n$jscomp.createTemplateTagFirstArg = function(arrayStrings) {\n arrayStrings.raw = arrayStrings;\n return /** @type {!ITemplateArray} */ (arrayStrings);\n};\n\n/**\n * Simply accepts an ITemplateArray and returns it after setting its raw\n * property\n * @param {!ITemplateArray} arrayStrings\n * @param {!ITemplateArray} rawArrayStrings raw string values of arrayString\n * @return {!ITemplateArray}\n * @noinline\n */\n$jscomp.createTemplateTagFirstArgWithRaw = function(\n arrayStrings, rawArrayStrings) {\n arrayStrings.raw = rawArrayStrings;\n return /** @type {!ITemplateArray} */ (arrayStrings);\n};\n","js/es6/util/inherits.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Polyfill for ES6 extends keyword.\n * @suppress {uselessCode}\n */\n'require base';\n'require util/objectcreate';\n'require es6/util/setprototypeof';\n\n\n/**\n * Inherit the prototype methods and static methods from one constructor\n * into another.\n *\n * This wires up the prototype chain (like goog.inherits) and copies static\n * properties, for ES6-to-ES{3,5} transpilation.\n *\n * Usage:\n *

\n *   function ParentClass() {}\n *\n *   // Regular method.\n *   ParentClass.prototype.foo = function(a) {};\n *\n *   // Static method.\n *   ParentClass.bar = function() {};\n *\n *   function ChildClass() {\n *     ParentClass.call(this);\n *   }\n *   $jscomp.inherits(ChildClass, ParentClass);\n *\n *   var child = new ChildClass();\n *   child.foo();\n *   ChildClass.bar();  // Static inheritance.\n * 
\n *\n * @param {!Function} childCtor Child class.\n * @param {!Function} parentCtor Parent class.\n * @suppress {strictMissingProperties} 'superClass_' is not defined on Function\n */\n$jscomp.inherits = function(childCtor, parentCtor) {\n childCtor.prototype = $jscomp.objectCreate(parentCtor.prototype);\n /** @override */ childCtor.prototype.constructor = childCtor;\n if ($jscomp.setPrototypeOf) {\n // avoid null dereference warning\n /** @const {!Function} */\n var setPrototypeOf = $jscomp.setPrototypeOf;\n setPrototypeOf(childCtor, parentCtor);\n } else {\n // setPrototypeOf is not available so we need to copy the static\n // methods to the child\n for (var p in parentCtor) {\n if (p == 'prototype') {\n // Don't copy parentCtor.prototype to childCtor.\n continue;\n }\n if (Object.defineProperties) {\n var descriptor = Object.getOwnPropertyDescriptor(parentCtor, p);\n if (descriptor) {\n Object.defineProperty(childCtor, p, descriptor);\n }\n } else {\n // Pre-ES5 browser. Just copy with an assignment.\n childCtor[p] = parentCtor[p];\n }\n }\n }\n\n childCtor.superClass_ = parentCtor.prototype;\n};\n","js/es6/util/iteratorfromarray.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Utilities for iterator-returning methods.\n */\n'require es6/symbol';\n\n\n/**\n * Creates an iterator from an array-like, with a transformation function.\n * @param {!IArrayLike} array\n * @param {function(number, INPUT): OUTPUT} transform\n * @return {!IteratorIterable}\n * @template INPUT, OUTPUT\n * @suppress {checkTypes|reportUnknownTypes}\n */\n$jscomp.iteratorFromArray = function(array, transform) {\n // NOTE: IE8 doesn't support indexing from boxed Strings.\n if (array instanceof String) array = array + '';\n var i = 0;\n var iter = {\n next: function() {\n if (i < array.length) {\n var index = i++;\n return {value: transform(index, array[index]), done: false};\n }\n iter.next = function() { return {done: true, value: void 0}; };\n return iter.next();\n }\n };\n iter[Symbol.iterator] = function() { return iter; };\n return iter;\n};\n","js/es6/util/makeasynciterator.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Polyfill for for-of loops.\n */\n'require es6/symbol';\n'require es6/util/makeiterator';\n\n/**\n * Creates an iterator for the given iterable.\n *\n * @param {string|!AsyncIterable|!Iterable|!Iterator|!Arguments} iterable\n * @return {!AsyncIteratorIterable}\n * @template T\n * @suppress {reportUnknownTypes}\n */\n$jscomp.makeAsyncIterator = function(iterable) {\n var asyncIteratorFunction = (iterable)[Symbol.asyncIterator];\n if (asyncIteratorFunction !== undefined) {\n return asyncIteratorFunction.call(iterable);\n }\n return new $jscomp.AsyncIteratorFromSyncWrapper($jscomp.makeIterator(\n /** @type {string|!Iterable|!Iterator|!Arguments} */\n (iterable)));\n};\n\n/**\n *\n * @param {!Iterator} iterator\n * @constructor\n * @implements {AsyncIteratorIterable}\n * @template T\n * @suppress {reportUnknownTypes}\n */\n$jscomp.AsyncIteratorFromSyncWrapper = function(iterator) {\n /**\n * @return {!AsyncIterator}\n */\n this[Symbol.asyncIterator] = function() {\n return this;\n };\n\n /**\n * @return {!Iterator>>}\n */\n this[Symbol.iterator] = function() {\n return iterator;\n };\n\n /**\n * @param {?=} param\n * @return {!Promise>}\n */\n this.next = function(param) {\n return Promise.resolve(iterator.next(param));\n };\n\n if (iterator['throw'] !== undefined) {\n /**\n * @param {?} param\n * @return {!Promise>}\n */\n this['throw'] = function(param) {\n return Promise.resolve(iterator['throw'](param));\n };\n }\n\n if (iterator['return'] !== undefined) {\n /**\n * @param {T} param\n * @return {!Promise>}\n */\n this['return'] = function(param) {\n return Promise.resolve(iterator['return'](param));\n };\n }\n};\n","js/es6/util/makeiterator.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Polyfill for for-of loops.\n */\n'require es6/util/arrayiterator';\n\n/**\n * Creates an iterator for the given iterable. This iterator should never\n * be exposed to user code.\n *\n * @param {string|!Iterable|!Iterator|!Arguments} iterable\n * @return {!Iterator}\n * @template T\n * @suppress {reportUnknownTypes}\n */\n$jscomp.makeIterator = function(iterable) {\n // NOTE: Disabling typechecking because [] not allowed on @struct.\n var iteratorFunction = typeof Symbol != 'undefined' && Symbol.iterator &&\n (/** @type {?} */ (iterable)[Symbol.iterator]);\n return iteratorFunction ? iteratorFunction.call(iterable) :\n $jscomp.arrayIterator(/** @type {!Array} */ (iterable));\n};\n","js/es6/util/setprototypeof.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n\n'require util/defines';\n'require util/polyfill';\n'require util/shouldpolyfill';\n\n/**\n * @suppress {missingProperties,reportUnknownTypes}\n * @return {boolean}\n */\n$jscomp.underscoreProtoCanBeSet = function() {\n var x = {a: true};\n var y = {};\n try {\n y.__proto__ = x;\n return y.a;\n } catch (e) {\n // __proto__ property is readonly (possibly IE 10?)\n }\n return false;\n};\n\n/**\n * If we can implement it, this will be a function that attempts to set the\n * prototype of an object, otherwise it will be `null`.\n *\n * It returns the first argument if successful. Throws a `TypeError` if the\n * object is not extensible.\n *\n * @type {null|function(!Object, ?Object): !Object}\n */\n$jscomp.setPrototypeOf = ($jscomp.TRUST_ES6_POLYFILLS &&\n typeof Object.setPrototypeOf == 'function') ?\n Object.setPrototypeOf :\n $jscomp.underscoreProtoCanBeSet() ? function(target, proto) {\n target.__proto__ = proto;\n if (target.__proto__ !== proto) {\n throw new TypeError(target + ' is not extensible');\n }\n return target;\n } : null;\n","js/es6/weakmap.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/conformance';\n'require es6/util/makeiterator';\n'require util/defineproperty';\n'require util/defines';\n'require util/owns';\n'require util/polyfill';\n\n$jscomp.polyfill('WeakMap',\n /**\n * @param {*} NativeWeakMap\n * @return {*}\n * @suppress {reportUnknownTypes}\n */\n function(NativeWeakMap) {\n /**\n * Checks conformance of the existing WeakMap.\n * @return {boolean} True if the browser's implementation conforms.\n */\n function isConformant() {\n if (!NativeWeakMap || !Object.seal) return false;\n try {\n var x = Object.seal({});\n var y = Object.seal({});\n var map = new /** @type {function(new: WeakMap, !Array)} */ (\n NativeWeakMap)([[x, 2], [y, 3]]);\n if (map.get(x) != 2 || map.get(y) != 3) return false;\n map.delete(x);\n map.set(y, 4);\n return !map.has(x) && map.get(y) == 4;\n } catch (err) { // This should hopefully never happen, but let's be safe.\n return false;\n }\n }\n if ($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS) {\n if (NativeWeakMap && $jscomp.ES6_CONFORMANCE) return NativeWeakMap;\n } else {\n if (isConformant()) return NativeWeakMap;\n }\n\n var prop = '$jscomp_hidden_' + Math.random();\n\n /** @constructor */\n function WeakMapMembership() {}\n\n /**\n * Returns whether the argument is a valid WeakMap key.\n * @param {*} key\n * @return {boolean}\n */\n function isValidKey(key) {\n var type = typeof key;\n return (type === 'object' && key !== null) || type === 'function';\n }\n\n /**\n * Inserts the hidden property into the target.\n * @param {!Object} target\n */\n function insert(target) {\n if (!$jscomp.owns(target, prop)) {\n var obj = new WeakMapMembership();\n // TODO(sdh): This property will be enumerated in IE8. If this becomes\n // a problem, we could avoid it by copying an infrequently-used non-enum\n // method (like toLocaleString) onto the object itself and encoding the\n // property on the copy instead. This codepath must be easily removable\n // if IE8 support is not needed.\n $jscomp.defineProperty(target, prop, {value: obj});\n }\n }\n\n /**\n * Monkey-patches the freezing methods to ensure that the hidden\n * property is added before any freezing happens.\n * @param {string} name\n */\n function patch(name) {\n if ($jscomp.ISOLATE_POLYFILLS) {\n // Monkey-patching Object.freeze and friends can cause bad interactions\n // with third-party code. This means that polyfill isolation does not\n // support inserting frozen objects as keys into a WeakMap.\n return;\n }\n var prev = Object[name];\n if (prev) {\n Object[name] = function(target) {\n if (target instanceof WeakMapMembership) {\n return target;\n } else {\n if (Object.isExtensible(target)) {\n insert(target);\n }\n return prev(target);\n }\n };\n }\n }\n patch('freeze');\n patch('preventExtensions');\n patch('seal');\n // Note: no need to patch Reflect.preventExtensions since the polyfill\n // just calls Object.preventExtensions anyway (and if it's not polyfilled\n // then neither is WeakMap).\n\n var index = 0;\n\n /**\n * Polyfill for WeakMap:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap\n *\n * This implementation is as non-leaky as possible, due to patching\n * the freezing and sealing operations. It does not include any logic\n * to handle cases where a key was somehow made non-extensible without\n * the special hidden property being added. It takes some care to ensure\n * the hidden property is not enumerated over nor discoverable, though\n * it's not completely secure (particularly in IE8).\n *\n * @constructor\n * @extends {WeakMap}\n * @template KEY, VALUE\n * @param {!Iterator>|!Array>|null=}\n * opt_iterable Optional initial data.\n */\n var PolyfillWeakMap = function(opt_iterable) {\n /** @private @const {string} */\n this.id_ = (index += (Math.random() + 1)).toString();\n\n if (opt_iterable) {\n var iter = $jscomp.makeIterator(opt_iterable);\n var entry;\n while (!(entry = iter.next()).done) {\n var item = entry.value;\n this.set(/** @type {KEY} */ (item[0]), /** @type {VALUE} */ (item[1]));\n }\n }\n };\n\n /** @override */\n PolyfillWeakMap.prototype.set = function(key, value) {\n if (!isValidKey(key)) {\n throw new Error('Invalid WeakMap key');\n }\n insert(key);\n if (!$jscomp.owns(key, prop)) {\n // NOTE: If the insert() call fails on the key, but the property\n // has previously successfully been added higher up the prototype\n // chain, then we'll silently misbehave. Instead, throw immediately\n // before doing something bad. If this becomes a problem (e.g. due\n // to some rogue frozen objects) then we may need to add a slow and\n // leaky fallback array to each WeakMap instance, as well as extra\n // logic in each accessor to use it (*only*) when necessary.\n throw new Error('WeakMap key fail: ' + key);\n }\n key[prop][this.id_] = value;\n return this;\n };\n\n /** @override */\n PolyfillWeakMap.prototype.get = function(key) {\n return isValidKey(key) && $jscomp.owns(key, prop) ? key[prop][this.id_] :\n undefined;\n };\n\n /** @override */\n PolyfillWeakMap.prototype.has = function(key) {\n return isValidKey(key) && $jscomp.owns(key, prop) &&\n $jscomp.owns(key[prop], this.id_);\n };\n\n /** @override */\n PolyfillWeakMap.prototype.delete = function(key) {\n if (!isValidKey(key) || !$jscomp.owns(key, prop) ||\n !$jscomp.owns(key[prop], this.id_)) {\n return false;\n }\n return delete key[prop][this.id_];\n };\n\n return PolyfillWeakMap;\n}, 'es6', 'es3');\n","js/es6/weakset.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/conformance';\n'require es6/util/makeiterator';\n'require util/polyfill';\n'require es6/weakmap';\n\n$jscomp.polyfill('WeakSet',\n /**\n * @param {*} NativeWeakSet\n * @return {*}\n * @suppress {reportUnknownTypes}\n */\n function(NativeWeakSet) {\n /**\n * Checks conformance of the existing WeakSet.\n * @return {boolean} True if the browser's implementation conforms.\n */\n function isConformant() {\n if (!NativeWeakSet || !Object.seal) return false;\n try {\n var x = Object.seal({});\n var y = Object.seal({});\n var set = new /** @type {function(new: WeakSet, !Array)} */ (\n NativeWeakSet)([x]);\n if (!set.has(x) || set.has(y)) return false;\n set.delete(x);\n set.add(y);\n return !set.has(x) && set.has(y);\n } catch (err) { // This should hopefully never happen, but let's be safe.\n return false;\n }\n }\n if ($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS) {\n if (NativeWeakSet && $jscomp.ES6_CONFORMANCE) return NativeWeakSet;\n } else {\n if (isConformant()) return NativeWeakSet;\n }\n\n /**\n * @constructor\n * @extends {WeakSet}\n * @template TYPE\n * @param {!Iterator|!Array|null=} opt_iterable\n */\n var PolyfillWeakSet = function(opt_iterable) {\n /** @private @const {!WeakMap} */\n this.map_ = new WeakMap();\n\n if (opt_iterable) {\n var iter = $jscomp.makeIterator(opt_iterable);\n var entry;\n while (!(entry = iter.next()).done) {\n var item = entry.value;\n this.add(item);\n }\n }\n };\n\n /** @override */\n PolyfillWeakSet.prototype.add = function(elem) {\n this.map_.set(elem, true);\n return this;\n };\n\n /** @override */\n PolyfillWeakSet.prototype.has = function(elem) {\n return this.map_.has(elem);\n };\n\n /** @override */\n PolyfillWeakSet.prototype.delete = function(elem) {\n return this.map_.delete(elem);\n };\n\n return PolyfillWeakSet;\n}, 'es6', 'es3');\n","js/es6_dart_runtime.js":"/*\n * Copyright 2014 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Additional runtime functions required for transpilation from\n * ES6 to ES5 of code generated by the Dart Dev Compiler.\n *\n * Note that DDC's output cannot currently be lowered to ES3 (heavy use of\n * getters or setters, including in the runtime), so these helpers make no\n * attempt of fallback behaviour when methods like Object.getPrototypeOf or\n * Object.getOwnPropertyDescriptor are undefined (unlike helpers in es6/*.js).\n */\n'require base';\n\n/**\n * Gets a property descriptor for a target instance, skipping its class\n * and walking up the super-classes hierarchy.\n *\n * @private\n * @param {!Object} target\n * @param {!string} name\n * @return {?}\n */\n$jscomp.getSuperPropertyDescriptor_ = function(target, name) {\n var getPrototypeOf = Object.getPrototypeOf;\n var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n var cls = getPrototypeOf(target);\n while (cls != null) {\n cls = getPrototypeOf(cls);\n if (cls != null) {\n var desc = getOwnPropertyDescriptor(cls, name);\n if (desc != null) {\n return desc;\n }\n }\n }\n return undefined;\n};\n\n/**\n * Gets a property of a target instance using its super class getter or value,\n * or returns undefined if that property is not defined on any ancestor.\n *\n * @param {!Object} target\n * @param {!string} propertyName\n * @return {*}\n */\n$jscomp.superGet = function(target, propertyName) {\n var desc = $jscomp.getSuperPropertyDescriptor_(target, propertyName);\n return desc && (desc.get ? desc.get.call(target) : desc.value);\n};\n\n/**\n * Sets a property on a target instance using its super setter if is defined\n * on any ancestor, or setting it as a simple property on the target otherwise.\n *\n * @template T\n * @param {!Object} target\n * @param {!string} propertyName\n * @param {T} value\n * @return {T}\n */\n$jscomp.superSet = function(target, propertyName, value) {\n var desc = $jscomp.getSuperPropertyDescriptor_(target, propertyName);\n if (desc) {\n if (!desc.set) {\n throw new TypeError('No setter for super.' + propertyName);\n }\n desc.set.call(target, value);\n } else {\n target[propertyName] = value;\n }\n return value;\n};\n","js/es6_runtime.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Assorted runtime logic code and polyfills.\n * @suppress {uselessCode}\n */\n'require es6/array';\n'require es6/async_generator_wrapper';\n'require es6/execute_async_generator';\n'require es6/generator_engine';\n'require es6/globalthis';\n'require es6/map';\n'require es6/math';\n'require es6/number';\n'require es6/object';\n'require es6/promise';\n'require es6/reflect';\n'require es6/set';\n'require es6/string';\n'require es6/symbol';\n'require es6/util/createtemplatetagfirstarg';\n'require es6/util/arrayfromiterable';\n'require es6/util/arrayfromiterator';\n'require es6/util/inherits';\n'require es6/util/iteratorfromarray';\n'require es6/util/makeiterator';\n'require es6/weakmap';\n'require es6/weakset';\n","js/modules.js":"/*\n * Copyright 2018 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview\n * @suppress {uselessCode}\n */\n\n'require es6/modules/runtime';\n","js/runtime_type_check.js":"/*\n * Copyright 2010 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview Provides the boilerplate code for run-time type checking.\n *\n *\n * @suppress {uselessCode} The require statements below are not useless.\n */\n'require base';\n\n/** @const */\n$jscomp.typecheck = {};\n\n/**\n * A state variable to suspend checking, to avoid infinite calls\n * caused by calling checked code from the checking functions.\n *\n * @type {boolean}\n */\n$jscomp.typecheck.suspendChecking = false;\n\n\n/**\n * Log and possibly format the run-time type check warning. This\n * function is customized at compile-time.\n *\n * @param {string} warning the warning to log.\n * @param {*} expr the faulty expression.\n */\n$jscomp.typecheck.log = function(warning, expr) {};\n\n/**\n * Checks that the given expression matches one of the given checkers,\n * logging if not, and returning the expression regardless.\n *\n * @param {*} expr the expression to check.\n * @param {!Array} checkers the checkers to\n * use in checking, one of these has to match for checking to succeed.\n * @return {*} the given expression back.\n */\n$jscomp.typecheck.checkType = function(expr, checkers) {\n if ($jscomp.typecheck.suspendChecking) {\n return expr;\n }\n $jscomp.typecheck.suspendChecking = true;\n\n for (var i = 0; i < checkers.length; i++) {\n var checker = checkers[i];\n var ok = checker.check(expr);\n if (ok) {\n $jscomp.typecheck.suspendChecking = false;\n return expr;\n }\n }\n\n var warning = $jscomp.typecheck.prettify_(expr) + ' not in ' +\n checkers.join(' ');\n\n $jscomp.typecheck.log(warning, expr);\n\n $jscomp.typecheck.suspendChecking = false;\n return expr;\n};\n\n\n/**\n * Prettify the given expression for printing.\n *\n * @param {*} expr the expression.\n * @return {string} a string representation of the given expression.\n * @private\n */\n$jscomp.typecheck.prettify_ = function(expr) {\n var className = $jscomp.typecheck.getClassName_(expr);\n if (className) {\n return className;\n }\n try {\n return String(expr);\n }\n catch (e) {}\n return '';\n};\n\n/**\n * Gets the class name if the given expression is an object.\n *\n * @param {*} expr the expression.\n * @return {string|undefined} the class name or undefined if the\n * expression is not an object.\n * @private\n * @suppress {strictMissingProperties}\n */\n$jscomp.typecheck.getClassName_ = function(expr) {\n var className = void 0;\n if (typeof expr == 'object' && expr && expr.constructor) {\n className = expr.constructor.name;\n if (!className) {\n var funNameRe = /function (.{1,})\\(/;\n var m = (funNameRe).exec(expr.constructor.toString());\n className = m && m.length > 1 ? m[1] : void 0;\n }\n }\n return className;\n};\n\n/**\n * Interface for all checkers.\n *\n * @interface\n */\n$jscomp.typecheck.Checker = function() {};\n\n\n/**\n * Checks the given expression.\n *\n * @param {*} expr the expression to check.\n * @return {boolean} whether the given expression matches this checker.\n */\n$jscomp.typecheck.Checker.prototype.check = function(expr) {};\n\n\n\n/**\n * A class for all value checkers, except the null checker.\n *\n * @param {string} type the value type (e.g. 'number') of this checker.\n * @constructor\n * @implements {$jscomp.typecheck.Checker}\n * @private\n */\n$jscomp.typecheck.ValueChecker_ = function(type) {\n /**\n * The value type of this checker.\n * @type {string}\n * @private\n */\n this.type_ = type;\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ValueChecker_.prototype.check = function(expr) {\n return typeof(expr) == this.type_;\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ValueChecker_.prototype.toString = function() {\n return 'value(' + this.type_ + ')';\n};\n\n\n\n/**\n * A checker class for null values.\n *\n * @constructor\n * @implements {$jscomp.typecheck.Checker}\n * @private\n */\n$jscomp.typecheck.NullChecker_ = function() {};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.NullChecker_.prototype.check = function(expr) {\n return expr === null;\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.NullChecker_.prototype.toString = function() {\n return 'value(null)';\n};\n\n\n/**\n * A checker class for a class defined in externs, including built-in\n * JS types.\n *\n *

If the class type is undefined, then checking is suspended to\n * avoid spurious warnings. This is necessary because some externs\n * types are not defined in all browsers. For example, Window is not\n * defined Chrome, as window has the type DOMWindow.\n *\n *

Another subtlety is that a built-in type may be referenced in a\n * different frame than the one in which it was created. This causes\n * instanceOf to return false even though the object is of the correct\n * type. We work around this by checking as many windows as possible,\n * redefining open on top and window to keep track of them.\n *\n * @param {string} className the name of the extern class to check.\n * @constructor\n * @implements {$jscomp.typecheck.Checker}\n * @private\n */\n$jscomp.typecheck.ExternClassChecker_ = function(className) {\n /**\n * The name of the extern class to check.\n * @type {string}\n * @private\n */\n this.className_ = className;\n};\n\n\n/**\n * A list of (hopefully all) open windows.\n *\n * @type {!Array}\n */\n$jscomp.typecheck.ExternClassChecker_.windows = [];\n\n\n/**\n * A list of the original open methods that have been redefined.\n *\n * @type {!Array}\n */\n$jscomp.typecheck.ExternClassChecker_.oldOpenFuns = [];\n\n\n/**\n * Redefines the open method on the given window, adding tracking.\n *\n * @param {!Window} win the window to track.\n * @suppress {uselessCode}\n */\n$jscomp.typecheck.ExternClassChecker_.trackOpenOnWindow = function(win) {\n // Declare the property we add to the window object.\n // NOTE: we add a declaration in a \"if (false) ...\" to ensure we\n // don't reference \"Window\" on platforms that don't have a global\n // Window object (node, service workers, etc).\n if (false) {\n /** @type {boolean} */\n Window.prototype.tracked;\n }\n\n if (win.tracked) {\n return;\n }\n\n win.tracked = true;\n\n var key = $jscomp.typecheck.ExternClassChecker_.oldOpenFuns.length;\n\n $jscomp.typecheck.ExternClassChecker_.oldOpenFuns.push(win.open);\n $jscomp.typecheck.ExternClassChecker_.windows.push(win);\n\n win.open = function() {\n var w = $jscomp.typecheck.ExternClassChecker_.oldOpenFuns[key].apply(\n this, arguments);\n $jscomp.typecheck.ExternClassChecker_.trackOpenOnWindow(w);\n return w;\n };\n};\n\n\n/**\n * Returns the global 'this' object. This will normally be the same as 'window'\n * but when running in a worker thread, the DOM is not available.\n *\n * This does not work when strict mode is enabled.\n *\n * @return {!Window}\n * @private\n */\n$jscomp.typecheck.ExternClassChecker_.getGlobalThis_ = function() {\n return (function() { return this; }).call(null);\n};\n\n\n// Install listeners on the global 'this' object.\n(function() {\n var globalThis = $jscomp.typecheck.ExternClassChecker_.getGlobalThis_();\n $jscomp.typecheck.ExternClassChecker_.trackOpenOnWindow(globalThis);\n\n var theTop = globalThis['top'];\n if (theTop) {\n $jscomp.typecheck.ExternClassChecker_.trackOpenOnWindow(theTop);\n }\n})();\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ExternClassChecker_.prototype.check = function(expr) {\n var classTypeDefined = [ false ];\n for (var i = 0; i < $jscomp.typecheck.ExternClassChecker_.windows.length;\n i++) {\n var w = $jscomp.typecheck.ExternClassChecker_.windows[i];\n if (this.checkWindow_(w, expr, classTypeDefined)) {\n return true;\n }\n }\n return !classTypeDefined[0];\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ExternClassChecker_.prototype.toString = function() {\n return 'ext_class(' + this.className_ + ')';\n};\n\n\n/**\n * Checks whether the given expression is an instance of this extern\n * class in this window or any of its frames and subframes.\n *\n * @param {!Window} w the window to start checking from.\n * @param {*} expr the expression to check.\n * @param {!Array} classTypeDefined a wrapped boolean\n * updated to indicate whether the class type was seen in any frame.\n * @return {boolean} true if the given expression is an instance of this class.\n * @private\n */\n$jscomp.typecheck.ExternClassChecker_.prototype.checkWindow_ =\n function(w, expr, classTypeDefined) {\n var classType = /** @type {function(new: ?)} */ (w[this.className_]);\n classTypeDefined[0] = classTypeDefined[0] || !!classType;\n if (classType && expr instanceof classType) {\n return true;\n }\n for (var i = 0; i < w.length; i++) {\n if (this.checkWindow_(w.frames[i], expr, classTypeDefined)) {\n return true;\n }\n }\n return false;\n};\n\n\n\n/**\n * A class for all checkers of user-defined classes.\n *\n * @param {string} className name of the class to check.\n * @constructor\n * @implements {$jscomp.typecheck.Checker}\n * @private\n */\n$jscomp.typecheck.ClassChecker_ = function(className) {\n\n /**\n * The name of the class to check.\n * @type {string}\n * @private\n */\n this.className_ = className;\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ClassChecker_.prototype.check = function(expr) {\n return !!(expr && expr['instance_of__' + this.className_]);\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ClassChecker_.prototype.toString = function() {\n return 'class(' + this.className_ + ')';\n};\n\n\n\n/**\n * A class for all checkers of user-defined interfaces.\n *\n * @param {string} interfaceName name of the interface to check.\n * @constructor\n * @implements {$jscomp.typecheck.Checker}\n * @private\n */\n$jscomp.typecheck.InterfaceChecker_ = function(interfaceName) {\n\n /**\n * The name of the interface to check.\n * @type {string}\n * @private\n */\n this.interfaceName_ = interfaceName;\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.InterfaceChecker_.prototype.check = function(expr) {\n return !!(expr && expr['implements__' + this.interfaceName_]);\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.InterfaceChecker_.prototype.toString = function() {\n return 'interface(' + this.interfaceName_ + ')';\n};\n\n\n\n/**\n * A checker for object types (possibly with non-standard prototype: might not\n * inherit from Object).\n *\n * @constructor\n * @implements {$jscomp.typecheck.Checker}\n * @private\n */\n$jscomp.typecheck.ObjectChecker_ = function() {};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ObjectChecker_.prototype.check = function(expr) {\n return (typeof(expr) == 'object' || typeof(expr) == 'function') && !!expr;\n};\n\n\n/** @inheritDoc */\n$jscomp.typecheck.ObjectChecker_.prototype.toString = function() {\n return 'value(object)';\n};\n\n\n\n/**\n * A checker for null values.\n *\n * @type {!$jscomp.typecheck.Checker} a checker.\n */\n$jscomp.typecheck.nullChecker = new $jscomp.typecheck.NullChecker_();\n\n\n/**\n * Creates a checker for the given value type (excluding the null type).\n *\n * @param {string} type the value type.\n * @return {!$jscomp.typecheck.Checker} a checker.\n */\n$jscomp.typecheck.valueChecker = function(type) {\n return new $jscomp.typecheck.ValueChecker_(type);\n};\n\n\n/**\n * Creates a checker for the given extern class name.\n *\n * @param {string} className the class name.\n * @return {!$jscomp.typecheck.Checker} a checker.\n */\n$jscomp.typecheck.externClassChecker = function(className) {\n return new $jscomp.typecheck.ExternClassChecker_(className);\n};\n\n\n/**\n * Creates a checker for the given user-defined class.\n *\n * @param {string} className the class name.\n * @return {!$jscomp.typecheck.Checker} a checker.\n */\n$jscomp.typecheck.classChecker = function(className) {\n return new $jscomp.typecheck.ClassChecker_(className);\n};\n\n\n/**\n * Creates a checker for the given user-defined interface.\n *\n * @param {string} interfaceName the interface name.\n * @return {!$jscomp.typecheck.Checker} a checker.\n */\n$jscomp.typecheck.interfaceChecker = function(interfaceName) {\n return new $jscomp.typecheck.InterfaceChecker_(interfaceName);\n};\n\n\n/**\n * A checker for objects.\n *\n * @type {!$jscomp.typecheck.Checker} a checker.\n */\n$jscomp.typecheck.objectChecker = new $jscomp.typecheck.ObjectChecker_();\n","js/util/checkstringargs.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require base';\n\n\n/**\n * Throws if the argument is a RegExp, or if thisArg is undefined.\n * @param {?} thisArg The 'this' arg, which must be defined.\n * @param {*} arg The first argument of the function, which mustn't be a RegExp.\n * @param {string} func Name of the function, for reporting.\n * @return {string} The thisArg, coerced to a string.\n * @suppress {reportUnknownTypes}\n */\n$jscomp.checkStringArgs = function(thisArg, arg, func) {\n if (thisArg == null) {\n throw new TypeError(\n \"The 'this' value for String.prototype.\" + func +\n ' must not be null or undefined');\n }\n if (arg instanceof RegExp) {\n throw new TypeError(\n 'First argument to String.prototype.' + func +\n ' must not be a regular expression');\n }\n return thisArg + '';\n};\n","js/util/defineproperty.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Provides methods to polyfill native objects.\n * @suppress {reportUnknownTypes}\n */\n'require util/defines';\n\n\n/**\n * Polyfill for Object.defineProperty() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n *\n * Refuses to define properties on Array.prototype and Object.prototype,\n * since we can't make them non-enumerable and this messes up peoples' for\n * loops. Beyond this, we simply assign values and not worry\n * about enumerability or writeability.\n *\n * @type {(typeof Object.defineProperty)}\n * @suppress {reportUnknownTypes}\n */\n$jscomp.defineProperty =\n $jscomp.ASSUME_ES5 || typeof Object.defineProperties == 'function' ?\n Object.defineProperty :\n function(target, property, descriptor) {\n if (target == Array.prototype ||\n // b/155133192\n /** @type {?} */ (target) == Object.prototype) {\n return target;\n }\n\n /**\n * NOTE: This is currently never called with a descriptor outside\n * the control of the compiler. If we ever decide to polyfill either\n * Object.defineProperty or Reflect.defineProperty for ES3, we should\n * explicitly check for `get` or `set` on the descriptor and throw a\n * TypeError, since it's impossible to properly polyfill it.\n */\n target[property] = descriptor.value;\n return target;\n };\n","js/util/defines.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require base';\n\n\n/**\n * Whether to assume ES5 is available. This enables removing several\n * internal polyfills, which must otherwise be detected at runtime.\n * @define {boolean}\n */\n$jscomp.ASSUME_ES5 = false;\n\n/**\n * Whether to skip the conformance check and simply use the polyfill always.\n * @define {boolean}\n */\n$jscomp.ASSUME_NO_NATIVE_MAP = false;\n\n/**\n * Whether to skip the conformance check and simply use the polyfill always.\n * @define {boolean}\n */\n$jscomp.ASSUME_NO_NATIVE_SET = false;\n\n/**\n * Whether to provide an incorrect but tiny Math.fround polyfill that just\n * returns the number given. This is usually okay to do, particularly if\n * `Math.fround` is only used to allow the JavaScript engine to use faster\n * 32-bit float operations, but could cause problems if program logic is\n * dependent on floats being truncated consistently.\n * @define {boolean}\n */\n$jscomp.SIMPLE_FROUND_POLYFILL = false;\n\n/**\n * Whether to isolate all injected polyfills from global state. This is not\n * on by default, as it bloats code size, but is useful when code needs to\n * operate on untrusted third_party sites. It relies on a compiler pass to\n * rewrite potential polyfill accesses.\n * @define {boolean}\n */\n$jscomp.ISOLATE_POLYFILLS = false;\n","js/util/finddescriptor.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/reflect/getownpropertydescriptor';\n'require es6/reflect/getprototypeof';\n\n\n/**\n * Helper function to find a descriptor.\n * @param {!Object} target\n * @param {string} propertyKey\n * @return {!ObjectPropertyDescriptor|undefined}\n */\n$jscomp.findDescriptor = function(target, propertyKey) {\n var /** ?Object */ obj = target;\n while (obj) {\n var property = Reflect.getOwnPropertyDescriptor(obj, propertyKey);\n if (property) {\n return property;\n }\n obj = Reflect.getPrototypeOf(obj);\n }\n return undefined;\n};\n","js/util/findinternal.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Utility for Array methods that find elements.\n */\n'require base';\n\n// TODO(sdh): would be nice to template on the ARRAY type as well,\n// so that the third arg type of callback can be refined to be\n// exactly the same as the array type, but then there's no way to\n// enforce that it must, in fact, be an array.\n/**\n * Internal implementation of find.\n * @param {!IArrayLike} array\n * @param {function(this: THIS, VALUE, number, !IArrayLike): *} callback\n * @param {THIS} thisArg\n * @return {{i: number, v: (VALUE|undefined)}}\n * @template THIS, VALUE\n * @suppress {reportUnknownTypes}\n */\n$jscomp.findInternal = function(array, callback, thisArg) {\n if (array instanceof String) {\n array = /** @type {!IArrayLike} */ (String(array));\n }\n var len = array.length;\n for (var i = 0; i < len; i++) {\n var value = array[i];\n if (callback.call(thisArg, value, i, array)) return {i: i, v: value};\n }\n return {i: -1, v: void 0};\n};\n","js/util/global.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Runtime code to store the global object.\n * @suppress {uselessCode}\n */\n'require base';\n\n/**\n * Locate and return a reference to the global object.\n *\n * NOTE: This method is marked with `noinline`, because `RemoveUnusedCode` has\n * trouble removing the loop it contains if it gets inlined into the global\n * scope.\n * @param {?Object} passedInThis\n * @return {!Global} The global object.\n * @suppress {undefinedVars|reportUnknownTypes}\n * @noinline\n */\n$jscomp.getGlobal = function(passedInThis) {\n var possibleGlobals = [\n // Web Audio Worklets do not have any way to refer to their global object\n // other than `globalThis`.\n // This use of `globalThis` does not prevent removal of the `globalThis`\n // polyfill, because the usage is guarded by a typeof check.\n 'object' == typeof globalThis && globalThis,\n // Rhino (used by older Google Docs Script projects) has no `window` or\n // `self`, but `this` from the global scope is the global object. Also,\n // some GWT tests running on Rhino do have a `window` and `self` but, for\n // unknown reasons, see runtime exceptions when we return `window` instead\n // of `passedInThis`.\n // NOTE: If the compiler's output is wrapped in a strict-mode function,\n // this file's code won't actually be executing in global scope, so this\n // value will be undefined.\n passedInThis,\n // Browser windows always have `window`\n 'object' == typeof window && window,\n // WebWorkers have `self`\n 'object' == typeof self && self,\n // NodeJS has `global`\n 'object' == typeof global && global,\n ];\n for (var i = 0; i < possibleGlobals.length; ++i) {\n var maybeGlobal = possibleGlobals[i];\n // It can happen that an environment has, for example, both `global` and\n // `window` defined in the global scope, but one of them isn't actually\n // the global object, so check that it really seems to be the global object.\n // We use `Math` to check for this because it's only 4 characters long,\n // exists in all possible JS environments, and doesn't have the problematic\n // equality behavior of `NaN`.\n if (maybeGlobal && maybeGlobal['Math'] == Math) {\n return /** @type {!Global} */ (maybeGlobal);\n }\n }\n // Throw an exception if we cannot find the global object.\n // We have to be sneaky about it, otherwise the compiler will think this code\n // has a side effect (throwing an exception) that prevents it from being\n // removed, even when all usages of `$jscomp.global` get removed.\n // Casting through unknown is necessary to keep the compiler from rejecting\n // this code.\n return /** @type {!Global} */ (\n /** @type {?} */ ({\n valueOf: function() {\n throw new Error('Cannot find global object');\n }\n }.valueOf()));\n};\n\n\n/**\n * The global object.\n * @const {!Global}\n */\n$jscomp.global = $jscomp.getGlobal(this);\n","js/util/objectcreate.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Provides a partial internal polyfill for Object.create.\n */\n'require util/defines';\n\n\n/**\n * Polyfill for Object.create() method:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n *\n * Does not implement the second argument.\n * @param {!Object} prototype\n * @return {!Object}\n */\n$jscomp.objectCreate =\n ($jscomp.ASSUME_ES5 || typeof Object.create == 'function') ?\n Object.create :\n function(prototype) {\n /** @constructor */\n var ctor = function() {};\n ctor.prototype = prototype;\n return new ctor();\n };\n","js/util/owns.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require base';\n\n/**\n * Synonym for Object.prototype.hasOwnProperty.call(obj, prop).\n * @param {!Object} obj\n * @param {string} prop\n * @return {boolean}\n */\n$jscomp.owns = function(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n};\n","js/util/polyfill.js":"/*\n * Copyright 2016 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Provides methods to polyfill native objects.\n * @suppress {uselessCode}\n */\n'require util/defineproperty';\n'require util/defines';\n'require util/global';\n'require util/shouldpolyfill';\n\n/** @const {!Object} map from classes (Map) to polyfills*/\n$jscomp.polyfills = {};\n\n/** @const {!Object} */\n$jscomp.propertyToPolyfillSymbol = {};\n\n/** @const {string} */\n$jscomp.POLYFILL_PREFIX = '$jscp$';\n\n/**\n * Returns a polyfilled version of the given property if present, otherwise\n * returns the actual property.\n *\n * This is a variable instead of a $jscomp.* property to make it simpler for\n * the compiler to avoid prematurely deleting it during optimizations.\n *\n * @param {*} target the receiver for the property access, e.g. `my.str`\n * @param {string} key the name of the property, e.g. `includes`\n * @return {?} if a polyfill is present, that polyfill property. otherwise\n * the result of target[key]\n * @noinline prevent inlining so IsolatePolyfills can find this declaration.\n * @suppress {reportUnknownTypes}\n */\nvar $jscomp$lookupPolyfilledValue = function(target, key) {\n /** @const */\n var polyfilledKey = $jscomp.propertyToPolyfillSymbol[key];\n if (polyfilledKey == null) {\n return target[key];\n }\n\n // NOTE: this will throw if `target` is null or undefined.\n /** @const */\n var polyfill = target[polyfilledKey];\n\n // Checking `polyfill !== undefined` is sufficient because $jscomp.polyfill\n // never installs nullish polyfills. Otherwise we'd have to check something\n // like `key in target`.\n return polyfill !== undefined ? polyfill : target[key];\n};\n\n/**\n * @param {string} target Qualified name of the class or method to polyfill,\n * e.g. 'Array.prototype.includes' or 'Map'.\n * @param {?function(*): *} polyfill A function that takes the current browser\n * implementation of the target and returns an optional new polyfill\n * implementation. If null is returned, then no polyfill will be added. A\n * null argument for this parameter indicates that the function will not be\n * polyfilled, and is only useful for `build_polyfill_table.js` bookkeeping.\n * @param {string} fromLang The language level in which the target is expected\n * to already be present in the browser. The compiler requires that\n * `languageOut < fromLang` before injecting a polyfill (i.e. if the\n * specified output language already includes the feature then there's no\n * need to polyfill it).\n * @param {string} toLang The language level required by the polyfill\n * implementation. The compiler will issue an error if a polyfill is\n * required, but `languageOut < toLang`. Additionally, the\n * `build_polyfill_table.js` script audits the polyfill dependency tree to\n * ensure that no polyfill with a lower `toLang` depends on one with a\n * higher `toLang`.\n * @noinline\n * NOTE: We prevent inlining so RemoveUnusedPolyfills can always recognize this\n * call.\n */\n$jscomp.polyfill = function(target, polyfill, fromLang, toLang) {\n if (!polyfill) return;\n if ($jscomp.ISOLATE_POLYFILLS) {\n $jscomp.polyfillIsolated(target, polyfill, fromLang, toLang);\n } else {\n $jscomp.polyfillUnisolated(target, polyfill, fromLang, toLang);\n }\n};\n\n/**\n * @param {string} target Qualified name of the class or method to polyfill,\n * @param {function(*): *} polyfill A function that takes the current browser\n * implementation of the target and returns an optional new polyfill\n * implementation.\n * @param {string} fromLang The language level in which the target is expected\n * to already be present in the browser.\n * @param {string} toLang The language level required by the polyfill\n * implementation.\n * @suppress {reportUnknownTypes}\n * @see $jscomp.polyfill for more documentation\n */\n$jscomp.polyfillUnisolated = function(target, polyfill, fromLang, toLang) {\n var obj = $jscomp.global;\n var split = target.split('.');\n for (var i = 0; i < split.length - 1; i++) {\n var key = split[i];\n if (!(key in obj)) return;\n obj = obj[key];\n }\n var property = split[split.length - 1];\n var orig = obj[property];\n var impl = polyfill(orig);\n if (impl == orig || impl == null) return;\n $jscomp.defineProperty(\n obj, property, {configurable: true, writable: true, value: impl});\n};\n\n/**\n * Defines a polyfill for the given class or method under an obfuscated name.\n *\n * The main differences between this method and $jscomp.polyfillUnisolated are:\n * - classes are defined on $jscomp.polyfills, not window.\n * - methods (Array.prototype.includes) are defined on Array.prototype under\n * an obfuscated name Array.prototype.$jscp$includes or a Symbol, if native.\n * - this method installs our polyfill even when an existing implementation is\n * found, as it might be an untrusted polyfill. The exception is that if\n * Symbol is detected to be native, we assume any implementations of ES6\n * classes/methods are also native and not polyfills.\n *\n * @param {string} target Qualified name of the class or method to polyfill,\n * @param {function(*): *} polyfill A function that takes the current browser\n * implementation of the target and returns an optional new polyfill\n * implementation.\n * @param {string} fromLang The language level in which the target is expected\n * to already be present in the browser.\n * @param {string} toLang The language level required by the polyfill\n * implementation.\n * @suppress {reportUnknownTypes}\n * @see $jscomp.polyfill for more parameter documentation\n */\n$jscomp.polyfillIsolated = function(target, polyfill, fromLang, toLang) {\n var split = target.split('.');\n var isNativeClass = split.length === 1;\n var root = split[0];\n\n // Look up the parent object. For classes this is just $jscomp.global.\n // For methods/properties this may be a polyfill (Promise) or may a native\n // object (Array.prototype).\n var obj;\n if (!isNativeClass && root in $jscomp.polyfills) {\n // Handle Symbol.asyncIterator and Promise.prototype.finally\n obj = $jscomp.polyfills;\n } else {\n // Handle Promise, Array.of, and String.prototype.startsWith\n obj = $jscomp.global;\n }\n\n for (var i = 0; i < split.length - 1; i++) {\n var key = split[i];\n if (!(key in obj)) return;\n obj = obj[key];\n }\n\n var property = split[split.length - 1];\n // If Symbol is native and the target is in the ES6 spec, use the native imp.\n // We assume the method/class was not polyfilled since polyfills typically\n // back off in the presence of an existing implementation.\n var nativeImpl =\n $jscomp.IS_SYMBOL_NATIVE && fromLang === 'es6' ? obj[property] : null;\n var impl = polyfill(nativeImpl);\n\n if (impl == null) {\n return;\n }\n\n if (isNativeClass) {\n // Note: `impl` may be the actual native class instead of a\n // polyfill. Add it to $jscomp.polyfills anyway. The IsolatePolyfills pass\n // unconditionally replaces `Symbol` with `$jscomp.polyfills['Symbol']`.\n $jscomp.defineProperty(\n $jscomp.polyfills, property,\n {configurable: true, writable: true, value: impl});\n } else if (impl !== nativeImpl) {\n // Skip installing an obfuscated property if we have found a native version\n // of the method we're polyfilling. $jscomp$lookupPolyfilledValue will fall\n // back to the native version anyway.\n $jscomp.propertyToPolyfillSymbol[property] = $jscomp.IS_SYMBOL_NATIVE ?\n // use bracket access to avoid injecting the Symbol polyfill\n $jscomp.global['Symbol'](property) :\n $jscomp.POLYFILL_PREFIX + property;\n property = $jscomp.propertyToPolyfillSymbol[property];\n $jscomp.defineProperty(\n obj, property, {configurable: true, writable: true, value: impl});\n }\n};\n","js/util/reflectobject.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require base';\n\n/**\n * Definition for object reflection.\n *\n * Internal compiler version of closure library goog.reflect.object.\n *\n * Use this if you have an object literal whose keys need to have the same names\n * as the properties of some class even after they are renamed by the compiler.\n *\n * @param {?Object} type class, interface, or record\n * @param {T} object Object literal whose properties must be renamed\n * consistently with type\n * @return {T} The object literal.\n * @template T\n */\n$jscomp.reflectObject = function(type, object) {\n return object;\n};\n\n/**\n * Definition for object property reflection.\n *\n * Internal compiler version of closure library goog.reflect.objectProperty.\n *\n * Use this if you have a string that needs renamed as if it were an unquoted\n * property of a class.\n *\n * @param {string} propName\n * @param {?Object} type class, interface, or record\n * @return {string}\n */\n$jscomp.reflectProperty = function(propName, type) {\n return propName;\n};\n","js/util/shouldpolyfill.js":"/*\n * Copyright 2020 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Helpers to decide whether to trust existing implementations of\n * polyfilled methods.\n * @suppress {uselessCode} the requires are considered \"useless\"\n */\n\n'require util/defines';\n\n/**\n * @const {boolean} whether Symbol is implemented natively (i.e. is not a\n * polyfill)\n */\n$jscomp.IS_SYMBOL_NATIVE =\n typeof Symbol === 'function' && typeof Symbol('x') === 'symbol';\n\n/**\n * Whether code should use built-in versions of ES6 methods when available.\n *\n * @const {boolean}\n */\n$jscomp.TRUST_ES6_POLYFILLS =\n !$jscomp.ISOLATE_POLYFILLS || $jscomp.IS_SYMBOL_NATIVE;\n","js/util/stringpadding.js":"/*\n * Copyright 2017 The Closure Compiler Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'require es6/string/repeat';\n\n/**\n * Repeats the given string as necessary to reach the given length,\n * truncating any extra characters.\n * @param {string|undefined} padString\n * @param {number} padLength\n * @return {string}\n */\n$jscomp.stringPadding = function(padString, padLength) {\n var padding = padString !== undefined ? String(padString) : ' ';\n if (!(padLength > 0) || !padding) return '';\n var repeats = Math.ceil(padLength / padding.length);\n return padding.repeat(repeats).substring(0, padLength);\n};\n","js/polyfills.txt":"Array.from es6 es3 es6/array/from\nArray.of es6 es3 es6/array/of\nArray.prototype.copyWithin es6 es3 es6/array/copywithin\nArray.prototype.entries es6 es3 es6/array/entries\nArray.prototype.fill es6 es3 es6/array/fill\nArray.prototype.find es6 es3 es6/array/find\nArray.prototype.findIndex es6 es3 es6/array/findindex\nArray.prototype.flat es9 es5 es6/array/flat\nArray.prototype.flatMap es9 es5 es6/array/flatmap\nArray.prototype.includes es7 es3 es6/array/includes\nArray.prototype.keys es6 es3 es6/array/keys\nArray.prototype.values es8 es3 es6/array/values\nMap es6 es3 es6/map\nMath.acosh es6 es3 es6/math/acosh\nMath.asinh es6 es3 es6/math/asinh\nMath.atanh es6 es3 es6/math/atanh\nMath.cbrt es6 es3 es6/math/cbrt\nMath.clz32 es6 es3 es6/math/clz32\nMath.cosh es6 es3 es6/math/cosh\nMath.expm1 es6 es3 es6/math/expm1\nMath.fround es6 es3 es6/math/fround\nMath.hypot es6 es3 es6/math/hypot\nMath.imul es6 es3 es6/math/imul\nMath.log10 es6 es3 es6/math/log10\nMath.log1p es6 es3 es6/math/log1p\nMath.log2 es6 es3 es6/math/log2\nMath.sign es6 es3 es6/math/sign\nMath.sinh es6 es3 es6/math/sinh\nMath.tanh es6 es3 es6/math/tanh\nMath.trunc es6 es3 es6/math/trunc\nNumber.EPSILON es6 es3 es6/number/constants\nNumber.MAX_SAFE_INTEGER es6 es3 es6/number/constants\nNumber.MIN_SAFE_INTEGER es6 es3 es6/number/constants\nNumber.isFinite es6 es3 es6/number/isfinite\nNumber.isInteger es6 es3 es6/number/isinteger\nNumber.isNaN es6 es3 es6/number/isnan\nNumber.isSafeInteger es6 es3 es6/number/issafeinteger\nNumber.parseFloat es6 es3 es6/number/parsefloat\nNumber.parseInt es6 es3 es6/number/parseint\nObject.assign es6 es3 es6/object/assign\nObject.entries es8 es3 es6/object/entries\nObject.fromEntries es_2019 es3 es6/object/fromentries\nObject.getOwnPropertyDescriptors es8 es5 es6/object/getownpropertydescriptors\nObject.getOwnPropertySymbols es6 es5 es6/object/getownpropertysymbols\nObject.is es6 es3 es6/object/is\nObject.setPrototypeOf es6 es5 es6/object/setprototypeof\nObject.values es8 es3 es6/object/values\nPromise es6 es3 es6/promise/promise\nPromise.allSettled es_2020 es3 es6/promise/allSettled\nPromise.prototype.finally es9 es3 es6/promise/finally\nProxy es6 es6\nReflect es6 es3 es6/reflect/reflect\nReflect.apply es6 es3 es6/reflect/apply\nReflect.construct es6 es3 es6/reflect/construct\nReflect.defineProperty es6 es5 es6/reflect/defineproperty\nReflect.deleteProperty es6 es3 es6/reflect/deleteproperty\nReflect.get es6 es5 es6/reflect/get\nReflect.getOwnPropertyDescriptor es6 es5 es6/reflect/getownpropertydescriptor\nReflect.getPrototypeOf es6 es5 es6/reflect/getprototypeof\nReflect.has es6 es3 es6/reflect/has\nReflect.isExtensible es6 es3 es6/reflect/isextensible\nReflect.ownKeys es6 es5 es6/reflect/ownkeys\nReflect.preventExtensions es6 es3 es6/reflect/preventextensions\nReflect.set es6 es5 es6/reflect/set\nReflect.setPrototypeOf es6 es5 es6/reflect/setprototypeof\nSet es6 es3 es6/set\nString.fromCodePoint es6 es3 es6/string/fromcodepoint\nString.prototype.codePointAt es6 es3 es6/string/codepointat\nString.prototype.endsWith es6 es3 es6/string/endswith\nString.prototype.includes es6 es3 es6/string/includes\nString.prototype.matchAll es_2020 es3 es6/string/matchall\nString.prototype.normalize es6 es6\nString.prototype.padEnd es8 es3 es6/string/padend\nString.prototype.padStart es8 es3 es6/string/padstart\nString.prototype.repeat es6 es3 es6/string/repeat\nString.prototype.startsWith es6 es3 es6/string/startswith\nString.prototype.trimEnd es_2019 es3 es6/string/trimend\nString.prototype.trimLeft es_2019 es3 es6/string/trimstart\nString.prototype.trimRight es_2019 es3 es6/string/trimend\nString.prototype.trimStart es_2019 es3 es6/string/trimstart\nString.raw es6 es6\nSymbol es6 es3 es6/symbol\nSymbol.asyncIterator es9 es3 es6/symbol\nSymbol.iterator es6 es3 es6/symbol\nWeakMap es6 es3 es6/weakmap\nWeakSet es6 es3 es6/weakset\nglobalThis es_2020 es3 es6/globalthis\n","parsing/ParserConfig.properties":"# Copyright 2009 The Closure Compiler Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Configuration options for the Parser.\n#\n# Allows us to update the allowed JSDoc annotations independently of the\n# Compiler binary, so we can add new JSDoc annotations to old binaries.\n\n# The version of the compiler that we're currently building.\n# Should be formatted as:\n# Version# (Revision XXX)\ncompiler.version = ${compiler.version}\n\n# The datestamp of the compiler that we're currently building.\ncompiler.date = ${compiler.date}\n\n# A comma-delimited list.\n# Some of these are not used by JSCompiler, but appear in third-party JS code.\n# http://usejsdoc.org/\n# It's not strictly necessary for the natively-supported annotations to be\n# listed here, but it's nice to have them all in one place.\njsdoc.annotations =\\\n addon,\\\n alias,\\\n animations,\\\n appliesMixin,\\\n augments,\\\n author,\\\n base,\\\n borrows,\\\n bug,\\\n channel, \\\n class,\\\n classdesc,\\\n closurePrimitive,\\\n codepen,\\\n config,\\\n constructor,\\\n constructs,\\\n copyright,\\\n default,\\\n delegate,\\\n demo,\\\n deprecated,\\\n desc,\\\n description,\\\n dict,\\\n docsNotRequired,\\\n docs-private,\\\n element,\\\n enhance,\\\n enhanceable,\\\n enum,\\\n event,\\\n eventOf,\\\n eventType,\\\n example,\\\n exception,\\\n exec,\\\n export,\\\n exportDoc,\\\n exportInterface,\\\n expose,\\\n externs,\\\n field,\\\n file,\\\n fires,\\\n function,\\\n global,\\\n hassoydelcall,\\\n hassoydeltemplate,\\\n hideconstructor, \\\n id,\\\n idGenerator,\\\n ignore,\\\n inner,\\\n instance,\\\n kind,\\\n lends,\\\n link,\\\n meaning,\\\n member,\\\n memberOf,\\\n memberof,\\\n method,\\\n methodOf,\\\n mixes,\\\n mixin,\\\n modName,\\\n moddedBy,\\\n model,\\\n modifies,\\\n mods,\\\n module,\\\n multiElement,\\\n name,\\\n namespace,\\\n ngInject,\\\n ngdoc,\\\n nocompile,\\\n package,\\\n param,\\\n parent,\\\n pintomodule,\\\n preserveTry,\\\n priority,\\\n private,\\\n property,\\\n propertyOf,\\\n protected,\\\n provideGoog,\\\n pseudoElement,\\\n public,\\\n readonly,\\\n requirecss,\\\n requires,\\\n requireExtern,\\\n restrict,\\\n returns,\\\n scope,\\\n see,\\\n since,\\\n static,\\\n struct,\\\n summary,\\\n supported,\\\n this,\\\n throws,\\\n todo,\\\n transaction,\\\n tutorial,\\\n type,\\\n typedef,\\\n typeSummary,\\\n url,\\\n usage,\\\n version,\\\n virtual,\\\n visibility,\\\n wizSupportsSymbolicLookup,\\\n wizaction,\\\n wizmodule\n\n# Comma-delimited list of valid suppressions.\n# This should be a subset of the list of DiagnosticGroups.\njsdoc.suppressions =\\\n accessControls,\\\n checkDebuggerStatement,\\\n checkPrototypalTypes,\\\n checkRegExp,\\\n checkTypes,\\\n checkVars,\\\n closureDepMethodUsageChecks,\\\n const,\\\n constantProperty,\\\n deprecated,\\\n duplicate,\\\n es5Strict,\\\n externsValidation,\\\n extraProvide,\\\n extraRequire,\\\n globalThis,\\\n invalidCasts,\\\n legacyGoogScopeRequire,\\\n lateProvide,\\\n lintChecks,\\\n messageConventions,\\\n misplacedTypeAnnotation,\\\n missingOverride, \\\n missingPolyfill, \\\n missingProperties,\\\n missingProvide,\\\n missingRequire,\\\n missingReturn,\\\n missingSourcesWarnings,\\\n moduleLoad,\\\n nonStandardJsDocs,\\\n partialAlias,\\\n polymer,\\\n reportUnknownTypes,\\\n strictCheckTypes,\\\n strictMissingProperties,\\\n strictModuleDepCheck,\\\n strictPrimitiveOperators,\\\n suspiciousCode,\\\n transitionalSuspiciousCodeWarnings,\\\n undefinedNames,\\\n undefinedVars,\\\n underscore,\\\n unknownDefines,\\\n untranspilableFeatures,\\\n unusedLocalVariables,\\\n unusedPrivateMembers,\\\n useOfGoogProvide,\\\n uselessCode,\\\n visibility,\\\n with\n\n# A comma-delimited list of valid closure primitive ids.\n# This correspond to the ClosurePrimitive enum once normalized (see ClosurePrimitive.fromStringId)\njsdoc.primitives =\\\n asserts.fail,\\\n asserts.matchesReturn,\\\n asserts.truthy,\\\n\n# A comma-delimited list of reserved words that we should not rename variables\n# to. Used when an extension is released that steps on globals.\n# This prevents the compiler from renaming variables to these names, but not\n# from allowing externs for these names.\n#\n# i,j - common loop variables often overwritten by browser extensions\n# s – commonly defined by browser extensions when injecting scripts.\n# $j,$ - common jquery aliases often overwritten by browser extensions\n# o - overwritten by Norton Identity Protection's Chrome extension.\n# ga,_gaq - global variable names used by Google Analytics.\n# sun,java - May cause issues in older browsers with remnants of Java support.\n# XR - extern added by the webXR platform API.\n# TODO(tbreisacher): Remove 'ga' and '_gaq' if/when we enable\n# --isolation_mode=IIFE by default.\ncompiler.reserved.vars = i,j,s,$,$j,o,ga,_gaq,sun,XR,java\n","rhino/Messages.properties":"#\n# Default JavaScript messages file.\n#\n# ***** BEGIN LICENSE BLOCK *****\n# Version: MPL 1.1/GPL 2.0\n#\n# The contents of this file are subject to the Mozilla Public License Version\n# 1.1 (the \"License\"); you may not use this file except in compliance with\n# the License. You may obtain a copy of the License at\n# http://www.mozilla.org/MPL/\n#\n# Software distributed under the License is distributed on an \"AS IS\" basis,\n# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\n# for the specific language governing rights and limitations under the\n# License.\n#\n# The Original Code is Rhino code, released\n# May 6, 1999.\n#\n# The Initial Developer of the Original Code is\n# Netscape Communications Corporation.\n# Portions created by the Initial Developer are Copyright (C) 1997-1999\n# the Initial Developer. All Rights Reserved.\n#\n# Contributor(s):\n# Norris Boyd\n# Bob Jervis\n# Pascal-Louis Perez\n#\n# Alternatively, the contents of this file may be used under the terms of\n# the GNU General Public License Version 2 or later (the \"GPL\"), in which\n# case the provisions of the GPL are applicable instead of those above. If\n# you wish to allow use of your version of this file only under the terms of\n# the GPL and not to allow others to use your version of this file under the\n# MPL, indicate your decision by deleting the provisions above and replacing\n# them with the notice and other provisions required by the GPL. If you do\n# not delete the provisions above, a recipient may use your version of this\n# file under either the MPL or the GPL.\n#\n# ***** END LICENSE BLOCK *****\n\n# This is replaced during jar assembly from property string\n# and should not be translated\nimplementation.version = @IMPLEMENTATION.VERSION@\n\n#\n# To add JavaScript error messages for a particular locale, create a\n# new Messages_[locale].properties file, where [locale] is the Java\n# string abbreviation for that locale. For example, JavaScript\n# messages for the Polish locale should be located in\n# Messages_pl.properties, and messages for the Italian Swiss locale\n# should be located in Messages_it_CH.properties. Message properties\n# files should be accessible through the classpath under\n# org.mozilla.javascript.resources\n#\n# See:\n# java.util.ResourceBundle\n# java.text.MessageFormat\n#\n\n# SomeJavaClassWhereUsed\n\n# Codegen\nmsg.dup.parms =\\\n Duplicate parameter name \"{0}\".\n\nmsg.unexpected.eof =\\\n Unexpected end of file\n\nmsg.extra.trailing.comma =\\\n Trailing comma is not legal in an ECMA-262 object initializer\n\nmsg.end.annotation.expected =\\\n expected end of line or comment.\n\nmsg.bad.jsdoc.tag =\\\n illegal use of unknown JSDoc tag \"{0}\"; ignoring it\n\nmsg.bad.fileoverview.visibility.annotation =\\\n {0} visibility not allowed in @fileoverview block\n\nmsg.missing.variable.name =\\\n expecting a variable name in a @param tag.\n\nmsg.dup.variable.name =\\\n duplicate variable name \"{0}\"\n\nmsg.invalid.variable.name =\\\n invalid param name \"{0}\"\n\nmsg.jsdoc.incompat.type =\\\n type annotation incompatible with other annotations.\n\nmsg.jsdoc.type.syntax =\\\n type not recognized due to syntax error.\n\nmsg.jsdoc.name.syntax =\\\n name not recognized due to syntax error.\n\nmsg.jsdoc.override =\\\n extra @override/@inheritDoc tag.\n\nmsg.jsdoc.final =\\\n extra @final tag.\n\nmsg.jsdoc.extra.visibility=\\\n extra visibility tag\n\nmsg.jsdoc.idgen.duplicate =\\\n extra @idGenerator tag\n\nmsg.jsdoc.idgen.bad =\\\n malformed @idGenerator tag\n\nmsg.jsdoc.wizaction =\\\n extra @wizaction tag\n\nmsg.jsdoc.idgen.unknown =\\\n unknown @idGenerator parameter: {0}\n\nmsg.jsdoc.hidden =\\\n extra @hidden tag\n\nmsg.jsdoc.const =\\\n conflicting @const tag\n\nmsg.jsdoc.desc.extra =\\\n extra @desc tag\n\nmsg.jsdoc.meaning.extra =\\\n extra @meaning tag\n\nmsg.jsdoc.fileoverview.extra =\\\n extra @fileoverview tag\n\nmsg.jsdoc.lends.incompatible =\\\n @lends tag incompatible with other annotations.\n\nmsg.jsdoc.lends.missing =\\\n missing object name in @lends tag.\n\nmsg.jsdoc.closurePrimitive.extra =\\\n conflicting @closurePrimitive tag\n\nmsg.jsdoc.closurePrimitive.invalid =\\\n invalid id in @closurePrimitive tag.\n\nmsg.jsdoc.closurePrimitive.missing =\\\n missing id in @closurePrimitive tag.\n\nmsg.jsdoc.preserve.nobuilder =\\\n @preserve or @license annotation without file to associate it with\n\nmsg.jsdoc.missing.lc =\\\n missing opening '{'\n\nmsg.jsdoc.missing.lp =\\\n missing opening (\n\nmsg.jsdoc.missing.braces =\\\n Type annotations should have curly braces.\n\nmsg.jsdoc.unnecessary.braces =\\\n braces are not required here\n\nmsg.jsdoc.missing.rc =\\\n expected closing }\n\nmsg.jsdoc.missing.rp =\\\n missing closing )\n\nmsg.jsdoc.missing.gt =\\\n missing closing >\n\nmsg.jsdoc.missing.rb =\\\n missing closing ]\n\nmsg.jsdoc.missing.colon =\\\n expecting colon after this\n\nmsg.jsdoc.function.this =\\\n expecting this but {0} found\n\nmsg.jsdoc.function.newnotobject =\\\n constructed type must be an object type\n\nmsg.jsdoc.function.varargs =\\\n variable length argument must be last.\n\nmsg.jsdoc.type.union =\\\n union type element with bad syntax\n\nmsg.jsdoc.type.record.duplicate =\\\n Duplicate record field {0}.\n\nmsg.jsdoc.enum =\\\n conflicting @enum tag\n\nmsg.jsdoc.constructor =\\\n conflicting @constructor tag\n\nmsg.jsdoc.deprecated =\\\n extra @deprecated tag\n\nmsg.jsdoc.interface =\\\n extra @interface tag\n\nmsg.jsdoc.interface.constructor =\\\n cannot be both an interface and a constructor.\n\nmsg.jsdoc.record =\\\n conflicting @record tag.\n\nmsg.jsdoc.implements.duplicate =\\\n duplicate @implements tag.\n\nmsg.jsdoc.implements.extraqualifier =\\\n @implements/@extends requires a bare interface/record name without ! or ?.\n\nmsg.jsdoc.nosideeffects =\\\n conflicting @nosideeffects tag\n\nmsg.jsdoc.implicitcast =\\\n extra @implicitCast tag.\n\nmsg.jsdoc.this =\\\n conflicting @this tag\n\nmsg.jsdoc.this.object =\\\n @this must specify an object type\n\nmsg.jsdoc.type =\\\n conflicting @type tag\n\nmsg.jsdoc.define =\\\n conflicting @define tag\n\nmsg.jsdoc.define.badtype =\\\n @define tag only permits literal types\n\nmsg.jsdoc.extends =\\\n conflicting @extends tag\n\nmsg.jsdoc.extends.duplicate =\\\n duplicate @extends tag\n\nmsg.jsdoc.export =\\\n extra @export tag\n\nmsg.jsdoc.expose =\\\n extra @expose tag\n\nmsg.jsdoc.externs =\\\n extra @externs tag\n\nmsg.jsdoc.typesummary =\\\n extra @typeSummary tag\n\nmsg.jsdoc.nocompile =\\\n extra @nocompile tag\n\nmsg.jsdoc.nocollapse =\\\n extra @nocollapse tag\n\nmsg.jsdoc.noinline =\\\n extra @noinline tag\n\nmsg.jsdoc.seemissing =\\\n @see tag missing description\n\nmsg.jsdoc.authormissing =\\\n @author tag missing author\n\nmsg.jsdoc.versionmissing =\\\n @version tag missing version information\n\nmsg.jsdoc.extraversion =\\\n conflicting @version tag\n\nmsg.jsdoc.suppress =\\\n malformed @suppress tag\n\nmsg.jsdoc.suppress.unknown =\\\n unknown @suppress parameter: {0}\n\nmsg.jsdoc.modifies =\\\n malformed @modifies tag\n\nmsg.jsdoc.modifies.duplicate =\\\n conflicting @modifies tag\n\nmsg.jsdoc.modifies.unknown =\\\n unknown @modifies parameter: {0}\n\nmsg.jsdoc.polymerBehavior.extra =\\\n extra @polymerBehavior tag\n\nmsg.jsdoc.polymer.extra =\\\n extra @polymer tag\n\nmsg.jsdoc.customElement.extra =\\\n extra @customElement tag\n\nmsg.jsdoc.mixinClass.extra =\\\n extra @mixinClass tag\n\nmsg.jsdoc.mixinFunction.extra =\\\n extra @mixinFunction tag\n\nmsg.jsdoc.disposeparameter.missing =\\\n @disposes tag missing parameter name.\n\nmsg.jsdoc.disposeparameter.error =\\\n @disposes parameter unknown or parameter specified multiple times.\n\nmsg.jsdoc.nginject.extra =\\\n extra @ngInject tag\n\nmsg.no.type.name =\\\n expecting a type name.\n\n\nmsg.jsdoc.template.boundedgenerics.used =\\\n Bounded generic semantics are currently still in development\n\nmsg.jsdoc.template.name.missing =\\\n @template tag missing type name.\n\nmsg.jsdoc.template.name.redeclaration =\\\n Type name(s) for @template annotation declared twice.\n\nmsg.jsdoc.template.multipleDeclaration =\\\n Multiple template names cannot be declared with bounds or TTL.\n\nmsg.jsdoc.template.boundsWithTTL =\\\n Template types cannot combine bounds and TTL.\n\nmsg.jsdoc.template.typetransformation.missingDelimiter =\\\n Expected end delimiter for a type transformation.\n\nmsg.jsdoc.template.typetransformation.expressionMissing =\\\n Missing type transformation expression.\n\n\nmsg.jsdoc.typetransformation.invalid =\\\n Invalid {0}\n\nmsg.jsdoc.typetransformation.invalid.expression =\\\n Invalid {0} expression\n\nmsg.jsdoc.typetransformation.missing.param =\\\n Missing parameter in {0}\n\nmsg.jsdoc.typetransformation.extra.param =\\\n Found extra parameter in {0}\n\nmsg.jsdoc.typetransformation.invalid.inside =\\\n Invalid expression inside {0}\n\nmsg.jsdoc.import =\\\n Import in typedef is not supported."}